CNN进行简单验证码识别小记

1.背景

由于一些需求,根据查阅的资料做了这方面的一点工作和研究,也是对在其他人的基础上做了点适合自己需求的改进。

如果有人看到有什么错误的地方请帮忙指正下,谢谢大佬们~

2.基本工具

开发工具:pycharm

框架和包:python3.6,tensorflow,PIL,numpy,flask等

3.基本流程

整个基本流程就是:

1 . 数据清洗获得质量比较高的训练数据

2 . 构建CNN进行特征提取生成模型

3 . 模型测试

4 . 构建http服务

4.数据集

数据集可以去自己生成,有对应的python包可以很快生成验证码,也可以用其他方式去生成。我这里是根据需求爬的一些验证码,筛选大多数做训练集,小部分做测试集。

验证码图片如下:

数据集中验证码对应的真实数字,作为图片的名字来存放:

5.数据清洗

在这里数据清洗简单分为两步来做

(1)降维

降维即将数据维度从高维变成低维,这样方便之后的训练。对于验证码识别工作来说,验证码图片的颜色并没有任何意义,只会增加计算复杂度。因此,这里我们首先对图片进行二置化。

当然还要其他很多方法

(2)去噪

去噪即去除图片中干扰目标的那些数据。对于验证码来说,其中的干扰线,边框之类的就属于干扰因子,因此需要想办法去干扰线,去边框。

当然这些去噪的方法都是根据训练数据来制定的,不同情况方法不会完全一样

根据验证码中各个字符的关联程度可以选择切分还是不切分,如果字符连接程度比较高的话,就将验证码图片作为一个整体去训练,如果没有连接,那么可以将验证码切分成一个个字符去训练,这样的话训练的速度和效果理论上应该更好一点。

(3)其他

cnn在图像大小是2的倍数时性能最高, 如果你用的图像大小不是2的倍数,可以在图像边缘补无用像素。

清洗过的图片如下:

6.构建CNN训练模型

完成数据清洗的工作之后,需要开始构建CNN来训练模型,这也分为几步:

(1)将验证码的名字与向量进行互转

这样做的目的同样是为了方便矩阵计算

(2)生成训练batch

卷积神经网络中一般有卷积层,全连接层和池化层。这里就是为了生成CNN络中的卷积层,我觉得也就是为了将一些相关的特征聚合起来,这些可以参考CNN的一些相关资料。

(3)定义CNN结构

定义CNN结构中,采用3个卷积层加1个全连接层的结构,在每个卷积层中都选用2* 2的最大池化层和dropout层,卷积核尺寸选择3* 3。需要注意的是在全连接层中,我们的图片25* 90已经经过了3层池化层,也就是长宽都压缩了8倍,得到4* 12大小。

(4)训练模型

这里损失函数使用的是tf中的sigmoid_cross_entropy_with_logits()方法。

keep_prob = 0.45,这个参数控制着过拟合,当机器学习速度过快的时候,可以减小该值,让机器遗忘的多一点。

使用CNN训练模型最好使用GPU机器来跑快一点,我用GPU机器跑几千个训练集,大概也就10来分钟

生成的模型如下:

7.模型测试

使用CNN生成的模型跑测试集看模型的效果

8.部署使用

做这个是为了要用的,对于其他语言或者系统来调用这个python脚本比较低效,因此构建一个简单的http服务是相对比较快捷高效的方式。这里使用flask框架构建了一个简单的http服务以便使用。

9.总结

其实大部分代码都是从网上找的,这里只是根据需要和特定需求进行相应的拼凑改进。另外感觉即使是应用机器学习的算法也是需要对算法有比较深的理解的,不然怎么调参都不知道。

另外在服务器上离线搭tf环境也是蛮痛苦的zzzz~

10.参考

使用Python+Tensorflow的CNN技术快速识别验证码

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190105G17OW900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券