非常感谢Kaggle和Benetech举办这场有趣的竞赛,这里可以使用多种不同的方法,创意无穷无尽。考虑到私有测试集中存在强烈的分布偏移,我们对最终的成绩感到相当满意。
摘要
我们的解决方案包含三个主要组成部分:
- 合成数据生成
- 三阶段训练matcha模型
- 单独处理散点图
1. 合成数据生成
早期我们就意识到这场竞赛的独特之处:我们不受限于现有数据集。如果模型在处理某些图表模式时遇到困难,我们可以生成大量具有这些模式的图表,而matcha模型非常强大,能够从中学习。
我们开始基于这个出色的仓库进行开发:https://github.com/rakutentech/chart-synthesizer。我们使用竞赛提取的数据和ICDAR数据作为验证,并尝试模拟其中的各种模式。例如:
- 不同的字体、刻度方向、刻度样式、背景颜色、网格样式等
- 为条形图和线图添加误差线
- 将直方图作为独立的图表类型生成
- 困难的线图模式,例如当线条起始点非常靠近刻度标记但未接触时,如果没有额外的训练数据,模型很可能会将该刻度值包含在预测中
- 添加模糊和噪声效果,以还原提取图表的外观
我们生成数据的一些示例:


在每一轮训练中,我们都会分析验证集,找出得分较低的模式,并将这些模式添加到图表生成代码中。通过重复这一过程,我们的公共排行榜得分从0.74提升到了0.82。
借助我们的生成代码,可以为每个训练阶段创建所需数量的条形图、线图和散点图。对于点图,我们从@brendanartley提供的优秀数据集中采样了10,000张图像。
2. matcha模型的三阶段训练
感谢@nbroad的慷慨分享,我们使用`matcha-base`模型参赛并迅速取得了不错的成绩。
训练分为三个阶段:
- 从`matcha-base`检查点开始,将模型作为图表分类器进行训练。该模型训练5个epoch,使用少量合成数据并对提取的数据进行过采样
- 使用第一阶段的权重,继续训练10个epoch以从所有图表类型中提取数据序列。在此步骤中,我们添加了大量自行生成的合成数据(约150,000张图像)与原始数据集结合
- 使用第二阶段的权重,针对每个图表类型组分别微调模型5个epoch:
- 垂直条形图/点图(添加50,000张合成垂直条形图、5,000张直方图、5,000张点图)
- 水平条形图(添加50,000张合成图)
- 线图(添加200,000张合成图)
- 散点图(添加30,000张合成图)
在推理时,首先运行图表分类器,然后每组图表将由各自的专用模型处理。
最初我们的流程只有第2步和第3步,并使用第2步的模型作为分类器。但后来我们观察到,添加大量合成数据会降低分类任务的性能。因此,我们将分类器的训练单独分离出来。
也可以使用简单的CNN进行分类任务,但从早期实验来看,使用matcha能获得略好的性能,因此我们坚持使用它。
部分训练细节:
- 第一阶段和第二阶段的学率为3e-5,第三阶段为2e-5,使用带预热的余弦调度
- Adafactor优化器
- 最大patch数2048,最大长度512
- 冻结编码器的前4层
- 预测字符串:
<chart_type><start>x1|y1;…;xn|yn<end> - 直方图在训练时被视为独立的图表类型,在推理时映射回垂直条形图
- 基于数据系列范围进行动态舍入
3. 散点图处理
虽然上述方法帮助我们在线图、点图和条形图中取得了良好效果,但我们发现散点图对matcha来说更难处理。因此,我们为散点图开发了独立的方案:
- 绘图区域和刻度标签检测:使用CACHED的输出
- 文本行旋转:使用MobilenetV2骨干网络训练角度分类任务
- 文本行OCR:使用vietocr的seq2seq模型训练文本行读取任务。我们修改了编码器,使用带空洞卷积的ResNeXt50
- 散点标记检测:使用CoaT骨干网络的Mask-RCNN完成此任务。我们使用detectron2训练了该模型
- 每个标记的最终值通过标记位置、刻度标签位置和刻度值推导得出
这一流程帮助我们在散点图的公共榜上获得0.09分,私有榜上获得0.28分,这也是我们能够在私有测试集中存活的关键。
感谢您的阅读,如有任何问题请随时联系我们。
更新:我们的解决方案推理笔记本现已发布:https://www.kaggle.com/code/qdv206/benetech-5th-place-inference