使用Python+Tensorflow的CNN技术快速识别验证码_LeadAI学院的博客-程序员秘密

北京 上海巡回站 | NVIDIA DLI深度学习培训
2018年1月26/1月12日
NVIDIA 深度学习学院 带你快速进入火热的DL领域
阅读全文                                                 
>



正文共2929个字,17张图,预计阅读时间:8分钟。


近年来,机器学习变得愈加火热,中国选手柯洁与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的值,增加样本量,增加卷积层,最后的预测效果应该会更好。


希望大家以后在tensorflow的学习道路中少点阻碍!!!


原文链接:https://www.jianshu.com/p/26ff7b9075a1


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leadai/article/details/78918735

智能推荐

STM32 MX Cube 学习笔记 03 - USART配置_usartreceive_idle_Le__destin的博客-程序员秘密

STM32 MX Cube 学习笔记 03- USART配置1.运行环境 (1)PC OS:win10; (2)MX Cube version:V5.1; (3)环境搭建,设置请参考第几节2.引脚定义 在前节已经配置好系统时钟、调试接口和导出工程设置的基础上,我们来开始串口的发送与接收配置。若有需要,文件获取: 云盘(密钥:ebwd )。在接口选项(...

关于pycharm写爬虫出现ModuleNotFoundError: No module named 'requests'_qq_43126760的博客-程序员秘密

关于pycharm写爬虫出现ModuleNotFoundError: No module named ‘requests’解决方法:cmd到python安装目录下输入命令:pip install request。然而我的问题并没有解决,于是继续探索,过程见下图,file-settings…-porject interpreter点右边的加号,搜索栏里“requests”,然后安装问题解...

matlab提取plot曲线数据并储存,matlab提取图片中曲线的数据Word版_谭俊云的博客-程序员秘密

《matlab提取图片中曲线的数据Word版》由会员分享,可在线阅读,更多相关《matlab提取图片中曲线的数据Word版(5页珍藏版)》请在人人文库网上搜索。1、传播优秀Word版文档 ,希望对您有帮助,可双击去除!Clf 为:清除figure窗口中的内容,并不关闭figure窗口;Figure 为:打开一个新的figure窗口;Close 为:关闭一个figure窗口;Close all 为:...

【HDU】-1181-变形课(DFS)_Bear1997的博客-程序员秘密

变形课Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 21412    Accepted Submission(s): 7721Problem Description呃......变形课上Harry碰到了一

c语言 逆波兰式输入 计算器程序_郭小猫的博客-程序员秘密

#include#include#include#define MAXOP 100#define NUMBER '0'int getop(char []) ;void push(double) ;double pop(void) ;/*逆波兰式输入计算器程序*/ main(){ char s[MAXOP] ; int type ; double op2 ; wh

layui下拉框选中_苦命书生的博客-程序员秘密

layui 下拉框根据数据状态选中列表值先定义一个下拉框以及列表值在数据绑定时做一下处理即可注:value要与数据状态相一致,在此我用数字定义数据的状态。

随便推点

html 自动获取屏幕分辨率,HTML5教程 如何获取手机屏幕分辨率和浏览器分辨率_宣博的博客-程序员秘密

本篇教程探讨了HTML5教程 如何获取手机屏幕分辨率和浏览器分辨率,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 。<在使用CSS3的中有如下类似代码Html代码@mediascreenand(max-width:480px){……}意思是在最大宽度为480px的设备上应用{}里面的样式。这里的width,注意是手机浏览器的分辨率,而不是手机设备的屏幕分辨...

Pandas使用一(DataFrame创建,csv、exl、sql读取写入)_qq_33799246的博客-程序员秘密

Pandas操作的数据类型为DataFrame, shape函数得到大小.创建,读取,保存数据1. 创建DataFrame元祖创建,只能创建一列,DataFrame可以看作多个元祖组合而成,不能指定列名,name为整个表的名字,index参数为行名,作为索引pd.Series([30, 35, 40], index=['2015 Sales', '2016 Sales', '2017 ...

bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)_weixin_30915275的博客-程序员秘密

1076: [SCOI2008]奖励关Time Limit:10 SecMemory Limit:128 MBSubmit:2989Solved:1557[Submit][Status][Discuss]Description  你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出...

爬white-space: nowrap换行的坑_兄弟连勇闯天涯的博客-程序员秘密

今天在做scroll-view滑动时遇到了这个不换行的坑。要实现的效果是这样子的。我的一条数据以一块状的型式展示的。我要做向左滑动删除的功能。整体效果实现了。可是我的商品名称之前是设置过自动换行并且超出以省略号代替的。可是用了这个white-space: nowrap。我的商品名称就不能换行了。我晕了。只好去百度一下。百度说可以用强制换行的单词。结果真的不好用啊。我都给它加到行内样...

黑马程序员--- 学习笔记(第十三天)_yingui_的博客-程序员秘密

String类字符串是一个特殊的对象字符串是一个初始化就不能被修改对象String s="abc"'//s是一个类类型变量,"abc"是一个对象//字符串最大的特点:一但初始化就不可以被改变字符串既是既是一个对象,也是一个常量Sring重写了equals方法,用来判断字符串内容是否相等String s1="ab";Stri

编译安装error while loading shared libraries: libpython3.8.so.1.0: cannot open shared object fi_毛毛是一只狗的博客-程序员秘密

以下命令仅供参考适当修改./python3.8: error while loading shared libraries: libpython3.8.so.1.0: cannot open shared object file: No such file or directoryfind / -name libpython3.8.so.1.0cp /usr/local/python3/lib/libpython3.6m.so.1.0 /usr/lib/或者 cp /usr/local/py

推荐文章

热门文章

相关标签