第7名解决方案 - 无外部数据
第7名解决方案 - 无外部数据
作者:Thanh Hau Nguyen (GRANDMASTER)
发布日期:2023-06-21
在本次竞赛中,我选择使用多模型流水线方案而非端到端模型(如Donut、Deplot或Matcha)。做出此选择的原因是:仅使用Kaggle数据测试的端到端基线模型表现不佳,且需要高性能设备训练并耗费大量数据生成时间。
模型组成
- 图像分类:用于识别图表类型
- 文本检测:检测X/Y轴标签
- 文本识别:读取检测区域文本(仅使用预训练模型,未微调)
- 目标检测:识别X/Y轴刻度、散点及垂直/水平条形
- 目标分割:分割折线图的线条及垂直条形(用于判断是否为直方图)
- 预训练Deplot模型:作为流水线失效时的备用方案(559个CV文件中仅使用1次)
数据处理
- 仅使用Kaggle官方数据
- 将`extracted`数据按50%训练集/50%验证集划分
- 所有`generated`数据用于训练集
- 最终使用全部数据训练各模型的最终权重
结果
- 最佳CV分数 - 公开榜分数(仅训练数据):0.871 - 0.86
- 私有榜分数:0.67
- 最佳公开榜 - 私有榜分数:0.86 - 0.69
流水线细节
步骤0:图表类型分类
使用v2s骨干网络进行分类,交叉验证准确率达99.2%。
通用处理流程(适用于所有图表类型)

步骤1:检测并读取X/Y轴标签
- 使用文本检测模型识别标签多边形区域
- 通过文本识别模型读取多边形内文本
- 后处理:
- 对X标签:从图像顶部到底部绘制水平线,选择与最多X标签多边形相交的直线(因文本检测模型存在误差)
- 对Y标签重复相同处理
步骤2:检测X/Y轴刻度
- 使用目标检测模型识别刻度
- 后处理:通过绘制水平线过滤X刻度,垂直线过滤Y刻度
步骤3:映射标签与刻度
- 基于标签与刻度的相对位置,在X轴方向使用IOU建立1对1映射,忽略无法配对的标签/刻度
- 针对非直线型X标签的优化:
- 从多边形提取X标签矩形区域
- 以矩形各边中心为顶点绘制菱形
- 在菱形最高点创建新矩形作为映射基准
垂直条形图处理

步骤4:检测条形顶部数值点
使用目标检测识别条形顶部点(称为"数值框",因预测为矩形框而非点)
步骤5:映射X刻度与数值框
采用与标签-刻度映射相同的方法
步骤6:计算条形数值
- 将数值框中心投影到Y轴
- 根据最近两个Y刻度的值计算最终数值:
数值框值 = Y1值 - abs((Y2值 - Y1值) / (Y2像素 - Y1像素) * (数值Y像素 - Y1像素))
直方图判断方法:
- 基于直方图各柱状条紧密相邻无间隙的特征
- 使用条形分割模型检测区域
- 计算X轴方向占比:若分割区域宽度超过首末条形间距的95%,则判定为直方图
水平条形图处理

- 将图表顺时针旋转90度后水平翻转,转换为垂直条形图结构
- 应用相同的垂直条形图处理流程
折线图处理


步骤4:线条分割
使用分割模型识别线条,对虚线进行连接处理形成连续线条
步骤5:投影筛选
- 将线条投影到X轴,保留可在X维度投影到线条的X标签与刻度
- 获取对应剩余X标签的数值框
步骤6:计算数值点
- 将数值框中心投影到Y轴
- 与最近两个Y刻度的值比较计算最终数值
散点图处理

步骤4:散点检测
通过目标检测识别散点,计算包含散点的最大连通矩形区域,取所有图表框尺寸的平均值作为统一框大小
步骤5:映射刻度与数值框
在Y轴维度采用与垂直条形图相同的映射方法
步骤6:计算散点数值
- 将数值框中心投影到X/Y轴
- 分别与最近两个X/Y刻度的值比较计算最终坐标值
点图处理
处理方式与垂直条形图相似,但当X标签为数值型时,采用散点图的后处理方法
其他计算机视觉后处理亮点
- 为避免文本识别错误,保留Y标签值为最长递增序列
- 因预训练文本识别模型不含空格,使用额外文字检测模型分割多边形内单词,并按几何位置排序提升准确性
详细实现参见公开推理笔记本:https://www.kaggle.com/code/thanhhau097a/bmga-submission-0-86