一、问题描述
人民币作为我国法定货币,与生俱来,人见人爱。它在我们日常生活中的重要性不言而喻,每张人民币纸币都有一串唯一的字符号码,是人民币的重要标识。由于这串序列号的唯一性,若能在纸币识别装置上添加编码识别,让每张人民币的行走轨迹都可以被记录并存储,这样人民币都能进入银行监管之内,不仅有助于识别假币,还可以很大程度上协助攻破抢劫,盗窃人民币等非法事件。人民币编码识别技术在日常生活中具有很好的实用价值。
二、任务1-⼈⺠币⾯值识别
要求参赛者根据训练集图片训练模型,识别人民币面值,并按要求提交验证集训练结果进行验证。评分采⽤top1准确率。
显而易见不同面值的人民币的图像具有很大区别,在赛题1中我们目标是将不同面值的人民币进行分类,即根据不同面值的图片进行分类操作。
解题思路
显然赛题1是一个典型的图像分类任务,直接使用CNN图像分类的流程就可以解决。具体的解决流程是Fine-Tune一个分类网络,并在测试集上进行TTA(Test Time Augmentation)操作,就可以解决。
三、任务2-人民币编码识别
人民币编码识别目的是识别人民币具体的编码,人民币编码由10位组成,具体由冠号和编码两个部分。冠号一般为两个字母或者两个字母中间夹上一个数字的情况,编码则都是阿拉伯数字。编码识别使用编码整体准确率和字符logloss打分。
原始赛题只给定了人民币图像的类别和编码,但没有给定人民币具体的编码位置。因此我自己标注200张带有位置信息的标注文件。具体来说编码识别任务进一步可以拆分为:编码定位和编码识别两个步骤。
编码定位
在编码定位阶段,需要定位编码具体的位置;编码识别阶段则需要对具体编码进行识别。或许你可能会问,能不能直接将整张图直接进行编码识别,不进行编码定位的操作。但直接用整图进行识别的方式是不太可取的,首先整图噪音比较多,模型容易学习到噪音,其次图片太大占用的模型需要显存越大。那么在编码识别阶段能不能拆分成字符进行单个字符识别呢?这种方法也不可取,首先字符并不能完全切割彻底,其次字符与字符之间可能存在分布关联。比如冠号两个字符并不是独立的,所以切割成字符的形式也不太合理。
其实编码识别这个任务本质就是一个OCR任务,在OCR任务中也是具体包括编码定位和编码识别两个步骤。首先来看编码定位任务,编码定位任务目标是找到编码的位置。我的解决思路是使用物体检测的模型来定位编码,当然你也可以使用传统图像处理的方法来定位。
具体来说我是选择Faster-RCNN模型来训练了一个编码定位模型,为了定位的精度我没有选择SSD和YOLO模型。
编码识别
在定位了人民币的编码之后,就是编码识别的步骤了。人民币编码的图片都是定长字符组成的,因此是一个定长字符识别的问题。有两种解决方法,思路1直接对编码图片进行多分类操作,10个字符则进行10个多分类;思路2使用CRNN+CTC的模型。
思路1编码图片的多分类操作(Multi-CNN),就是在分类CNN后面加上10个全连接层,进行10个分类操作,然后将10个分类loss求和训练即可。这种方法思路简单,模型仅包含卷积层和全连接层,模型收敛快;但这种思路是将每个字符单独进行分类的,所以没有考虑到字符与字符之间的关系,在精度上有一些欠缺。
思路2是直接使用CRNN+CTC的思路,这也是OCR字符识别的常见模型。当然现在也有一些后序的改进,比如Attention+CTC或者CNN+CTC的论文。后序的改进我在比赛中没有尝试,因为我觉得CRNN模型应该就能够解决水平编码识别的问题了。CRNN模型的优点是模型拟合能力强,模型的精度高;缺点是模型包含RNN/LSTM层,训练会稍微慢一些,也会受到训练字符分类的影响。
CRNN我是用了Pytorch开源版本的,并修改了输入图片的尺寸,增加了max-pooling层(参考CRNN论文),使用resnet18提取CNN特征。
CRNN模型结构
在这个比赛中可以拆分K折训练,我们得到K个模型,并对测试集进行TTA操作,那么会对一个样本会有不同的预测结果,则需要对结果编码结果进行合并。具体可以进行结果平均和字符结果投票的操作。
样本变换
以上就是编码识别的两个模型,那么如何有效的对两个模型的结果进行有效融合呢?这里我是考虑到两个模型的差异:将Multi-CNN与CRNN模型进行结果融合,如果CRNN识别的编码结果存在问题,则使用Multi-CNN结果进行代替。
四、获取案例套装
文件包大小:15,000 MB
获取大容量AI案例U盘套装:AI智能案例套装/计算机视觉-多行业-A