真实干货:训练自己的验证码识别模型(秘)

Posted 衍金征信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真实干货:训练自己的验证码识别模型(秘)相关的知识,希望对你有一定的参考价值。

验证码相信大家都遇到过,从传统的中英文验证码、汉字的验证码等这些传统的验证码,到国内独特的验证码机制,比如汉字的翻转与汉字输入的验证码,到了现代的点选验证码,滑动验证码,滑块拼接验证码等。验证码越来越人性化与便捷化,但是这对于有破解验证码这方面需要的童鞋来说确实比较头疼。今天小编就手把手教大家利用开源神经网络项目实现传统数英验证码的识别。
         第一步肯定是先安装依赖的环境,本文使用到的环境是python2.7TensorFlowPycharmPILpython图像处理包,这些环境的安装都有相关的文章可以参考,本文就不再累述了。

第二步是寻找合适的项目进行训练,GitHub上有很多相关的项目实现,这里小编安利一个github开源项目PatrickLib/captcha_recognize

第三步就是具体实现了:

  1.         首先去获取训练样本,样本的获取方式有两种,一种是对接打码平台,第二种是通过验证码生成程序自动生成样本,本文使用的是第二种方式,生成了6万张样本验证码,其中5万验证码为训练集,5000张为验证集,5000张为测试集,如下图:

验证码的命名格式为“验证码真实值_num验证码序号”,小编生成的验证码格式使用了复杂模式,干扰线与噪点较明显,部分验证码可能人眼难以识别,这更加能考验模型的识别能力。

2.        修改程序的配置文件config.py

真实干货:训练自己的验证码识别模型(秘)


 


修改图片宽高为生成样本图片的实际值,以及验证码可能出现的字符,比如纯数字验证在CHAR_SETS只需要填写为012345678,本文中使用的是区分大小写的字母与数字的组合验证码,所以使用图中的配置。

3.        将验证码进行序列化,转化为计算机能识别的格式,修改训练集图片路径并运行captcha_input.py将训练集图片转化为矩阵形式,其中包括图片各个像素点的RGB颜色代码与验证码的真实值信息。

到这基本将所有的准备工作做完了,下面开始真正的训练了。

4.        首先我们看看captcha_model.py文件,这个文件为模型的核心:

真实干货:训练自己的验证码识别模型(秘)


第一部分代码定义了卷积层、最大值池化、初始化权重、bias的初始化值,使用的都是较为经典的初始化值,并且定义了padding的模式为SAME来减少图片在卷积过程中的信息丢失问题。另外可以根据实际情况修改训练设备,小编暂时没有GPU设备,于是选择cpu作为训练设备。

真实干货:训练自己的验证码识别模型(秘)



第二部分代码为模型的核心代码,由代码可知模型使用了4层卷积层与1softmax输出层的组合,使用的loss函数为交叉熵损失函数(Cross Entropy Loss),交叉熵越低,就证明由算法所产生的策略最接近最优策略,也间接证明我们算法所算出的非真实分布越接近真实分布。也可以看到用TensorFlow实现神经网络确实比较方便。模型实现层仅占代码量的不到5%,可以看到在一个模型的建立中,数据获取与数据预处理其实是占了90%以上的精力的。

5.        配置完文件与了解模型之后,下面我们开始训练模型,启动模型训练程序:

真实干货:训练自己的验证码识别模型(秘)



卷积神经网络每完成一次反向传播为一个step10000次训练之前为每100次存储一次模型权重文件,超过10000次则每10000次存储一次模型权重文件,因为我们选择的是交叉熵损失函数,loss值越小代表拟合效果越好,但是为了模型更好的复用性,建议不要训练太长时间,当损失函数低于0.1左右的时候停止训练,避免过拟合问题。

6.        验证模型效果,在训练了17000step的时候loss达到了预期值,小编停止了模型,并使用5000个验证集对模型效果进行验证,每100个为一个batch,效果如下图:



本图为样本对比图,前列是原始验证码图片名称,后列为模型识别结果,可以看到模型结果与图片名称中的真实值基本相符,下面我们对模型整体识别率进行计算:



可以看到每100个准确率基本为100%99%,总体识别率达到了99.6%。因为本次小编使用的是较难识别的验证码,人眼识别率可能也不足80%,能取得如此识别率已经较好。同时小编也做过实验,本模型在难度稍低的验证码可以达到99.99%的识别率。

本文仅介绍了对4位数英验证码的破解,同时本模型可以适用于多位数英验证码,不限位数的验证码识别。随着大数据时代的到来,多数公司对越来越重视数据安全性,出现了越来越多的更加复杂的验证码,甚至有些平台已经推出行为验证验证码,小编在后续也会带来更多种类的验证码以及其对应解决办法。


以上是关于真实干货:训练自己的验证码识别模型(秘)的主要内容,如果未能解决你的问题,请参考以下文章

训练自己的 Tesseract LSTM模型用于识别验证码

手把手教你用 CNN 识别验证码(干货!建议收藏) | 第12天

scikit-learn训练验证码识别模型

Kaggle+SCF端到端验证码识别从训练到部署

验证码是怎么被机器识别的?Keras+CNN模型验证码识别详解

将验证码识别功能集成到现有的爬虫框架