使用Python+Tensorflow的CNN技术快速识别验证码
正文共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基础
使用Python+Tensorflow的CNN技术快速识别验证码相关推荐
- cnn验证码识别代码_中文项目:快速识别验证码,CNN也能为爬虫保驾护航
原标题:中文项目:快速识别验证码,CNN也能为爬虫保驾护航 机器之心专栏 作者:Nick Li 随着卷积网络的推广,现在有各种各样的快捷应用,例如识别验证码和数学公式等.本文介绍了一个便捷的验证码识别 ...
- python tensorflow pytorch 深度学习 车牌识别
车牌识别相关资料收集整理 1.License Plate Detection with RetinaFace 链接:https://github.com/zeusees/License-Plate-D ...
- Python通过selenium与ddddocr库识别验证码的爆破小脚本
最近正在学习python,本菜狗突发奇想用python写一个实现识别验证码的爆破小脚本 说干就干,于是上网查找了一下python中有没有验证码识别的库 然后就发现了ddddocr这个库,于是想通过dd ...
- 个人笔记本上win10+yolov3+python+tensorflow+keras训练自己的识别模型
本文是在前人的很多基础上自己整理所得,借鉴的资料见文末链接,感谢各位大神的无私分享. 对于yolo小白,参阅博文学习:keras-yolov3目标检测详解--适合新手, (环境配置.用官方权重识别自己 ...
- 车牌识别系统三:python+tensorflow实现车牌字符的识别
字符识别 在前面两篇博客中分别介绍了车牌定位以及字符分割的代码实现,那么在这篇文章中,我主要想介绍一下车牌识别系统的最后一个模块:字符识别.字符识别可以说是整个系统的核心部分了,这一部分可以有很多中实 ...
- Python搭建Keras CNN模型破解网站验证码
在本项目中,将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的验证码.验证码如下: 利用Keras可以快速方便地搭建CNN模型,本项目搭建的CNN模型如下: 将数据集分为训练集和测试集,占比为 ...
- gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别
opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用opencv+mtcnn+facenet+pyth ...
- python手写多个字母识别_一个带界面的CNN手写数字识别,使用Python(tensorflow, kivy)实现...
CNN_Handwritten_Digit_Recognizer (CNN手写数字识别) A CNN handwritten digit recognizer with graphical UI, i ...
- 基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
基于MNIST手写体数字识别--[Python+Tensorflow+CNN+Keras] 1.任务 2.数据集分析 2.1 数据集总体分析 2.2 单个图片样本可视化 3. 数据处理 4. 搭建神经 ...
最新文章
- 在EXCEL指定SHEET页,指定文字位置,插入批注
- QT的事件分发、事件过滤器详解
- c语言 多线程 参数,如何用C语言实现多线程
- 【C++基础】时间类型详解(转)
- [家里蹲大学数学杂志]第387期一套实变函数期末试题参考解答
- python操作haproxy配置文件实例
- oracle DML错误日志(笔记)
- Numpy安装+导入出错的解决方法
- Atitit node.js的缺点 优缺点 和php比较 1. 门槛比较 php简单,node麻烦	1 1.1. php的优势是语法简单易学,学习曲线平滑度可能居所有语言之首	2 1.2. 当用N
- OpenSSL密码库算法笔记——第6.5章 密钥协商
- 【JavaSE基础】09-网络编程
- 电商系统之商品类目及商品属性史
- 基于 VisualStudio2019 的 ASP.NET 后台环境搭建
- OSI网络七层协议以及每层的作用
- android崩溃日志 2016,常用获取Android崩溃日志的几种方法
- k8s创建service
- netty-读半包处理--ByteToMessageDecoder
- Android手机对应的CPU型号
- 为什么你和你喜欢的网站会感到痛苦如果“禁止跟踪”法案得到通过
- P315 static关键字
热门文章
- native react 更新机制_react-native热更新全方位讲解
- 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈
- python3 dict 排序_Python 3.9 新增功能展望
- 什么叫matlab仿真,【图片】求助帖:哪位matlab大神能告诉我这个仿真这能得出什么结论呢_matlab吧_百度贴吧...
- mysql驱动rpm和jar_mysql5.7.11对应的JDBC驱动是哪个版本
- 转:[kipmi0]进程导致系统负载高
- Android Studio3.2.1升级刨坑记录
- vue 生产环境 background 背景图不显示原因
- MySQL无法创建外键、查询外键的属性
- Notable magic numbers