返回列表

2nd Place Solution [Updated with Code Link]

560. Benetech - Making Graphs Accessible | benetech-making-graphs-accessible

开始: 2023-03-21 结束: 2023-06-19 教育内容生成 数据算法赛
第二名解决方案 [已更新代码链接]

第二名解决方案 [已更新代码链接]

作者:Raja Biswas | 发布日期:2023-06-20 | 竞赛排名:第2名

首先,我要感谢Kaggle社区分享了许多优秀的想法和精彩的讨论。特别感谢@nbroad@brendanartley。祝贺获胜团队,期待你们的解决方案分享。

感谢Kaggle和主办方组织了这场有趣的竞赛。

1. 概述

我的解决方案完全基于从google/matcha-base骨干网络微调的图像到文本模型。训练流程分为两个阶段。在第一阶段,我利用大量合成图表来适应当前任务的骨干网络。在第二阶段,我使用过采样的提取/非生成图表来专门化真实世界图表的处理流程。在此阶段,我为散点图和非散点图创建了单独的模型,主要是为了缓解预测散点数据的困难。

训练流程示意图

2. 模型

所有模型共享相同的架构(图像到文本转换器)和输入输出模式。模型输入就是图表图像本身,不需要任何提示。输出文本具有以下模板:

<|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))
  • 添加了直方图作为额外的图表类型,在后处理中转换为vertical_bar

3. 数据

除了竞赛数据外,我还使用了以下来源:

合成数据集

我花了大部分竞赛时间创建合成数据集。对于合成图表的底层数据,我使用了:

我使用matplotlib生成图表,确保它们捕捉图表约定的所有方面。例如,对于折线图,生成的图表包括共享原点图表、包含未在数据序列中的刻度标签、两个刻度标签之间的额外点标记、x刻度标签之间的不等间距等。我通过以下方式最大化图表的多样性:

  • 自定义刻度标记、刻度标签、刻度方向、数值刻度标签格式(如科学计数法、不同舍入、欧洲风格格式、添加%后缀、货币符号前缀等)、主/次网格、标题、轴限制、轴线(如在y=0处设置底部轴线)、图例、标记等
  • 灰度、背景纹理、纵横比(从非常宽到非常窄)
  • 数据点数量(非散点图4-24个点,散点图4-64个点)
  • 随机特效:y值统计文本框、水平/垂直条带、插图、随机文本、随机方程、标注最小/最大点、误差带、添加随机形状、改变线宽、颜色、数据点标记大小、阴影、误差条、斜率等
  • log-log、semi-log图表、反转y轴(虽然这些不是测试集的一部分,但我的假设是它们有助于模型泛化)

合成数据集包括:

  • 10万个水平条形图
  • 10万个垂直条形图+直方图
  • 10万个点图
  • 20万个折线图
  • 20万个散点图

Bartley合成数据集

伪标签

我从维基共享资源截取了约700张图像(例如:https://commons.wikimedia.org/w/index.php?search=line+plots&title=Special:MediaSearch&go=Go&type=image)。我使用伪标签,然后手动校正,生成标注。

ICDAR数据集

我使用了约1100张来自ICDAR的图像,仅包含1个XY序列(250个水平条形图 + 450个垂直条形图 + 250个折线图 + 150个散点图)。我还进行了后处理,确保标注与竞赛图表约定匹配(例如处理百分比、折线图数据的插值以匹配刻度标签等)。

4. 数据混合

  • 数据混合1:用于领域适应
数据集 大小 乘数 有效大小
竞赛数据集 - 合成 60k 3 180k
竞赛数据集 - 提取 1.1k 16 17k
合成数据集 - 自身 700k 1 700k
合成数据集 - Bartley 25k 1 25k
  • 数据混合2:散点图专门化
数据集 大小 乘数 有效大小
竞赛数据集 - 合成 11k 1 11k
竞赛数据集 - 提取 0.2k 16 3.2k
合成数据集 - 自身 30k 1 30k
伪标签数据集 0.1k 16 1.6k
ICDAR数据集 0.2k 16 3.2k
  • 数据混合3:非散点图专门化
数据集 大小 乘数 有效大小
竞赛数据集 - 合成 48k 1 48k
竞赛数据集 - 提取 0.9k 8 7.2k
合成数据集 - 自身 20k 1 20k
伪标签数据集 0.5k 8 4k
ICDAR数据集 1k 8 8k

5. 训练

训练的主要超参数是max_patchesmax_length。我在不同训练阶段使用以下设置:

阶段1训练
  • max_patches: 2048
  • max length: 1024
  • lr: 5e-5
  • batch size: 2
  • gradient accumulation: 16
阶段2训练 - 非散点图
  • max_patches: 4096
  • max length: 512
  • lr: 2e-5
  • batch size: 4
  • gradient accumulation: 2
阶段2训练 - 散点图
  • max_patches: 3072
  • max length: 1024
  • lr: 2e-5
  • batch size: 8
  • gradient accumulation: 1

作为细节,我在训练期间使用了模型权重的指数移动平均(EMA)、梯度裁剪和带线性预热的余弦调度器。

6. 增强

由于我多次重复提取图像,我决定包含以下增强:

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,
    )

7. 参考

抱歉写了这么长的解决方案。如果您有任何疑问/建议,请告诉我。我计划下周发布所有脚本、配置和数据集。[编辑:代码已发布在 https://github.com/rbiswasfc/benetech-mga]

同比赛其他方案