比赛记录——记录一次失败的比赛,九坤量化验证码识别大赛

过日子不记录,就是对自己人生的极大不负责任!

逛吃逛吃小队完成的题目是type1,但是在初期拿到数据集时候,也尝试构建了其他几个任务的数据集。关于type1,因为所处理的是手写字符,所以采用的方案是使用mnist数据集来训练模型,mnist数据集模型,根据wiki上的介绍:

该模型的准确率可以达到error在0.17%左右,在使用过程中,由于训练平台的原因,我们采用的是mnist测试数据集上准确率可以到98.5%以上的模型

wiki上的介绍在这里

算法处理的步骤;

数据生成:(最后虽然没有用上,但是我们好好做了所有数据生成的代码) 文件夹:data_generation/data_generation.py 里面有8个type的data,其中英文单词和中文成语选取的是牛津词典和新华词典里的数据库,任务7中,生成倒置汉字时候,改写了captcha库中关于字体旋转的部分,令其大于180度,其余的都使用captcha库可以得到近似的效果

 

后来发现type1和·type2中的都是手写字符,于是使用了mnist和Enghand数据集(英文手写数据集)作为训练集

  1. 数据预处理(vertical_cut_v1.py)
    1. 二值化 对于Type1,图片大致可以分为两类,一类是背景图片是大片相同或者近似颜色的图片,这种可以很方便的使用opencv的二值化函数,选取阈值在85左右进行二值化处理
    2. 去噪函数:去噪函数应该放在第二步,去干扰线会导致数据的不连通,因此使用opencv的findcolour函数,通过判断像素连通域点在20以下的填充为白色
    3. 去干扰线:这一步骤使用的是pycapt提供的去干扰线函数,起作用的主要是去干扰线函数,在提供的数据集中,图片上的干扰线基本上是一个像素点连续的曲线或者直线,根据n邻域算法可以判断出是否是干扰线
    4. 连通域回复,这一步使用的opencv提供的膨胀函数,可以有效回复部分一些被过度处理的比较细的字体
    5. 数据切分,数据切分有两个处理方案,一个是被称为竖直投影切分的办法,1我们的算法就是采用的这种方法,通过判断x轴上有色像素点的数目,设定阈值为6,阈值大于6的时候,就判断处于字符处,阈值小于6的时候判断是空白背景
    6. 补充,关于背景色是马赛克的图片,不同之处在于要选择合适的阈值二值化,以及使用opencv的findcolour函数选择更合适的去噪阈值(试出来的)

2、模型选择:多层卷积神经网络,在mnist数据集上,根据wiki的介绍,目前最好的效果是 Hu, Jie; Shen, Li; Albanie, Samuel; Sun, Gang; Wu, Enhua (2017). "Squeeze-and-Excitation Networks"中的Committee of 20 CNNS with Squeeze-and-Excitation Networks

此外,之前也考虑过直接跳过数据预处理,直接对完整的图片进行操作,但是失败并放弃的原因主要是

  1. 图片尺寸不固定
  2. 字符数目不固定
  3. 这样训练集不足

结果分析:

对于初赛结果,准确率仅有6.5%,关于准确率低下的原因:

主要有两个:

其一:对于比较细的字符如7,9,l等在图片预处理去噪的过程中,干扰线处理导致连通域不完整,其次使得本来不大的字符被过度处理,在进行后续的步骤的时候不能得到准确的切分,因为少数几个关键字符,导致切分错误

其二:对于背景色是马赛克的图片,由于难以选择合适的固定阈值,于是最后选择了skimage下的filter函数得到动态调整阈值,再加上50作为二值化的阈值,但是结果导致仍有大量的噪声点,在后续的膨胀过程中,就导致了图片上有很多连通域,在切分的时候就有噪声点被当作了图片

其三:在模型输入的时候还是存在一些不精细的地方,如mnist数据集是28*28的输入,并且数据输入的时候进行了归一化,即输入的图片是值在0到1之间的浮点数,而我们在初期测试自己的照片的时候可能存在不是特别好的处理

 

外部链接:

https://www.jianshu.com/p/7a2b227896a8

提供了CTC不定长验证码处理的方案

 

你可能感兴趣的:(做个人吧,竞赛)