iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用TensorFlow2识别验证码
  • 173
分享到

如何使用TensorFlow2识别验证码

2023-06-15 10:06:23 173人浏览 安东尼
摘要

这篇文章主要介绍如何使用Tensorflow2识别验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水

这篇文章主要介绍如何使用Tensorflow2识别验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。

图片是5个字母的单词,可以包含数字。这些图像应用了噪声(模糊和一条线)。它们是200 x 50 PNG。我们的任务是尝试制作光学字符识别算法的模型。

如何使用TensorFlow2识别验证码

在数据集中存在的验证码png图片,对应的标签就是图片的名字。

import osimport numpy as npimport pandas as pdimport cv2import matplotlib.pyplot as pltimport seaborn as sns# imgaug 图片数据增强import imgaug.augmenters as iaaimport tensorflow as tf# Conv2D MaxPooling2D Dropout Flatten Dense BN  GAPfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Layer, BatchNORMalization, GlobalAveragePooling2D from tensorflow.keras.optimizers import Adamfrom tensorflow.keras import Model, Input from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau# 图片处理器from tensorflow.keras.preprocessing.image import ImageDataGeneratorimport plotly.express as pximport plotly.graph_objects as Goimport plotly.offline as pyopyo.init_notebook_mode()

对数据进行一个简单的分析,统计图像中大约出现了什么样的符号。

# 数据路径DIR = '../input/captcha-version-2-images/samples/samples'# 存储验证码的标签captcha_list = []characters = {}for captcha in os.listdir(DIR):    captcha_list.append(captcha)    # 每张验证码的captcha_code    captcha_code = captcha.split(".")[0]    for i in captcha_code:        # 遍历captcha_code         characters[i] = characters.get(i, 0) +1symbols = list(characters.keys())len_symbols = len(symbols)print(f'图像中只使用了{len_symbols}符号')plt.bar(*zip(*characters.items()))plt.title('Frequency of symbols')plt.show()

如何使用TensorFlow2识别验证码

如何提取图像的数据建立X,y??

# 如何提取图像 建立 model  X 的shape  1070 * 50 * 200 * 1 # y的shape 5 * 1070 * 19 for i, captcha in enumerate(captcha_list):    captcha_code = captcha.split('.')[0]    # cv2.IMREAD_GRAYSCALE 灰度图    captcha_cv2 = cv2.imread(os.path.join(DIR, captcha),cv2.IMREAD_GRAYSCALE)    # 缩放    captcha_cv2 = captcha_cv2 / 255.0    # print(captcha_cv2.shape) (50, 200)     # 将captcha_cv2的(50, 200) 切换成(50, 200, 1)    captcha_cv2 = np.reshape(captcha_cv2, img_shape)    # (5,19)    targs = np.zeros((len_captcha, len_symbols))        for a, b in enumerate(captcha_code):        targs[a, symbols.index(b)] = 1    X[i] = captcha_cv2    y[:, i] = targsprint("shape of X:", X.shape)print("shape of y:", y.shape)

输出如下

print("shape of X:", X.shape)
print("shape of y:", y.shape)

通过Numpy中random 随机选择数据,划分训练集和测试

# 生成随机数from numpy.random import default_rngrng = default_rng(seed=1)test_numbers = rng.choice(1070, size=int(1070*0.3), replace=False)X_test = X[test_numbers]X_full = np.delete(X, test_numbers,0)y_test = y[:,test_numbers]y_full = np.delete(y, test_numbers,1)val_numbers = rng.choice(int(1070*0.7), size=int(1070*0.3), replace=False)X_val = X_full[val_numbers]X_train = np.delete(X_full, val_numbers,0)y_val = y_full[:,val_numbers]y_train = np.delete(y_full, val_numbers,1)

在此验证码数据中,容易出现过拟合的现象,你可能会想到添加更多的新数据、 添加正则项等, 但这里使用数据增强的方法,特别是对于机器视觉的任务,数据增强技术尤为重要。

常用的数据增强操作:imgaug库。imgaug是提供了各种图像增强操作的pythonhttps://GitHub.com/aleju/imgaug

imgaug几乎包含了所有主流的数据增强的图像处理操作, 增强方法详见github

