ICDAR2019 ReCTS task1 比赛总结

ICDAR2019 ReCTS task1 比赛总结

  • 写在前面
  • 比赛介绍
  • 比赛方案
    • 数据集
    • 网络选择
    • 训练调参
  • 赛后总结

写在前面

这是自己的第一篇博客,拿来总结一下今年四月份的比赛——ICDAR 2019 ReCTS,同时记录一些自己的想法,方便以后回看。

比赛介绍

链接: 比赛信息.

这个比赛主要分为四个任务,字符识别,文本识别,文本检测,端到端识别。
我参与的是第一个任务,最终获得学生组第一(识别准确率94.73%)。

字符识别本质上就是一个分类任务,与大多数深度学习入门训练(如 MINIST手写数字识别,猫狗图片分类)并无太大差别。所以这篇博客主要是记录一些技巧以及细节(数据扩增,炼丹调参)。

比赛方案

数据集

比赛官方给的数据集就是街道上招牌里的字符图片,例如:
ICDAR2019 ReCTS task1 比赛总结_第1张图片
除了官方给的数据,我们通过指定字体和背景的方法生成了一些合成数据,例如:
在这里插入图片描述
在剔除了少量不合理类别之后,最终我们选择了4061类作为最终的分类目标,相当于对于官方给的数据集,选出对应标签是属于这4061类的字符图片。在合成数据集的时候,也是合成这4061类字符的图片。每个类别合成了150张图片(100张训练,50张验证)。对于官方数据集,我们通过分析发现各类字符的图片出现的次数非常不均衡:有2000类左右的字符,其对应图片只有两张甚至一张。所以为了解决这个数据不均衡的问题,我们对官方数据集做了处理:对于出现次数较多的字符,砍掉一部分图片,对于出现次数较少的字符,加入一部分合成数据集的图片作为补充。

最终,合成数据集作为预训练数据集,调整后的官方数据集作为finetune数据集。

网络选择

对于这个分类任务,因为残差神经网络在各种任务中的优异表现以及其易训练的特性,我们选择了ResNet50作为backbone,比赛期间我试过SE-Net(在ResNet50上加入了SE模块),但是在预训练的数据集(合成数据集)上的效果(训练相同的epoch达到的识别准确率以及模型最终收敛的识别准确率)都没有单纯的ResNet50效果好,所以最终还是选择了ResNet50。

训练调参

训练调参是个玄学环节。通常来说,我们只需要调整batchsize以及learning rate这两个参数就可以了,对于使用SGD优化算法来说,还可以调整momentum以及weight decay这两个参数。

此次比赛中,在确定了图像输入大小是32X32的前提下(这个大小一般也是试出来的,在试了64X64和32X32之后,发现32X32效果更好一些),通过调参发现batchsize设置为32的效果比64好(64的话一般就达到一块12G卡的上限了),这点我到现在也没想通。因为一般来说是在算力范围内,batchsize越大越好。momentum和weight decay没有作调整,选用0.9和5e-4。

最终的训练是先在合成数据集上预训练,模型收敛之后再在调整过的官方数据集上训练(训练过程中当验证loss不下降的时候将learning rate减小为原来的1/3,初始learning rate是0.001),最后再在原始的官方数据集上训练。(最后这一步是为了让模型见识尽可能多的贴近于官方测试集的图片,让模型“见多识广”)。

在官方测试集上我们还用了多模型集成的方法来获得最终结果。

赛后总结

先说不足之处吧:

  1. 由于这次比赛的数据集是街道上的招牌里的字符,其分布很容易产生不均衡(对于某些字,比如“小”,“汤”,在店名里会经常出现),我们这次的解决方案仅仅是对数据集做了筛选和补充,没有在算法层面上做处理(比如设置一些超参数来使得模型给予不常出现的样本更高的权重)。
  2. 合成数据集是通过指定字体和背景,再加上一些图像变换来生成的。采用GAN可以生成更贴近官方数据集的字符图片。
  3. 网络选择的是ResNet50,可能DenseNet等其他网络能有更好的表现,但是受限于算力和时间没有去尝试。
  4. 调参方面完全手动,算是小范围的grid search。最近在看了《EfficientNet》这篇论文之后,发现图像分辨率以及网络深度,宽度实际上可以用一定的理论支撑去进行调整。此外,这篇论文里面的EfficientNet-B0的架构是搜出来的,根据论文里面的描述,效果非常好(同样高的准确率,更少的参数量)。针对特定的数据集,采用搜索网络架构的方法可能可以找到更适合的网络。

在有以上诸多不足的情况下,拿了个学生组第一也是没有想到(最终的结果也比一些公司的高)。可能相较于其他参赛选手,我们方案胜在三个阶段的训练过程,其中在合成数据集上的预训练让模型的泛化性增强了一丢丢,第二个阶段的训练也让模型稍稍克服了一些数据不均衡的问题。调参过程也让模型的准确率尽可能高了(相较于那些没有反复调参的选手)。还有就是最终的多模型集成对于结果可能也提高了那么一两个点。

总而言之,一次既锻炼自己同时也挣得1500刀的比赛,都是要恰饭的嘛。

你可能感兴趣的:(比赛总结)