您的位置:新闻资讯 >文章内容
自动识别字符验证码--识别模型、标记、特征选择
来源:一点一滴的Beer 作者:admin 时间:2018-12-15 17:08:17

验证码如果不使用自动识别软件,想要实现自动识别字符验证码的方法比较麻烦,上文说到爬虫怎么突破验证码限制,在素材收集、处理、切割之后,还需要进行模型训练、标记,以及特征的选择,再进行测试。这种方法耗时比较久,可以尝试:

一、模型训练步骤

在前面的环节,已经完成了对单个图片的处理和分割了。后面就开始进行 识别模型 的训练了。

整个训练过程如下:

  1. 大量完成预处理并切割到原子级的图片素材准备

  2. 对素材图片进行人为分类,即:打标签

  3. 定义单张图片的识别特征

  4. 使用SVM训练模型对打了标签的特征文件进行训练,得到模型文件

二、素材准备

本文在训练阶段重新下载了同一模式的4数字的验证图片总计:3000张。然后对这3000张图片进行处理和切割,得到12000张原子级图片。

在这12000张图片中删除一些会影响训练和识别的强干扰的干扰素材,切割后的效果图如下:

自动识别字符验证码--识别模型、标记、特征选择

三、素材标记

由于本文使用的这种识别方法中,机器在最开始是不具备任何 数字的观念的。所以需要人为的对素材进行标识,告诉 机器什么样的图片的内容是 1……。

这个过程叫做 “标记”

具体打标签的方法是:为0~9每个数字建立一个目录,目录名称为相应数字(相当于标签);人为判定图片内容,并将图片拖到指定数字目录中;每个目录中存放100张左右的素材,一般情况下,标记的素材越多,那么训练出的模型的分辨能力和预测能力越强。例如本文中,标记素材为十多张的时候,对新的测试图片识别率基本为零,但是到达100张时,则可以达到近乎100%的识别率。

自动识别字符验证码--识别模型、标记、特征选择

四、特征选择

对于切割后的单个字符图片,像素级放大图如下:

自动识别字符验证码--识别模型、标记、特征选择

从宏观上看,不同的数字图片的本质就是将黑色按照一定规则填充在相应的像素点上,所以这些特征都是最后围绕像素点进行。

字符图片 宽6个像素,高10个像素 ,理论上可以最简单粗暴地可以定义出60个特征:60个像素点上面的像素值。但是显然这样高维度必然会造成过大的计算量,可以适当的降维。

通过查阅相应的文献 [2],给出另外一种简单粗暴的特征定义:

  1. 每行上黑色像素的个数,可以得到10个特征

  2. 每列上黑色像素的个数,可以得到6个特征

最后得到16维的一组特征,实现代码如下:

自动识别字符验证码--识别模型、标记、特征选择

然后就将图片素材特征化,按照 libSVM 指定的格式生成一组带特征值和标记值的向量文件。内容示例如下:

自动识别字符验证码--识别模型、标记、特征选择

说明如下:

  1. 第一列是标签列,即此图片人为标记值,后续还有其它数值1~9的标记

  2. 后面是16组特征值,冒号前面是索引号,后面是值

  3. 如果有1000张训练图片,那么会产生1000行的记录

五、模型训练测试

到这个阶段后,由于本文直接使用的是开源的 libSVM 方案,属于应用了,所以此处内容就比较简单的。只需要输入特征文件,然后输出模型文件即可。

主要代码如下:

自动识别字符验证码--识别模型、标记、特征选择

备注:生成的模型文件名称为 svm_model_file

训练生成模型后,需要使用 训练集 之外的全新的标记后的图片作为 测试集 来对模型进行测试。

本文中的测试实验如下:

  • 使用一组全部标记为8的21张图片来进行模型测试

  • 测试图片生成带标记的特征文件名称为 last_test_pix_xy_new.txt

在早期训练集样本只有每字符十几张图的时候,虽然对训练集样本有很好的区分度,但是对于新样本测试集基本没区分能力,识别基本是错误的。逐渐增加标记为8的训练集的样本后情况有了比较好的改观:

  1. 到60张左右的时候,正确率大概80%

  2. 到185张的时候,正确率基本上达到100%

以数字8的这种模型强化方法,继续强化对数字0~9中的其它数字的模型训练,最后可以达到对所有的数字的图片的识别率达到近乎 100%。在本文示例中基本上每个数字的训练集在100张左右时,就可以达到100%的识别率了。

模型测试代码如下

自动识别字符验证码--识别模型、标记、特征选择

至此,验证的识别工作算是完满结束。

六、完整识别流程

在前面的环节,验证码识别 的相关工具集都准备好了。然后对指定的网络上的动态验证码形成持续不断地识别,还需要另外写一点代码来组织这个流程,以形成稳定的黑盒的验证码识别接口。

主要步骤如下:

  1. 传入一组验证码图片

  2. 对图片进行预处理:去噪,二值等等

  3. 切割成4张有序的单字符图片

  4. 使用模型文件分别对4张图片进行识别

  5. 将识别结果拼接

  6. 返回识别结果

然后本文中,请求某网络验证码的http接口,获得验证码图片,识别出结果,以此结果作为名称保存此验证图片。效果如下:

自动识别字符验证码--识别模型、标记、特征选择

显然,已经达到几乎 100% 的识别率了。

在本算法没有做任何优化的情况下,在目前主流配置的PC机上运行此程序,可以实现200ms识别一个(很大的耗时来自网络请求的阻塞)。

关于爬虫怎么突破验证码限制,不管是使用自己识别软件,还是通过爬取数据,利用Python突破验证码限制,都证明验证码是可以突破的。虽然后者方法比较繁琐,但也可以进行优化,比如软件层次优化与硬件层次优化。


相关文章内容简介
在线咨询
微信公众号

微信公众号

回到顶部