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

近年来,机器学习变得愈加火热,中国选手柯洁与AlphaGo的人机大战更是引起热议。目前,在图像识别和视觉分析研究中,卷积神经网络(CNN)技术的使用越来越多。Tensorflow 是由 Google 团队开发的神经网络模块,短短几年间, 就已经有很多次版本的更新。最近我也在自学Tensorflow,想通过卷积神经网络快速识别整块验证码(不分割字符)。期间也碰到许多问题,诸如软件安装,Tensorflow版本差异等。一开始学习tensorflow是盲目的,不知如何下手,网上的资料都比较单一,为了回报社会,让大家少走弯路,我将详细介绍整个过程。本教程所需要的完整材料,我都会放在这里。限于个人水平,如有错误请指出!

接下来我将介绍如何使用Python+Tensorflow的CNN技术快速识别验证码。在此之前,介绍我们用到的工具:

1. PyCharm社区版(python的IDE):写代码非常方便,安装第三方库(tensorflow 1.2.1)操作简单。

2. Python3:当我还在犹豫py2还是py3的时候,tensorflow已能支持windows、py3了,并且python3代表未来,建议使用Python3。

3. Photoshop:用于验证码的分析和处理(在这里不需要你精通)。

本文将从以下几个方面来介绍:

验证码分析和处理—— tensorflow安装 —— 模型训练 —— 模型预测

01

验证码分析和处理

网上搜索验证码识别能够得到很多教程,但大部分都是将验证码切割成单个字符训练,有时候 验证码字符大小不一或者发生重叠,切割验证码变得不适用。因此通过CNN技术将整块验证码进行识别,能使问题变得更加简单(以下操作对其他验证码分析有参考作用)。

在这里我们选择模拟学习这样的验证码:

该验证码来源于这里(正如sci-hub网站所言"to remove all barriers in the way of science",知识就该如此)。

原始的验证码

该验证码只由六位小写字母、噪点和干扰线组成,如果能去除噪点和干扰线,能够大大降低学习的难度。很多验证码的噪点和干扰线RGB值和字母的不一致,这个我们能通过Photoshop来分析,使用颜色取样器工具,分别在图片噪点、干扰线、空白处和字母处点击获得RGB值,如下图:

颜色取样器获得RGB值

分析后发现,只要将图片二值化只保留字母,就能得到不错的输入图片:

处理后的图片

实现代码如下:

验证码处理代码

以上就是验证码处理方法,为了下面的分析方便,我将处理好的验证码打包放到这里。

02

tensorflow安装

如果你查看了官方文档会发现提供了很多安装方式,但是还是比较复杂。针对不同的系统,不同设备(CPU or GPU)都不一样,我在这里选择用pycharm直接安装tensorflow非常好用,而且跟python版本兼容,不用考虑过多。打开pycharm,在菜单栏里flie-settings-project-project interpreter,选择python3 interpreter,

添加第三方库

然后点击+按钮,输入tensorflow,install package。

添加tensorflow库

至此,tensorflow就在电脑上安装好了,非常简单吧,我安装的时候版本是1.2.1。准备工作全部结束。

03

模型训练

如果你对卷积神经网络或者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%的准确率。输出文件的详细介绍参考这里。

模型输出文件

04

模型预测

我们的模型训练成功后,我们就要检验一下该模型的预测水平,在这里我们首先要把train_crack_captcha_cnn()函数注释掉,然后再定义一个预测模型的函数crack_captcha(),需要注意为了从预测集中抽数据,这里的get_name_and_image()函数调用"F:/captcha5/"目录下的10张预测图片。

更改到预测集文件夹

从预测集中随机预测10次

预测结果如下:

预测结果对比

经过比较,我发现10张预测的能有4张准确,这还有待改进,但是整体上还是达到了我的要求。毕竟训练集的准确率有99.5%。如果我调低keep_prob的值,增加样本量,增加卷积层,最后的预测效果应该会更好。

总之,通过上面这个教程,只是教大家如何通过tensorflow的CNN技术处理整块验证码,大家可以尝试着用其他验证码试试,但是样本量越多越好。

05

总结

首先本文教大家如何简单处理验证码,然后介绍了tensorflow的快速安装方式,最后通过实现了CNN下整块验证码的识别,训练集准确率达到99.5%,测试集准确率在40%左右。如果调低keep_prob的值,增加样本量,增加卷积层,最后的预测效果应该会更好。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信技能树

蛋白质数据库及其结构预测攻略

包含三大蛋白质序列数据库,Swiss-Prot,TrEMBL 和PIR,分为三个层次: 第一层叫UniParc,收录了所有UniProt 数据库子库中的蛋白质序...

1084
来自专栏机器学习算法与Python学习

自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在对文本做数据分析时,一大半的...

4024
来自专栏null的专栏

MATLAB技巧——imshow多张图片

本专题整理一些工作学习中使用到的一些MATLAB的技巧。 1、单个图片的显示 在MATLAB中,可以使用函数imshow展示图片,如手写体库MNIST的图: ?...

2916
来自专栏大数据文摘

手把手丨输验证码输到崩溃?教你15分钟黑掉全球最流行的验证码插件

1001
来自专栏企鹅号快讯

12306看了会沉默,国外大神利用机器学习15分钟破解网站验证码!

网站登录验证码的存在一直让人感到不爽,因为输错一个字往往就意味着账号密码什么的就得重新再输一遍。更有甚者(如12306网站),仅仅验证码一道工序就把人整到怀疑人...

3678
来自专栏华章科技

数据挖掘:手把手教你做文本挖掘

文本挖掘指的是从文本数据中获取有价值的信息和知识,它是数据挖掘中的一种方法。文本挖掘中最重要最基本的应用是实现文本的分类和聚类,前者是有监督的挖掘算法,后者是无...

342
来自专栏AI研习社

25 行 Python 代码就能实现人脸识别?这篇文章告诉你详情

首先,在阅读本文之前,需要注意以下几点: 建议先读一遍本文再跑代码——你需要理解这些代码是干什么的。成功跑一遍不是目的,能够举一反三、在新任务上找出 bug 才...

3617
来自专栏段石石的专栏

使用 TensorFlow 做机器学习第一篇

TensorFlow被人所知是作为DeepLearning的一个框架,但随着TF.Learn的越来越成熟,TensorFlow在机器学习上也开始发力,做了一些很...

4K2
来自专栏机器之心

仅需15分钟,使用OpenCV+Keras轻松破解验证码

3389
来自专栏向治洪

基于OpenCV的跳一跳外挂实现原理

最近,微信跳一跳小游戏迅速走红并且在朋友圈刷屏,游戏的规则很简单,就是控制一个小矮子再各个墩子上跳来跳去。由于游戏比较简单,一时间大家都玩起来了,这也带动了一些...

2668

扫描关注云+社区