百度网盘AI大赛 您所在的位置:网站首页 ai调整色相饱和度 百度网盘AI大赛

百度网盘AI大赛

2023-04-19 02:14| 来源: 网络整理| 查看: 265

百度网盘AI大赛-表格检测进阶:表格的结构化第4名方案

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>> 超链为

一、赛题分析背景:随着票据、名单等带有表单、表格的文件被广泛应用,将纸质文件转化成电子数据并保存管理成为了很多企业的必然工作。传统人工录入的方式效率低、差错多、流程长,如果能通过技术处理,实现表格图片的结构化展现,则可以很大程度降低成本,提高效率以及使用体验。本次比赛希望各位选手能通过OCR等技术解决此痛点问题,识别表格图片的内容与坐标,精准还原纸质数据。分析:比赛中需要检测的对象包括表格、行、列、合并单元格四种。表格的识别较为简单,训练集和A榜测试集中大部分表格与图片边界较为贴合,但是对于某些难例,可能存在一张图片识别出多个表格的情况。行列的识别较为困难,主要包含两个难点。1)行往往宽度极大、高度极小,在进行 IoU 匹配时,假设行的检测框与真实框宽度相等,行的真实框y坐标与匹配框y坐标中的最大值为 y_max、最小值为 ymin,则 IoU 可近似看成检测框宽度 w/( ymax - ymin),这意味着检测框 y 坐标有较小的波动,都会造成 IoU 匹配的失败,造成大量的误检。列往往高度极大,宽度较小,因此也存在上述问题,我们暂且将其称为短边波动。2) 当表格被遮挡时,遮挡行列的置信度较低,不利于遮挡行列和低质量行列的区分,且坐标回归结果较差,即使检测到了也会被匹配为FN。下图是上述两个问题的示意图,左图为行列的短边波动问题,右图为表格遮挡问题。

最后, 合并单元格的识别具有较大的歧义性,容易与不合并单元格混淆,一方面,不同训练图片中的合并单元格宽高无法统一,有些合并单元格的宽一些,有些合并单元格高一些,采用几何特征识别合并单元格效果较差,另一方面,合并单元格与不合并单元格均包含一行文字,在外观上也难以区分。此外,检测网络还可能将多个独立的非合并单元格框选在一起作为合并单元格。

二、数据分析本次比赛最新发布的数据集共包含训练集、A榜测试集、B榜测试集三个部分,其中训练集共7742张图片,A榜测试集共500张图片,B榜测试集500张图片。检测目标共4个类别,分别为整体表格(table)、表格行(row)、表格列(column)、跨多行/列的合并单元格(spanning_cell)。

如图所示,比赛数据集包含有边界电子表、无边界电子表、拍照电子表和纸质表格四种类型。其中,拍照电子表会出现严重的遮挡问题,造成较多的漏检和误检,因此需要着重处理。考虑到表格图像大小在1K左右,且尺度变化较大,我们对检测网络进行了多尺度训练。此外,由于表格图像中包含行、列、合并单元格等大量检测目标,较小的尺度不利于检测目标的正确分类,我们将多尺度训练的范围设置在 640 px 到 1216 px 之间。三、评价指标本次比赛的评价指标为:precision 和 recall。针对每一个类别box,pred box与gt box计算iou>=0.9且类别正确记为TP,未匹配的gt box记为FN,同一gt box仅可正确匹配一次。precision为所有类别的平均precision,recall为所有类别的平均recall,最终排名按照上述两个指标的加权分数从大到小依次排序。机器配置:V100,显存15G,内存10G单张图片耗时>2s,决赛中的性能分数记0分由赛题分析部分可知,行和列的检测容易受到短边坐标波动的影响,在 iou>0.9 的匹配机制下,行的高度大一点、小一点,列的宽度大一点、小一点都可能匹配不上。考虑到同一张表格图像中行列的宽高存在一定相关性,因此我们利用其他高置信度行或列的先验知识筛选掉由于短边波动导致匹配失败的行或列。此外,由于绝大多数检测算法的检测速度较快,即使两阶段的 Faster RCNN 单张图片推理速度也可以保持在 0.2s 之内,无需太担心时间问题,四、算法介绍我们分别训练和测试了 Paddle Detection 中 Faster CNN (Swin-T) 和 ppyoloe-plus ,并发现 ppyoloe-plus 相较于 Faster CNN (Swin-T),A 榜检测分数提高了 9 % 个点, 因此, 采用 ppyoloe-plus 作为本次比赛的 baseline。网络架构如图所示:

