345. Kuzushiji Recognition | kuzushiji-recognition
感谢 Kaggle 和主办方创建了如此有趣的比赛。祝贺所有完成比赛的人。
我将所有图像调整为 512x512。其中部分图像被转换为灰度图。
我的解决方案基于 Faster-RCNN,但做了一些小的修改。
我的区域提议网络和字符分类网络都使用了宽 ResNet-34 骨干网络。我的区域提议网络使用的卷积滤波器数量是原始 ResNet 论文中描述的 ResNet-34 配置的两倍。我的字符分类网络使用的卷积滤波器数量大约是原始 ResNet-34 配置的三倍。我尝试了更深的基于 ResNet-50 和 ResNet-101 的网络,但我发现更宽、更浅的网络效果更好。
为了对抗过拟合,我广泛使用了 Dropout。在所有残差块内部使用了 2D Dropout。在残差块外部靠近最终输出层的地方使用了普通的 1D Dropout。
我的最终区域提议网络使用彩色图像,而我的最终分类网络使用灰度图像。起初我对区域提议网络和分类网络都使用灰度图像,因为我认为额外的通道没有用处并且想节省空间。在比赛快结束时,我尝试对两个网络都使用彩色图像。这稍微改善了区域提议网络的输出,但由于过拟合降低了分类网络的准确性。
我非常有兴趣使用语言模型来纠正我图像处理代码的错误标签。我花了一个多月的时间尝试不同的方法,但未能使其很好地工作。
为了将字符按照人类阅读的大致顺序排列,我使用 DBSCAN 将字符分组为列,按其字符的平均水平坐标对列进行排序,然后按垂直坐标对每列内的字符进行排序。这对大多数图像都有效。
为了训练我的纠正网络,我使用真实标签生成了大量包含已知错误的合成提交文件。这些错误相当真实,是根据我的基于 Faster-RCNN 的模型在交叉验证数据集上的表现随机添加的。
为了执行字符标签纠正,我最初尝试了用于执行翻译(例如从英语到日语)的网络架构,例如带有注意力机制的编码器 LSTM 后跟解码器 LSTM,或 Transformer 网络。我倾向于这些网络架构,而不是将字符传递到单个循环网络,因为理论上它们应该能够优雅地处理真实字符数量与检测到的字符数量不同的情况。不幸的是,这些网络引入的错误比它们纠正的还要多。我最终放弃了基于翻译的网络架构,转而使用简单的双向 GRU 网络。它能够将我的分数提高大约 0.01,但仅限于由弱图像处理模型生成的提交文件。如果我在我最好的提交文件上运行它,它会降低我的分数约 0.003。
我认为我如此难以让语言模型良好工作的原因是,我的基于 Faster-RCNN 的模型在考虑字符上下文方面比我最初预期的要好。我认为为了让纠正网络良好工作,我需要引入外部文本语料库。
有几个我没有实施或测试的潜在改进途径。
我的代码可在此处获取。