ResNet网络识别验证码实战练习——高准确率的机器学习模型

简介

使用Python+Tensorflow的CNN技术快速识别验证码一文中,我们使用了3层简单的CNN卷积神经网络完成了验证码的识别,准确率不是特别高。虽然ResNet网络经常使用,但是一直没有时间来测试之前的验证码识别的项目。于是,我花了一下午的时间从头到尾梳理了这个项目:ResNet网络识别验证码实战练习——高准确率的机器学习模型。在本文中,我将会详细地介绍如何处理图片制作tfrecord格式文件以及搭建训练、预测模型,一路实现高准确率的机器学习模型。

运行环境:

  • Python 3.6.5
  • TensorFlow 1.8.0(GPU版本)

图片处理

我直接使用先前的验证码做测试,毕竟花了6个小时码出来的验证码(3430张)。原始的验证码是这样的:

《ResNet网络识别验证码实战练习——高准确率的机器学习模型》

二值化处理后,得到如下的图形:

《ResNet网络识别验证码实战练习——高准确率的机器学习模型》

处理过程见前文。

图片resize

我们今天的项目就是基于处理后的验证码开始的。由于使用的是slim框架中的ResNet50网络,要求输入大小为 224*224*3 ,需要事先对图片大小进行统一修改,方便后面的操作。

在这里需要注意几点:原来的图片是 114*450 大小的,要变成 224*224*3 大小,相当于多加了一个维度,在第三个维度上的值都是一样的;图片矩阵一定要改成 uint8 格式,表示像素点范围0-255之间。转换完成后就变成下图这样:

《ResNet网络识别验证码实战练习——高准确率的机器学习模型》

虽然部分拉伸了图片,但是对机器学习来说可以接受。

tfrecord格式

为了提高机器学习的效率,需要构建队列模式来减少机器读取数据的等待时间。TensorFlow提供了tfrecord格式文件,结合队列模式能够方便数据的读取操作。在resize验证码图片之后,再将其转换成tfrecord格式文件。

我们以每1000张图片制作一个tfrecord文件,我们把图片的像素矩阵和图片的标签都做成了二进制的数据流,存入tfrecord文件中。最后得到的tfrecord文件如下所示:

《ResNet网络识别验证码实战练习——高准确率的机器学习模型》

训练模型

做好了tfrecord文件后,接下来的任务就是搭建训练模型,其中包括读取tfrecord文件、构建队列模式、构建ResNet网络等。

首先定义读取tfrecord文件的函数:

filename就是每个tfrecord的地址,因为我们是以二进制流存入tfrecord文件的,当从文件中读取原来的数据的时候,需要指定数据格式和大小。在这里我们对图片矩阵进行归一化。

接下来我们在主函数中定义队列和模型部分:

构建队列使用的是随机顺序队列,使用 resnet_v2_50 模型。在这里使用了线程来管理队列,每20步输出一次loss值,每100步输出一次准确率,每20000步保存一次模型。这里选择 batch_size_ = 2 ,个人测试后觉得不错的经验值。最后,按照整个流程训练了14万步停止。

这部分完整代码如下:

注:加上 config = tf.ConfigProto() 和 config.gpu_options.allow_growth = True 后能够提高GPU的利用率,最后我们计算程序运行的时间。

预测模型

我们分别搭建两个预测模型来展开这部分:一个模型来预测咱们训练的3430张图片,看模型学习后的准确率如何;另一个模型来预测样本外的10张验证码图片,来检测我们模型的泛化能力。

预测训练集

因为是预测训练集,所以这里的队列不再是随机打乱顺序,而是使用了顺序读取 tf.train.batch ,最终按照14万步模型,训练模型的准确率为0.9915,如果进一步训练,准确率还会更高。

预测测试集

对于测试集,我提供了10张样本外的验证码图片,由于测试集数量比较少,就不需要构建tfrecord文件。

得到的结果如下:

《ResNet网络识别验证码实战练习——高准确率的机器学习模型》

咱们实现了100%的准确率!!!比之前的预测结果高了很多。

总结

本文介绍了如何处理验证码图片制作tfrecord格式文件构建训练和预测模型。使用ResNet网络识别验证码图片,实现了非常高的准确率。可见ResNet网络的普适性和效果都是非常好的。本文代码放在我的github,所有代码和模型全部放到这里,密码:f3k7。涉及到细节的部分本文并没有作过多的介绍,默认你有一定的TensorFlow基础,如有问题请在下面留言。

点赞
  1. 搬瓦工说道:

    学习了
    感谢分享

  2. arr说道:

    你好,我训练了后train_acc 一下子就1.0辽,预测里出来的都是一样的结果~

    1. admin说道:

      检查下代码吧,有可能输入数据不对

  3. arr说道:

    你好能私个联系方式么,我改成了4*(26+26+10)的验证码识别。batch为什么用2呢,我用了128越训练越不行了~想能不能方便和你交流下

    1. admin说道:

      batch的方法本来就是通过小批量的样本去进行迭代,这里需要对整个batch集进行梯度求导,可以看成是在高纬度上求导,batch太大带来的问题是收敛比较慢,我暂不清楚你训练了多久时间。小batch是我测出来比较理想的方式,至于为什么这么小,我猜可能跟这类型的数据集有关系。

  4. arr说道:

    你好能给个联系方式嘛,我是上一个提问者,我设置了batch5效果挺好的,batch128训练效果就越来越不行了。不知道是啥原因~能跟你进一步交流嘛~

发表评论

电子邮件地址不会被公开。 必填项已用*标注

5 + 11 =