此外,我们分别训练和测试了ppyoloe-plus中的 L 版本和 X版本,发现 X 版本的检测分数可以提升 0.4 % 个点, 且在遮挡情况下可以对行坐标进行有效回归。因此,选择 ppyoloe-plus-x 作为最终提交版本的检测模型。同时,考虑到表格数据集具有一些固有的先验信息,比如: 同一张图片只要一张表格、不同行列之间的高度和宽度存在一定关联,合并单元格的宽度和高度大于非合并单元格,我们提出三种过滤机制——单元格过滤策略,表格过滤策略,行列过滤策略,从而过滤掉图像中低质量的表格、行、列、合并单元格,在召回率下跌不大的情况下提升检测精度。具体实现可参考 predict.py 文件。1)单元格过滤策略。单元格过滤策略基于"合并单元格的“高度大于所在行的高度”或"宽度大于所在列的宽度"的先验信息进行设计,可以很好地解决合并单元格与单个非合并单元格难以区分的问题,首先,我们从检测结果中选取置信度大于 0.7 的行或列,并将行的左上角纵坐标 ymin 和 高度 h 存储在 ymin_l 和 h_l 列表中,将列左上角横坐标 xmin 和 宽度 w 存储在 xmin_l 和 w_l 列表中。之后,假设每个单元格坐标为 (xmin, ymin, xmax, ymax),宽度为 w1 ,高度为 h1。遍历单元格列表,对于每个单元格,将 xmin_l 列表中与 xmin 距离最小的坐标记为 xmin_f, 与之对应行的高度记为 cell_h, 将 ymin_l 列表中与 ymin 距离最小的坐标记为 ymin_f, 与之对应列的宽度记为 cell_w。如果,h> cell_h+5 或 w> cell_w+5 时,我们将检测结果写入到 result.txt 中。对于多个非合并单元格被识别为合并单元格的问题,我们采用适当提高 spanning cell 的阈值解决。

2)表格过滤策略。表格过滤策略基于"一张图片只能有一个表格"的先验信息设计,可以提高表格的召回率。对于每张图片,该策略选取置信度最高的表格检测结果,写入到 result.txt 中。3)行列过滤策略。行列过滤策略基于“行列之间的宽度和高度具有一定的相关性”的先验信息进行设计,可以有效解决短边波动造成的误检问题。首先,对于置信度大于 0.8 的高质量行列检测结果,我们直接将其写入到 result.txt 中,对于置信度在0.5 到 0.8 区间的行列检测结果,我们将其存储到 low_quality_table 中,同时,我们选取置信度最高的行的宽度,作为 high_quality_row_w, 置信度大于0.7 的行中,高度最小的行,作为 high_quality_row_h ;选取置信度最高的列的高度,作为 high_quality_col_h ,置信度大于 0.7的列中,宽度最小的列,作为 high_quality_col_w。之后,遍历 low_quality_table 列表,将宽度位于 [0.9* high_quality_row_w,1.1* high_quality_row_w],高度位于 [0.9* high_quality_row_h,1.1* high_quality_row_h] 的行写入到 result.txt 中, 将宽度位于 [0.9* high_quality_col_w ,1.1* high_quality_col_w ],高度位于 [0.9* high_quality_col_h,1.1* high_quality_col_h] 的列写入到 result.txt 中。

五、训练细节数据划分

该方案不对数据集进行划分,采用全部数据进行训练,并根据 A 榜样例图片可视化结果和 A 榜测评分数选择最优模型作为 B 榜提交模型。

