返回列表

7th Place Data-based Generalization Solution

363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19

开始: 2019-12-19 结束: 2020-03-16 计算机视觉 数据算法赛
第7名:基于数据的泛化解决方案

第7名:基于数据的泛化解决方案

作者: Theo Lyu (roguekk007) | 比赛排名: 第7名

非常感谢 Kaggle 和 Bengali.AI 主办了如此有趣的比赛。这是我第一次全身心投入的 Kaggle 比赛,毫无疑问,如果没有我们出色的团队成员 Igor, Habib, Rinat 和 Youhan,这一切都不可能实现。

分析:本次比赛的公共榜单(LB)呈现出明显的分层现象:

  • 拥有良好的流程,使用基准增强方法的单模型 LB 分数约为 0.97。
  • 移除裁剪,在全分辨率上训练,添加 cutmix / cutout,并进行充分训练,应该能让模型达到 LB 0.985+,经过一些调整甚至可以达到 ~0.989+。这些在讨论帖中已被广泛覆盖。
  • 我们最好的单模型来自 Rinat,使用的是 Cadene 的仓库 中的 PNASNet-5-Large,得分为 LB 0.9900,CV 0.9985。我相信大多数 LB 分数在 0.9850-0.9910 之间的参赛者都在使用得分在这个范围内的模型集成。

在这个阶段(0.9900-0.9905),我们发现很难进一步提高 LB 分数。正如 这篇帖子 指出的那样,更高的 CV 分数不再意味着更好的 LB 分数,所以我们卡住了一段时间(很长的一段时间……)。

提高泛化能力

通过 CV 和 LB 的关系很容易看出,问题在于我们的模型无法泛化到未见过的图素(这里的图素指的是图素根、元音和辅音变音符号的三元组组合)。训练集中只有约 1290 个图素,而可能的组合有 12936 种。我们的模型可能偏向于输出见过的三元组;无论原因如何,正如 Qishen Ha 精彩的 帖子 指出的那样,我们的模型在这些图素上表现不佳。

事后看来,提高泛化能力最便捷的方法就是增加更多数据,这并不神奇。在研究图素表示时,我发现图素实际上被编码为 Unicode 字符序列。根和变音符号也有它们对应的序列。最神奇的部分是图素的 Unicode 序列是其根序列的组合。这张图片是最好的例证,其中四行分别是图素、图素根、元音和辅音

Unicode组合示例

这一观察结果适用于训练集中的所有图素(有极少数例外),使用一个非常基本的算法,我能够为训练集中的所有 1295 个图素生成正确的标签,除了 2 个。根据 Guanshuo Xu 的帖子指向 这个仓库,我们能够访问一个全面的图素组合列表。使用分解算法,我们选择了约 3000 个可以分解为给定根和变音符号的图素。我们在最后一天的 LB 提升来自于对这些图素的更好泛化,这些图素与训练集和测试集部分重叠。

有了这些图素,我们使用各种字体渲染它们,并获得了一个标记清晰的合成数据集,包含约 47K 张涵盖这些字符的图像,可以在 这里 找到,创建这个合成数据集的所有要素都是公开的。我们希望通过看到合成图像,我们的模型应该能够至少学习图素的拓扑特征(如果不是风格特征)。事实证明它们确实做到了。这是我们数据集中的一张合成图像样本。

合成图像样本

此时距离比赛结束只有 24 小时,所以我们只是将之前的模型在添加了原始训练和验证集的合成数据上进行了微调,从而在最后一天实现了激动人心的飞跃😊

一些细节

我的队友们拥有出色的流程,以下是一些被证明有用的方法:

  • 在 128x128 数据上训练约 100 个 epoch,然后在 224x224 数据上微调。这无疑
同比赛其他方案