记一次简单计算验证码的识别过程
2022-1-19 21:24:43 Author: fuping.site(查看原文) 阅读量:2 收藏

某CMS的验证码是简单的计算验证码,都是一位数的加减乘除运算,之前尝试用分割的方法识别,但成功率较低。后来采用了pytorch训练后进行识别,可以达到98%以上的识别率,于是整理一下过程,水一篇文章。

分别遍历这几个模板图片的像素点并存为 0-1 矩阵:首先创建一个 24列 31 行的二维数组(所有元素都为 0),遇到黑色像素点就将 0 变成 1,此处需要注意二维数组中坐标与像素点坐标是相反的。

实现一个Dataset的子类,需要重写__len____getitem__方法,__len__需要返回整个数据集的大小,__getitem__提供一个整数索引参数,返回一个样本数据(一个图片张量和一个标签张量)。主要代码如下:

1
2
3
4
5
tensor([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], # 0
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.], # ×
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], # 4
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.], # =
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]]) # ?

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种方法来对计算验证码进行识别。第一种方法使用简单,但识别率较低,可以针对一些比较简单的验证码(比如验证码未进行扭曲、干扰等)。第二种方法使用简单,但识别率比较依赖样本的数量,前期验证码标注是一件麻烦事,但对于本文这种简单的验证码,少量的样本准确率也会很高。


文章来源: https://fuping.site/2022/01/19/Calculate-Captcha-Recognition/
如有侵权请联系:admin#unsafe.sh