好吧,隔了两个月才更新文章,之前一直在做各种大数据竞赛.最近休赛期,所以把之前一些好的idea实现一下.
之前有人问我能不能用深度学习做一个验证码识别,我觉得现在网络上很多验证码识别,直接照搬就好了.深入了解之后,发现需求不是那么简单的,这次的验证码并不像一些网站,需要全部识别数字或者字母,而是从一张验证码图片中识别指定颜色的数字(还有一种四则运算验证码,原理差不多,后面会简单概括),就例如下图这种:
这个是为了做验证码识别本地生成的验证码,接下来会讲到如何生成验证码
根据需求,需要识别出验证码中的红色或者蓝色或者绿色的数字,就如上图,红色为'0','0','0',蓝色为'8','2',绿色为'4',接下来分成两个部分讲如何实现验证码识别.
1.验证码生成
既然要做卷积神经网络模型...那当然就需要很多很多很多很多很多数据做训练集,验证码这种东西,不可能去爬去成千上万张吧,太浪费时间了,因为我决定一天之内就把它做出来.所以想到了一个比较方便快捷的方法:自己做验证码!!!!!!
这里主要用到了一个强大的图像处理库PIL,关键代码如下
from PILimport Image,ImageFont,ImageDraw
#创建的验证码长宽
width =200
height =100
创建画布
初始化一个画布之后,需要我们往画布上写东西,根据需求,红绿蓝0-9的数字
随机生成红绿蓝三种颜色,每张图片都是红绿蓝三通道根据不同亮度组合而成,每个通道的数值代表了该通道上的亮度,取值范围为0-255,当取值255时亮度最高.所以生成红绿蓝中的一种颜色只需要保持三个通道中的一个亮度为最高的255,另外两个通道亮度为0.
这三种颜色可以数值化表示为: 红色:(255, 0, 0) 绿色:(0, 255, 0) 蓝色:(0, 0, 255)
随机生成红绿蓝三种颜色中的一种
随机生成0-9数字中的一个
接下来利用text方法,在刚刚创建好的draw画布中,画上我们随机生成的有颜色数字
这边是6位的验证码,所以循环6次,最终出来的验证码是这样的:
生成的验证码
emmmmmmmmm这样的验证码是没有灵魂的.......应该没有谁家的验证码长这个样吧,所以接下来要利用PIL和Augmentor工具对图像进行'改造'.主要目的是让验证码变得更丑更难辨认.
首先加一些简单的干扰因素,划线或者画点之类的
画点,每张图片画1000个点
效果图
感觉还是缺了点什么..........所以使用了强大的图像处理库Augmentor独有的图像'扭曲'功能,
好了,看起来舒服多了.....这样加个for循环就可以批量输出这种验证码了,最终我利用了10000张图片作为验证码,其中有50%是经过Augmentor图片扭曲处理,剩下的没有使用Augmentor处理,那么训练集构造完毕.
2.数据预处理
图像数据,进行数据预处理,这里我的思路是将图像的数字一个一个切分下来,单独识别.前面提到每个图像的像素为(100*200*3),宽度是200,一共6个数字,所以每个图像我们取200/6=33,所以我们切分出来的图形是(100*33*3).
主要代码如下:
对每张图片进行截取,然后加入jpg_list列表中
同时,要保存对应颜色和数字,这里将他们两转换one-hot变量
这里一共有10000张图片,每张图片单独切分成6个数字,所以最终的训练集是6*10000=6w条数据
3.模型训练
这一部分神经网络模型借鉴了杨培文大神的验证码识别github开源,在他的基础上根据我们自己的需求进行了一下更改.我们使用的模型是
神经网络模型
最后的输出层,第一个Dense是输出颜色,第二各Dense输出的是number,激活函数都是softmax,相比杨培文大神的神经网络,我们的神经网络要简单一些.
keras简单粗暴
最后对训练集进行归一化处理,将刚刚one-hot处理好的color和number,合并到一个列表中:label = [color,number],作为输出的label
开始训练......epoch设置为2,但是验证集正确率已经很高了,达到了99%.....validation是从原数据20%划分, 其中48000做训练,12000做验证.
训练过程
最终验证结果
四则运算也是同样原理,在指定位置返回四则远算符和数字就行了,过几天做了在更新文章
一天之内做到这样,还没投入真正使用,只是对自己随机生成的验证码进行测试,后面找一些网站上的试试效果,再更新
好吧,就这样,代码有需要的再找我要吧,转载的注明出处
作者:LuckyOu
链接:https://www.jianshu.com/p/20c8fd7bee7b