数据增广随机像素内容变换,包括对亮度、对比度、饱和度、色相角度、通道顺序的调整随机扩张,填充值为 [123.675, 116.28, 103.53]随机裁剪随机翻转按批次随机缩放,缩放大小选取列表为 [640, 672, 704, 736, 768,800,832,864,896,928,960,992,1024,1056,1088,1120,1152,1184,1216]归一化处理, 均值为 [0., 0., 0.],标准差为 [1., 1., 1.]训练配置总迭代周期: 80 epoch, 除数据处理外,训练配置均采用官方配置。预训练模型: ppyoloe-plus-x 在 Object365 数据集上的预训练模型。首先,我们采用 LinearWarmup 策略对ppyoloe-plus-x 进行预热,其中,预热周期为 5 epochs。 之后,采用 CosineDecay 策略对学习率进行调整,其中,训练的基础学习率为 0.001, 训练周期为 75 epochs。此外,我们采用动量为 0.9 的 Momentum 优化器对网络进行优化。同时,我们采用 Focal loss 作为分类损失,采用 GIOU 作为回归损失,采用 L1 Loss 计算预测值与真实值之间的误差,采用 DF loss 计算预测分布与真实分布之间的距离,并将上述四个损失的加权和作为模型的总损失。数据集准备# 解压数据集 %cd /home/aistudio/work !unzip /home/aistudio/data/data182562/train.zip !unzip /home/aistudio/data/data182562/testA.zip # 生成 VOC 标签 %cd /home/aistudio/work !mkdir /home/aistudio/work/train/annotations !python gen_anno.py训练过程# 解压 PaddleDetection 套件 %cd /home/aistudio/ !unzip /home/aistudio/data/data186448/PaddleDetection-release-2.5.zip # 安装相关包 %cd /home/aistudio/PaddleDetection-release-2.5 ! pip install -r requirements.txt # 修改配置文件 %cd /home/aistudio/work/modify_code/ !cp ppyoloe_plus_crn_table.yml /home/aistudio/PaddleDetection-release-2.5/configs/ppyoloe/_base_ !cp ppyoloe_plus_reader_table.yml /home/aistudio/PaddleDetection-release-2.5/configs/ppyoloe/_base_ !cp ppyoloe_plus_crn_x_table.yml /home/aistudio/PaddleDetection-release-2.5/configs/ppyoloe/ !cp voc.yml /home/aistudio/PaddleDetection-release-2.5/configs/datasets/voc.yml # 模型训练,训练周期为 80 epochs , 每1000个迭代打印一次日志,每5个epoch保存一次模型 %cd /home/aistudio/PaddleDetection-release-2.5 ! python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_x_table.yml测试过程# 模型导出,这里导出的是之前训练好的model_final.pdparams文件,如果要导出新训练的模型,请修改weights参数下的模型路径 # 一般来说,新训练好的模型路径位于/home/aistudio/PaddleDetection-release-2.5/output/ppyoloe_plus_crn_x_table %cd /home/aistudio/PaddleDetection-release-2.5 ! python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_x_table.yml \ --output_dir=/home/aistudio/work/predict_code/\ -o weights=/home/aistudio/data/data186448/model_final.pdparams\ # 预测结果可视化 %cd /home/aistudio/work/predict_code/ # B榜提交时模型名称为 ppyoloe_plus_crn_x_80e_coco,因此需要对模型重命名 !mv ppyoloe_plus_crn_x_table ppyoloe_plus_crn_x_80e_coco !python vis_yoloe.py /home/aistudio/work/pubtest/imgs /home/aistudio/work/predict_code/output # 提交测试 %cd /home/aistudio/work/predict_code/ !python predict.py /home/aistudio/work/pubtest/imgs /home/aistudio/work/predict_code/output # 打包提交,这里可以直接下载/home/aistudio/data/data186448/submit_2_28_3.zip文件进行提交(比赛时B榜提交的是submit_2_28_3.zip) # 或打包/home/aistudio/work/predict_code下的模型和代码进行提交,打包前,请务必保证训练模型已经导出,且提交测试通过 !zip -r submit_3_5_1.zip ./ppyoloe_plus_crn_x_80e_coco predict.py六、代码结构PaddleDetection-release-2.5:检测套件work:代码与数据集目录modify_code:需要修改的配置文件predict_code:预测与打包提交目录ppyoloe_plus_crn_x_80e_coco:模型导出文件output: 可视化结果输出目录predict.py: 提交测试脚本vis_yoloe.py: 检测结果可视化脚本

train:训练数据集pubtest: A榜测试数据集样例gen_anno.py VOC标签生成脚本label_list.txt 类别标签文件train.txt 训练集标签文件

七、上分策略

单元格过滤策略。由于一般目标检测方法在进行分类时,只会提取单个合并单元格的特征,缺乏表格的全局信息。因此,容易将外观特征相似的非合并单元格误检为合并单元格。为此,我们利用全局的行列信息对单元格的检测结果进行后处理。合并单元格必定跨行或跨列,当单元格不跨行(高小于所在行的高)或不跨列(宽小于所在列的宽)时,上述策略会将当前单元格筛除,否则,保留当前单元格。表格过滤策略。考虑到表格结构化数据集中,单张图像一般仅包含单个表格,同时,由于遮挡、模糊等存在,采用阈值筛选,可能会筛除掉一些受遮挡影响置信度低但质量较高的表格,我们直接保留检测结果中置信度最高的表格作为最终检测结果。行列过滤策略。由于受到遮挡情况影响,部分行列可能分类分数低,混杂在一些低质量行列中,设置较大的阈值会显著降低召回率。此外,由赛题分析部分可知,表格列行坐标稍微出现波动,都可能会造成匹配失败,设置统一的宽高筛除并不可行,容易顾此失彼。我们使用置信度较高的行列的宽高信息对低质量表格进行筛查,从而筛选出混杂在低质量行列中的高质量行列。参考项目

[1] 百度网盘AI大赛——表格检测进阶:表格的结构化 Baseline

https://aistudio.baidu.com/aistudio/projectdetail/5234267 本文章为转载 原文链接



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有