某CMS的验证码是简单的计算验证码,都是一位数的加减乘除运算,之前尝试用分割的方法识别,但成功率较低。后来采用了pytorch训练后进行识别,可以达到98%以上的识别率,于是整理一下过程,水一篇文章。
分别遍历这几个模板图片的像素点并存为 0-1 矩阵:首先创建一个 24列 31 行的二维数组(所有元素都为 0),遇到黑色像素点就将 0 变成 1,此处需要注意二维数组中坐标与像素点坐标是相反的。
实现一个Dataset的子类,需要重写__len__
和__getitem__
方法,__len__
需要返回整个数据集的大小,__getitem__
提供一个整数索引参数,返回一个样本数据(一个图片张量和一个标签张量)。主要代码如下:
1 | tensor([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], # 0 |
DataLoader是Dataset的进一步封装,Dataset每次通过__getitem__
方法取到的是一个样本,经过DataLoader封装为dataloader后,每次取的是一个batch大小的样本批次。
nn.Sequential()可以看作模块的有序容器,可以方便快捷的搭建神经网络。
网络的输入是一个shape为[batch, 3, 60, 180]
的张量,batch代表的是一个批次图片数量,3代表输入的图片是3通道的,即RGB,180和60则分别代表图片的宽和高。
经过上结构的卷积后,得到一个shape为[batch, 128, 6, 18]
的张量,x.view(x.size(0), -1)
将改变张量的shape为[batch, 128*6*18]
,再用一个[1024, 16*5]
的全连接层映射为一个[batch, 16*5]
张量,这个就是模型的输出,其中16
代表字符的种类数量,5
代表一张验证码图片含有的字符数量。
本文通过2种方法来对计算验证码进行识别。第一种方法使用简单,但识别率较低,可以针对一些比较简单的验证码(比如验证码未进行扭曲、干扰等)。第二种方法使用简单,但识别率比较依赖样本的数量,前期验证码标注是一件麻烦事,但对于本文这种简单的验证码,少量的样本准确率也会很高。