一、验证码识别项目以及改进
大体介绍:每张验证码图片包含四个字符,图像中存在很多干扰信息,所以对图像进行预处理后,在作为网络的输入图像来进行训练(图片转换成224x224),所使用的网络是alexnet网络模型对图像进行训练的,因为每张图片有四个字符,那么可以采用多任务学习的方法来加速训练,每个任务对应一个位置的字符进行训练识别,因此对alexnet网络的最后的全连接层改为四个并行的卷积层,最后通过计算softmax得到概率,采用交叉熵损失函数来降到最低。
1、预处理阶段
图像中存在噪点、背景、干扰线、文字倾斜、文字重叠。也就是图像的信息非常复杂,干扰信息特别多,数据集的质量不是很高,因此先对图像进行了预处理,得到的图像很大程度上减少了干扰信息的影响,网络模型的输入图像是预处理后得到的图像。
(1)转化为灰度图。
(2)降噪:8邻域降噪
对于小噪点,统计周围比中心点像素值小的个数(周围像素点比中心点像素小而且差值要大于一定的阈值)
类似均值滤波,不过对于每个pixel,统计其周围像素点的灰度值为0或255的个数。从前面经过二值化处理可知,如果一个pixel是验证码或者干扰因素的一部分,那么这个pixel在二值化结果中其灰度值一定是0,即黑色;如果一个pixel是背景,则其灰度值应该是255是白色。因此对于孤立的噪点,其周围应该都是白色,或者大多数点都是白色pixel。
所以对一个噪点来讲,其周围的pixel应该全是白色的背景才对,如果图片分辨率够高,一个噪点实际上可能是有很多个pixel组成,所以此时的判断条件应该放宽,即一个pixel是黑色的并且相邻的8个pixel白色的大于一个固定值,那么这个pixel就是噪点。对于不同的验证码,这个阀值是不固定的,所以在这可以设置大小,多试几次,找到最佳的阀值。
连通域降噪(函数)
上面对于小一点的噪声有效,但是对于较大的噪点,表现性能不够好,因为大噪点,可能是由多个小噪点组成的,因此周围像素点可能有多个都是黑色的,上面的算法可能会误认为不是噪点,因而不进行处理。所以对于大一点的噪声,可以求其面积,因为字符大部分都是联通的,所以求出每一个连通的黑色点的个数,如果个数很多那么就说明这一片像素很有可能是字符的一部分,如果联通的个数很少,那么基本可以确定是噪点了。
在计算的过程中,每扫描到一个黑色(灰度值为0)的点,就将与该点连通的所有点的灰度值都改为1,因此这一个连通域的点都不会再次重复计算了。下一个灰度值为0的点所有连通点的颜色都改为2,这样依次递加,知道所有的点都扫描完。接下来再次扫描所有的点,统计每一个灰度值对应的点的个数,每一个灰度值的点的个数对应该连通域的大小,并且不同连通域由于灰度值不同,因此每个点只计算一次,不会重复。这样一来就统计到了每个连通域的大小,再根据预设的阀值,如果该连通域大小小于阀值,则其就为噪点。这个算法比较适合检查大的噪点,与上个算法正好相反。
上面采用8邻域降噪得到的验证码还是保留不少较大的噪点,这里对上面处理过的验证码图片再次使用连通域降噪算法,对其进行2次降噪,结果中,噪点基本消失了。
(3)去除干扰线
这个时候有两种方法,第一种是对字符进行分割,对每一个字符进行训练,第二种方法就是把整张验证码图片都放负