560. Benetech - Making Graphs Accessible | benetech-making-graphs-accessible
首先,我要感谢Kaggle社区分享了许多优秀的想法和精彩的讨论。特别感谢@nbroad和@brendanartley。祝贺获胜团队,期待你们的解决方案分享。
感谢Kaggle和主办方组织了这场有趣的竞赛。
我的解决方案完全基于从google/matcha-base骨干网络微调的图像到文本模型。训练流程分为两个阶段。在第一阶段,我利用大量合成图表来适应当前任务的骨干网络。在第二阶段,我使用过采样的提取/非生成图表来专门化真实世界图表的处理流程。在此阶段,我为散点图和非散点图创建了单独的模型,主要是为了缓解预测散点数据的困难。

所有模型共享相同的架构(图像到文本转换器)和输入输出模式。模型输入就是图表图像本身,不需要任何提示。输出文本具有以下模板:
<|bos|> <|chart_type_start|> {chart_type} <|chart_type_end|> <|num_point_start|> {n_x} | {n_y} <|num_point_end|> <|x_span_start|> {x0} | {x1} | {x2} | … | {xn} <|x_span_end|> <|y_span_start|> {y0} | {y1} | {y2} | … | {ym} <|y_span_end|> <|eos|>
一些细节:
val = "{:.2e}".format(float(val))除了竞赛数据外,我还使用了以下来源:
我花了大部分竞赛时间创建合成数据集。对于合成图表的底层数据,我使用了:
我使用matplotlib生成图表,确保它们捕捉图表约定的所有方面。例如,对于折线图,生成的图表包括共享原点图表、包含未在数据序列中的刻度标签、两个刻度标签之间的额外点标记、x刻度标签之间的不等间距等。我通过以下方式最大化图表的多样性:
合成数据集包括:
我从维基共享资源截取了约700张图像(例如:https://commons.wikimedia.org/w/index.php?search=line+plots&title=Special:MediaSearch&go=Go&type=image)。我使用伪标签,然后手动校正,生成标注。
我使用了约1100张来自ICDAR的图像,仅包含1个XY序列(250个水平条形图 + 450个垂直条形图 + 250个折线图 + 150个散点图)。我还进行了后处理,确保标注与竞赛图表约定匹配(例如处理百分比、折线图数据的插值以匹配刻度标签等)。
| 数据集 | 大小 | 乘数 | 有效大小 |
|---|---|---|---|
| 竞赛数据集 - 合成 | 60k | 3 | 180k |
| 竞赛数据集 - 提取 | 1.1k | 16 | 17k |
| 合成数据集 - 自身 | 700k | 1 | 700k |
| 合成数据集 - Bartley | 25k | 1 | 25k |
| 数据集 | 大小 | 乘数 | 有效大小 |
|---|---|---|---|
| 竞赛数据集 - 合成 | 11k | 1 | 11k |
| 竞赛数据集 - 提取 | 0.2k | 16 | 3.2k |
| 合成数据集 - 自身 | 30k | 1 | 30k |
| 伪标签数据集 | 0.1k | 16 | 1.6k |
| ICDAR数据集 | 0.2k | 16 | 3.2k |
| 数据集 | 大小 | 乘数 | 有效大小 |
|---|---|---|---|
| 竞赛数据集 - 合成 | 48k | 1 | 48k |
| 竞赛数据集 - 提取 | 0.9k | 8 | 7.2k |
| 合成数据集 - 自身 | 20k | 1 | 20k |
| 伪标签数据集 | 0.5k | 8 | 4k |
| ICDAR数据集 | 1k | 8 | 8k |
训练的主要超参数是max_patches和max_length。我在不同训练阶段使用以下设置:
作为细节,我在训练期间使用了模型权重的指数移动平均(EMA)、梯度裁剪和带线性预热的余弦调度器。
由于我多次重复提取图像,我决定包含以下增强:
transforms = A.Compose(
[
A.OneOf(
[
A.RandomToneCurve(scale=0.3),
A.RandomBrightnessContrast(
brightness_limit=(-0.1, 0.2),
contrast_limit=(-0.4, 0.5),
brightness_by_max=True,
),
A.HueSaturationValue(
hue_shift_limit=(-20, 20),
sat_shift_limit=(-30, 30),
val_shift_limit=(-20, 20)
)
],
p=0.5,
),
A.OneOf(
[
A.MotionBlur(blur_limit=3),
A.MedianBlur(blur_limit=3),
A.GaussianBlur(blur_limit=3),
A.GaussNoise(var_limit=(3.0, 9.0)),
],
p=0.5,
),
A.Downscale(always_apply=False, p=0.1, scale_min=0.90, scale_max=0.99),
],
p=0.5,
)
抱歉写了这么长的解决方案。如果您有任何疑问/建议,请告诉我。我计划下周发布所有脚本、配置和数据集。[编辑:代码已发布在 https://github.com/rbiswasfc/benetech-mga]