老肥今天和大家分享的是今年DCIC的OCR赛题-基于文本字符的交易验证码识别,我和@Ernnnn同学租卡打比赛血本无归(本想着线上线下非常稳定,肝一肝稳恰没想到后面演变成了摸奖),同时本次比赛体验相当差,具体表现为:
第一点本赛题一共出现了两种Leak,第一个Leak为生成验证码图片的时间泄露
,不同生成方式根据图片生成时间可以进行划分,第二个Leak则是所有验证码具有顺序排列
的关系,比如字母a开头的字符一定出现在字母b开头字符的前面,这在不同程度上影响了分数;
第二点是后续出题方针对第二个Leak更换了分布与训练集、测试集A榜不同的测试集B榜,这也导致了最终结果成为了运气游戏,生成验证码方式若与B榜更加相近的选手会获得更高的分数;
第三点则是小号问题,A榜一次未提交的选手B榜一发击中奖金区(??????????)。但是无论如何,还是总结一下这场翻车的比赛吧。
验证码作为性价较高的安全验证方法,在多场合得到了广泛的应用,有效地防止了机器人进行身份欺骗,其中,以基于文本字符的静态验证码最为常见。一个能同时过滤多种干扰的验证码模型,对于相关自动化技术的拓展使用有着一定的商业价值。
本次大赛以已标记字符信息的实例字符验证码图像数据为训练样本,参赛选手需基于提供的样本构建模型,对测试集中的字符验证码图像进行识别,提取有效的字符信息。训练数据集不局限于提供的数据,可以加入公开的数据集。
由于本次验证码图像为定长4位字符,我们采用了多标签多分类的方法,将每一张图片的四位验证码看成四个标签,每个标签都有数字字母共计62种分类,其效果要优于CTC Loss那一套识别方法(只达到不到0.95的正确率)。
我们主要采用的网络为effcientnetv1-b4,这是在训练速度和检测精度之间的一个权衡,较小的网络模型可以占用更小的显存,同时可以更快地进行迭代。验证码分辨率也是相当重要的因素,我们将其等比缩放到400 * 1000可以得到优异的检测准确率。
本次比赛数据增强是相当重要的,除了传统的缩放、扰动、随机仿射变换等增强(这些对性能的优化较小),不能简单地使用flip进行翻转,需要对应进行字符标签的更改。我们还使用了mixup、cutmix以及fmix这些混合增强(这些优化以一定比例再混合具有较好的优化效果)。
根据对模型预测错例的观察,我们发现模型出错的地方主要集中在大小写字母Oo、Ii、Uu等肉眼也难以分辨的字符上,为了提升对于这些易错字符的识别准确率,一个自然的想法是增加额外的数据,于是我们使用了imagecaptcha来制作与训练集相同字体的验证码。在制作额外的验证码时,我们增大这些易错字符的权重,使得生成的验证码图片包含大量的易错字符供模型学习,最终也提升了模型的性能。
为了进一步提升模型的性能,我们采用了指数移动平均(EMA)的方法,对基于迭代和基于epoch的更新都做了尝试,两者都提升了模型的CV分数,基于迭代的更新效果更佳,提升了该模型的单模分数,达到线上A榜0.9896的成绩,但当我们将其用于模型融合时,并没有带来更多的收益。
对于在比赛后期迭代得到的模型,我们通过贝叶斯优化的方法对每一个模型的输出进行权重搜索以增强模型融合的性能,最终使用3个模型达到了线下0.9894,线上A榜0.9904的分数。但是最后由于测试集B榜分布的巨大改变,我们所增加的额外数据的字体没有匹配到该集,与大部分参赛选手遇到的情况相同,模型整体预测效果大幅下降。
以上就是我们参加本次比赛的全部内容了,我们的代码已开源。同学们一定要擦亮眼睛,甄别赛题的可玩度,更不要盲目加上杠杆租用服务器进行“赌博”。