# Sequential(C, R) 尺寸增加了5倍,# 选取一系列子增强器C作用于每张图片的位置,第二个参数表示是否对每个batch的图片应用不同顺序的Augmenter list     # rotate=(-8, 8)  旋转# iaa.CropAndPad  截取(crop)或者填充(pad),填充时,被填充区域为黑色。# px: 想要crop(negative values)的或者pad(positive values)的像素点。# (top, right, bottom, left)# 当pad_mode=constant的时候选择填充的值aug =iaa.Sequential([iaa.CropAndPad(    px=((0, 10), (0, 35), (0, 10), (0, 35)),    pad_mode=['edge'],    pad_cval=1),iaa.Rotate(rotate=(-8,8))])X_aug_train = Noney_aug_train = y_trainfor i in range(40):    X_aug = aug(images = X_train)    if X_aug_train is not None:        X_aug_train = np.concatenate([X_aug_train, X_aug], axis = 0)        y_aug_train = np.concatenate([y_aug_train, y_train], axis = 1)    else:        X_aug_train = X_aug

让我们看看一些数据增强的训练图像。

fig, ax = plt.subplots(nrows=2, ncols =5, figsize = (16,16))for i in range(10):    index = np.random.randint(X_aug_train.shape[0])    ax[i//5][i%5].imshow(X_aug_train[index],cmap='gray')

如何使用TensorFlow2识别验证码

如何使用TensorFlow2识别验证码

这次使用函数式api创建模型,函数式API是创建模型的另一种方式,它具有更多的灵活性,包括创建更为复杂的模型。

需要定义inputsoutputs

#函数式API模型创建captcha = Input(shape=(50,200,channels))x = Conv2D(32, (5,5),padding='valid',activation='relu')(captcha)x = MaxPooling2D((2,2),padding='same')(x)x = Conv2D(64, (3,3),padding='same',activation='relu')(x)x = MaxPooling2D((2,2),padding='same')(x)x = Conv2D(128, (3,3),padding='same',activation='relu')(x)maxpool = MaxPooling2D((2,2),padding='same')(x)outputs = []for i in range(5):    x = Conv2D(256, (3,3),padding='same',activation='relu')(maxpool)    x = MaxPooling2D((2,2),padding='same')(x)    x = Flatten()(x)    x = Dropout(0.5)(x)    x = BatchNormalization()(x)    x = Dense(64, activation='relu')(x)    x = Dropout(0.5)(x)    x = BatchNormalization()(x)    x = Dense(len_symbols , activation='softmax' , name=f'char_{i+1}')(x)    outputs.append(x)    model = Model(inputs = captcha , outputs=outputs)# ReduceLROnPlateau更新学习率reduce_lr = ReduceLROnPlateau(patience =3, factor = 0.5,verbose = 1)model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.0005), metrics=["accuracy"])# EarlyStopping用于提前停止训练的callbacks。具体地,可以达到当训练集上的loss不在减小earlystopping = EarlyStopping(monitor ="val_loss",                               mode ="min", patience = 10,                              min_delta = 1e-4,                             restore_best_weights = True) history = model.fit(X_train, [y_train[i] for i in range(5)], batch_size=32, epochs=30, verbose=1, validation_data = (X_val, [y_val[i] for i in range(5)]), callbacks =[earlystopping,reduce_lr])

如何使用TensorFlow2识别验证码

如何使用TensorFlow2识别验证码

如何使用TensorFlow2识别验证码

下面对model进行一个测试和评估。

score = model.evaluate(X_test,[y_test[0], y_test[1], y_test[2], y_test[3], y_test[4]],verbose=1)metrics = ['loss','char_1_loss', 'char_2_loss', 'char_3_loss', 'char_4_loss', 'char_5_loss', 'char_1_acc', 'char_2_acc', 'char_3_acc', 'char_4_acc', 'char_5_acc']for i,j in zip(metrics, score):    print(f'{i}: {j}')

具体输出如下:

11/11 [==============================] - 0s 11ms/step - loss: 0.7246 - char_1_loss: 0.0682 - char_2_loss: 0.1066 - char_3_loss: 0.2730 - char_4_loss: 0.2636 - char_5_loss: 0.0132 - char_1_accuracy: 0.9844 - char_2_accuracy: 0.9657 - char_3_accuracy: 0.9408 - char_4_accuracy: 0.9626 - char_5_accuracy: 0.9938
loss: 0.7246273756027222
char_1_loss: 0.06818050146102905
char_2_loss: 0.10664034634828568
char_3_loss: 0.27299806475639343
char_4_loss: 0.26359987258911133
char_5_loss: 0.013208594173192978
char_1_acc: 0.9844236969947815
char_2_acc: 0.9657320976257324
char_3_acc: 0.940809965133667
char_4_acc: 0.9626168012619019
char_5_acc: 0.9937694668769836

字母1到字母5的精确值都大于

绘制loss和score

metrics_df = pd.DataFrame(history.history)columns = [col for col in metrics_df.columns if 'loss' in col and len(col)>8]fig = px.line(metrics_df, y = columns)fig.show()

如何使用TensorFlow2识别验证码

plt.figure(figsize=(15,8))plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train', 'val'], loc='upper right',prop={'size': 10})plt.show()

如何使用TensorFlow2识别验证码

# 预测数据def predict(captcha):    captcha = np.reshape(captcha , (1, 50,200,channels))    result = model.predict(captcha)    result = np.reshape(result ,(5,len_symbols))    # 取出最大预测中的输出    label = ''.join([symbols[np.argmax(i)] for i in result])    return label    predict(X_test[2])# 25277

下面预测所有的数据

actual_pred = []for i in range(X_test.shape[0]):    actual = ''.join([symbols[i] for i in (np.argmax(y_test[:, i],axis=1))])    pred =  predict(X_test[i])    actual_pred.append((actual, pred))print(actal_pred[:10])

输出如下:

[('n4b4m', 'n4b4m'), ('42nxy', '42nxy'), ('25257', '25277'), ('cewnm', 'cewnm'), ('w46ep', 'w46ep'), ('cdcb3', 'edcb3'), ('8gf7n', '8gf7n'), ('nny5e', 'nny5e'), ('gm2c2', 'gm2c2'), ('g7fmc', 'g7fmc')]

sameCount = 0diffCount = 0letterDiff = {i:0 for i in range(5)}incorrectness = {i:0 for i in range(1,6)}for real, pred in actual_pred:    # 预测和输出相同    if real == pred:        sameCount += 1    else:        # 失败        diffCount += 1        # 遍历        incorrectnessPoint = 0        for i in range(5):            if real[i] != pred[i]:                letterDiff[i] += 1                incorrectnessPoint += 1        incorrectness[incorrectnessPoint] += 1x = ['True predicted', 'False predicted']y = [sameCount, diffCount]fig = go.Figure(data=[go.Bar(x = x, y = y)])fig.show()

在预测数据中,一共有287个数据预测正确。

如何使用TensorFlow2识别验证码

在这里,我们可以看到出现错误到底是哪一个index。

x1 = ["Character " + str(x) for x in range(1, 6)]    fig = go.Figure(data=[go.Bar(x = x1, y = list(letterDiff.values()))])fig.show()

如何使用TensorFlow2识别验证码

为了计算每个单词的错误数,绘制相关的条形图。

x2 = [str(x) + " incorrect" for x in incorrectness.keys()]y2 = list(incorrectness.values())fig = go.Figure(data=[go.Bar(x = x2, y = y2)])fig.show()

如何使用TensorFlow2识别验证码

下面绘制错误的验证码图像,并标准正确和错误的区别。

fig, ax = plt.subplots(nrows = 8, ncols=4,figsize = (16,20))count = 0for i, (actual , pred) in enumerate(actual_pred):    if actual != pred:        img = X_test[i]        try:            ax[count//4][count%4].imshow(img, cmap = 'gray')            ax[count//4][count%4].title.set_text(pred + ' - ' + actual)            count += 1        except:            pass

如何使用TensorFlow2识别验证码

如何使用TensorFlow2识别验证码

如何使用TensorFlow2识别验证码

以上是“如何使用TensorFlow2识别验证码”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用TensorFlow2识别验证码

本文链接: https://www.lsjlt.com/news/279961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用TensorFlow2识别验证码
    这篇文章主要介绍如何使用TensorFlow2识别验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水...
    99+
    2023-06-15
  • 教你使用TensorFlow2识别验证码
    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。 数据集来源:https://www.kaggl...
    99+
    2024-04-02
  • 如何使用Python实现极验验证码识别验证码
    这篇“如何使用Python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验...
    99+
    2023-07-05
  • Python通用验证码识别OCR库之ddddocr验证码识别
    目录前言传统验证码滑动验证码文字点选验证码总结前言 相信做自动化测试的同学一定不可忽视的问题就是验证码,他几乎是一个网站登录的标配,当然,我一般是不建议在这上面浪费时间去做识别的。 ...
    99+
    2024-04-02
  • 如何用三行Python代码实现验证码识别
    这篇文章主要介绍了如何用三行Python代码实现验证码识别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用三行Python代码实现验证码识别文章都会有所收获,下面我们一起来看看吧。源码如下:调试:输出:关于...
    99+
    2023-06-04
  • python简单验证码识别
    在学习python通过接口自动登录网站时,用户名密码、cookies、headers都好解决但是在碰到验证码这个时就有点棘手了;于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的贴这里解决不了; 以上两张为网站的上...
    99+
    2023-01-31
    验证码 简单 python
  • python 验证码识别库pytesse
    笔者环境 centos7 python3 pytesseract只是tesseract-ocr的一种实现接口。所以要先安装tesseract-ocr(大名鼎鼎的开源的OCR识别引擎)。   依赖安装 yum install-y auto...
    99+
    2023-01-30
    验证码 python pytesse
  • Python通用验证码识别OCR库怎么使用
    本篇内容主要讲解“Python通用验证码识别OCR库怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python通用验证码识别OCR库怎么使用”吧!传统验证码传统验证就是数字、字母、汉字等...
    99+
    2023-06-30
  • 如何用python识别滑块验证码中的缺口
    目录一、缺口识别 1.读取图片 2.识别图片边缘 3.缺口匹配 二、完整代码 验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、行为验证等。随着...
    99+
    2024-04-02
  • Python教学|Python验证码识别
    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 计算验证码 滑块验证码 识图验证码 语音验证码 这篇博客主要写的就是识图验证码,识别的是简...
    99+
    2023-09-01
    python opencv 开发语言
  • Java使用J4L识别验证码的操作方法
    1、首先要下载j4l的相应文件和jar 下载地址:http://www.java4less.com/ocrtools/ocrtools.phpinfo=download 百度网盘下载...
    99+
    2024-04-02
  • python如何实现腾讯滑块验证码识别
    小编给大家分享一下python如何实现腾讯滑块验证码识别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2...
    99+
    2023-06-14
  • 爬虫Python验证码识别入门
    目录爬虫Python验证码识别 1、批量下载验证码图片2、识别代码看看效果 3、折腾降噪、去干扰爬虫Python验证码识别 前言: 二值化、普通降噪、8邻域降...
    99+
    2024-04-02
  • Python+Pillow+Pytesseract实现验证码识别
    目录一、环境配置二、验证码识别实例1实例2实例3昨天十行代码实现文字识别,感觉怎样,是不是很爽 今天咋们继续利用pillow和pytesseract来实现验证码的识别 一、环境配置 ...
    99+
    2024-04-02
  • Python通用验证码识别OCR库ddddocr的安装使用
    Python通用验证码识别OCR库ddddocr的安装使用 一、前言二、Python安装(Python版本必须>=3.8)三、安装ddddocr3.1 解决ssl module 的问题3.1....
    99+
    2023-09-11
    python linux 开发语言
  • 如何利用Tensorflow2进行猫狗分类识别
    目录前言数据集获取文件解压将文件分为训练集与验证集绘图查看模型建立神经网络模型模型编译数据预处理模型训练运行模型可视化中间表示评估模型精度与损失值总结前言 本文参照了大佬Andrew...
    99+
    2024-04-02
  • PHP验证码识别的示例分析
    这篇文章主要介绍PHP验证码识别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,...
    99+
    2023-06-14
  • Python做简单的验证码识别(ocr)
    1、环境:系统:XPPython版本:2.7.52、所需文件:(1)、pillow地址:https://pypi.python.org/pypi/Pillow/(2)、tesseract地址:https://github.com/tesse...
    99+
    2023-01-31
    验证码 简单 Python
  • Python使用Cv2模块识别验证码的操作方法
    目录业务需求需求分析代码一结果分析 代码二代码模块结果呈现总结经验 参考文献业务需求       &n...
    99+
    2023-01-03
    Python Cv2验证码识别 Python 验证码识别 Python Cv2验证码
  • 怎么使用python识别滑块验证码中的缺口
    这篇文章将为大家详细讲解有关怎么使用python识别滑块验证码中的缺口,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作