由于实习原因,好久没有跟新博客了。今天总结一下参加tinymind人民币编码区识别比赛的经验跟代码。
人民币编码区识别比赛分为预赛与正赛。预赛很简单,识别纸币面额,我在前面的博客中讲述过,戳这里。
简单讲一下,由于纸币背景简单,识别面值其实就是简单的分类问题,我的方法就是直接把图像塞进resnet18里,结果正确率是可以达到100%的。代码在这儿。
主要介绍正赛,正赛是编码区识别。编码区的识别分为两个步骤。首先,我们要先把编码区找到,也就是将编码区从原图中裁剪出来。然后,通过裁剪出的图片以及它的编码区Label放入文本识别的框架里训练,获得模型,再test出结果。
编码区检测我使用了一些方法有目标检测也有文本Ocr的,如yolov3,EAST,CTPN。我从数据集中选取1500张来做它们的训练集,得出结果发现yolov3可以检测出来,但会出现检测不全的情况,EAST跟CTPN结果较好。原理不介绍了,我把yolov3的代码给大家戳这里。
其实编码区检测大家效果都差不多,主要区别还是在文本识别。我用的是cnn+LSTM+ctc。主要思路是,讲编码区图片输入,经CNN降采样获得一个适合LSTM的feature map,然后放入LSTM,使得每个宽度之间获得前后的关联信息,这样对识别效果会有好处,当然你也可以舍弃rnn(比赛中有人做过)。CNN部分我用的VGG的网络结构,但最终训练集正确率99%而验证机的准确率只有90左右,出现了过拟合情况。不知道有没有大神告诉我怎么才能避免这种情况。
大致过程如上,最终结果95左右,虽然不高,但也完成了。主要跟大家分享经验思想以及代码,希望对大家有帮助。