近年来,机器学习变得越发火热,中国选手柯洁与AlphaGo的人机大战更是引发热议。目前,在图像识别和视觉分析研究中,卷积神经网络(CNN)技术的使用愈来愈多。Tensorflow 是由 Google 团队开发的神经网络模块,短短几年间, 就已经有不少次版本的更新。最近我也在自学Tensorflow,想经过卷积神经网络快速识别整块验证码(不分割字符)。期间也碰到许多问题,诸如软件安装,Tensorflow版本差别等。一开始学习tensorflow是盲目的,不知如何下手,网上的资料都比较单一,为了回报社会,让你们少走弯路,我将详细介绍整个过程。本教程所须要的完整材料,我都会放在这里,密码:5e91。限于我的水平,若有错误请指出!python
接下来我将介绍如何使用Python+Tensorflow的CNN技术快速识别验证码。在此以前,介绍咱们用到的工具:git
1. PyCharm社区版(python的IDE):写代码很是方便,安装第三方库(tensorflow 1.2.1)操做简单。windows
2. Python3:当我还在犹豫py2仍是py3的时候,tensorflow已能支持windows、py3了,而且python3表明将来,建议使用Python3。网络
3. Photoshop:用于验证码的分析和处理(在这里不须要你精通)。机器学习
本文将从如下几个方面来介绍:函数
验证码分析和处理—— tensorflow安装 —— 模型训练 —— 模型预测工具
网上搜索验证码识别可以获得不少教程,但大部分都是将验证码切割成单个字符训练,有时候 验证码字符大小不一或者发生重叠,切割验证码变得不适用。所以经过CNN技术将整块验证码进行识别,能使问题变得更加简单(如下操做对其余验证码分析有参考做用)。学习
在这里咱们选择模拟学习这样的验证码:测试
该验证码来源于这里(正如sci-hub网站所言”to remove all barriers in the way of science”,知识就该如此)。优化
原始的验证码
该验证码只由六位小写字母、噪点和干扰线组成,若是能去除噪点和干扰线,可以大大下降学习的难度。不少验证码的噪点和干扰线RGB值和字母的不一致,这个咱们能经过Photoshop来分析,使用颜色取样器工具,分别在图片噪点、干扰线、空白处和字母处点击得到RGB值,以下图:
颜色取样器得到RGB值
分析后发现,只要将图片二值化只保留字母,就能获得不错的输入图片:
处理后的图片
实现代码以下:
验证码处理代码
以上就是验证码处理方法,为了下面的分析方便,我将处理好的验证码打包放到这里,密码:5e91。
若是你查看了官方文档会发现提供了不少安装方式,可是仍是比较复杂。针对不一样的系统,不一样设备(CPU or GPU)都不同,我在这里选择用pycharm直接安装tensorflow很是好用,并且跟python版本兼容,不用考虑过多。打开pycharm,在菜单栏里flie-settings-project-project interpreter,选择python3 interpreter,
添加第三方库
而后点击+按钮,输入tensorflow,install package。
添加tensorflow库
至此,tensorflow就在电脑上安装好了,很是简单吧,我安装的时候版本是1.2.1。准备工做所有结束。
若是你对卷积神经网络或者Python代码实现还不熟悉,我推荐你先看看《tensorflow实战》黄文坚著这本书,比官方文档详细多。搞清楚代码如何实现后,再来看接下来的内容(毕竟我也是花了时间走弯路的)。
首先,咱们先输入验证码的信息备用,图片是114*450像素,最大有6个字母,每一个字母经过26个0或1表示,好比a表示成10000000000000000000000000
,b表示成01000000000000000000000000
,以此类推。
验证码信息
接下来定义一个函数,随机从训练集(3430张)中提取验证码图片,因为验证码通过我手动打标签(码了6小时),在这里只要获取验证码的名字和图片就够了,我默认放在"F:/captcha4/"
目录下,须要注意的是返回的图片是以矩阵的形式。
获取验证码名字和图片
接下来定义两个函数,将名字转变成向量,将向量转变成名字。
名字向量互转
生成一个训练batch,也就是采样的大小,默认一次采集64张验证码做为一次训练,须要注意经过get_name_and_image()
函数得到的image是一个含布尔值的矩阵,在这里经过1*(image.flatten())
函数转变成只含0和1的1行114*450列的矩阵。
采样batch
接下来定义卷积神经网络结构,咱们采用3个卷积层加1个全链接层的结构,在每一个卷积层中都选用2*2的最大池化层和dropout层,卷积核尺寸选择5*5。须要注意的是在全链接层中,咱们的图片114*450已经通过了3层池化层,也就是长宽都压缩了8倍,获得15*57大小。
卷积神经网络结构
结构创建好后就能够开始训练了,在这里选择的sigmoid_cross_entropy_with_logits()
交叉熵来比较loss,用adam优化器来优化。输出每一步的loss值,每100步,输出一次准确率。在这里我调节当准确率达到99%后,结束训练。须要注意的是,keep_prob = 0.5
,这个参数控制着过拟合,当咱们机器学习速度过快的时候,能够减少该值,让机器遗忘的多一点(像人同样,记得多不必定好,哈哈)。
训练模型
训练完成后,你应该会获得以下几个文件。在这里我花了将近9个小时跑了1800步,达到99.5%的准确率。输出文件的详细介绍参考这里。
模型输出文件
咱们的模型训练成功后,咱们就要检验一下该模型的预测水平,在这里咱们首先要把train_crack_captcha_cnn()
函数注释掉,而后再定义一个预测模型的函数crack_captcha()
,须要注意为了从预测集中抽数据,这里的get_name_and_image()
函数调用"F:/captcha5/"
目录下的10张预测图片。
更改到预测集文件夹
从预测集中随机预测10次
预测结果以下:
预测结果对比
通过比较,我发现10张预测的能有4张准确,这还有待改进,可是总体上仍是达到了个人要求。毕竟训练集的准确率有99.5%。若是我调低keep_prob
的值,增长样本量,增长卷积层,最后的预测效果应该会更好。完整代码详见
总之,经过上面这个教程,只是教你们如何经过tensorflow的CNN技术处理整块验证码,你们能够尝试着用其余验证码试试,可是样本量越多越好。
首先本文教你们如何简单处理验证码,而后介绍了tensorflow的快速安装方式,最后经过实现了CNN下整块验证码的识别,训练集准确率达到99.5%,测试集准确率在40%左右。若是调低keep_prob的值,增长样本量,增长卷积层,最后的预测效果应该会更好。
但愿你们之后在tensorflow的学习道路中少点阻碍!!!