队名:临兵斗者皆阵列前行
代码:已上传到github
MIT协议,放心使用,欢迎Star
本次放出代码,旨在抛砖引玉,期待能看到更多更好的竞赛代码分享,共同进步!
代码风格略凌乱,原谅我一生放荡不羁唯一追求只是没BUG而已:joy: 有疑问这几天在论坛或QQ群或github提出都行,会尽力解答。
所有验证码都遵循先分割再识别的流程,分割主要方法是等距分割:type1字符位置固定,分割较简单;type2,type4由于字符数目固定,可以直接等距分割;type3,type5,type6由于字符数目并不固定,所以第一步是识别验证码所包含的字符数,然后再等距分割。汉字/字母/数字的识别模型都是卷积神经网络。
type1由于训练集无法直接使用,所以我们根据常用汉字训练了一个通用汉字/拼音识别模型,其他类型验证码均可使用训练集来训练识别模型,其中type3和type4还有可利用的语言上下文信息。
关键技术:当字符数目不确定时,先预测验证码包含的字符个数,再根据字符数进行分割,这样type5,type6的识别问题就分别和type2,type4类似了,这是一种简单通用的验证码识别方案。
算法总体思路如下图,先分割再识别。分割采用等距分割思想,识别采用CNNs模型
此类验证码上方九宫格部分由于字符位置固定,可以直接定位识别。下方3个汉字和一个拼音,垂直方向位置也是固定的,只是水平方向结束的位置在变化,可以按列相加的方法确定结束的位置,然后同时从左右两端开始识别汉字并且确定和上方九宫格汉字的对应关系,找到相似度最大的三个汉字后,剩下的位置就是拼音,直接识别拼音再次到九宫格寻找对应汉字即可。共包含两种识别模型,汉字识别:挑选常用4800个汉字,拼音识别:所有408个拼音。
如图1所示,此类验证码包含26个字母和10个数字,而且每张验证码均包含5个位置固定的字符,间距变化很小,所以直接等距分割(相邻字符有重叠)。利用训练集共10万个字符直接训练CNN即可,无需重新生成训练数据。
此类验证码分两种情况。
1) 根据水平方向从左至右第85像素将图像分割为两部分;
2) 预测左边图像部分包含字符的个数n={4,5},是个二分类问题,这一步实验中识别率达到0.999以上;
3) 确定最左边字符的起始位置后,根据n的大小,可以在水平方向上进行等距分割;
4) 由于垂直方向字符位置有较大变化,所以去除背景像素后,计算每列像素的重心,依次可以进一步确定每个字符在垂直方向的精确位置;
5) 分割出来之后,用训练集所训练的汉字识别模型进行识别。测试时,如果所识别出的成语或诗句未在训练集出现,则在训练集中寻找最相似的代替;
2.成语。要求直接输出成语本身,这种验证码与输出首字母的验证码类似,但是只需要3) 4) 5)三步即可。
识别思路与type3的第2种情况完全相同,只是数据集不同而已。
统计训练集可知,每个验证码只包含4-5个字母或数字,相邻字符粘连在一起。
水平方向采用按列相加的方法可以确定起始和结束的位置,垂直方向字符都在第1至36像素间,据此可以从整幅图像中获得验证码的具体位置
预测验证码包含的字符数之后进行等距分割并识别得到最终结果
识别思路完全和type5相同,只是字母数字变为了汉字。
原文链接:http://bbs.pkbigdata.com/static/413_detail.html