一、介绍:
表格结构识别,即给定一张图片,检测出图中单元格的物理坐标(四个顶点)以及逻辑坐标(行号列号)。主要用于给输入图片输出图中表格单元格拼接后的物理坐标,具体地,模型输出的框的坐标为单元格的四个角点的坐标,左上角为第一个点,按照顺时针的顺序依次输出各个点的坐标,分别为(x1,y1)(x2,y2)(x3,y3)(x4,y4)。用户可以自行尝试各种输入图片。
模型描述
本模型是以自底向上的方式:
1、基于单元格中心点回归出到4个顶点的距离,解码出单元格bbox;同时基于单元格顶点,回归出到共用该顶点的单元格的中心点距离,解码出gbox。
2、基于gbox(group box),将离散的bbox拼接起来得到精准完整的电子表格;
3、第二步的拼接将单元格从“离散”变为“连续”,因此用后处理算法获得单元格的行列信息。目前上线模型实现前两步的功能,第三步暂时未提供。Cycle-CenterNet模型介绍,详见:Parsing Table Structures in the Wild 。
二、下载模型
三、配置环境
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
首先我们需要确认一个工作目录,用来存放Cycle-CenterNet
的相关环境依赖文件。本站所选择的目录为E盘的根目录下dataddd
文件夹,完整路径为:D:\
。dataddd
\Cycle-CenterNet
检测E盘是否在dataddd
目录下有没有cv_effnetv2_video-human-matting
文件夹,没有则创建该文件夹。
if not exist E:\dataddd\Cycle-CenterNet mkdir E:\dataddd\Cycle-CenterNet
强制切换工作路径为E盘的dataddd\Cycle-CenterNet
文件夹。
cd /e E:\dataddd\Cycle-CenterNet
为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请参考如下文章,安装部署Conda之后再继续以下步骤。
http://dataddd.com/anaconda%ef%bd%9cminiconda/
在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。
conda create -p E:\dataddd\Cycle-CenterNet\ENV python=3.7
执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?
提示,我们直接按下回车即可。
初始化Conda环境,避免后续可能报错。
conda init cmd.exe
激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate E:\dataddd\Cycle-CenterNet\ENV
执行如下命令,安装阿里达摩院相关依赖。
pip install modelscope
执行如下命令,安装torch
依赖。
pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
执行如下命令,安装CV2依赖库。
pip install opencv-python
四、使用教程
推荐下载pycharm代码编辑器,然后在代码编辑器器内新建一个Python文件,粘贴如下代码,在代码编辑器的右下角选择Python环境为E:\dataddd\Cycle-CenterNet\ENV
。
该模型官方并未给出示例,本站已经帮您写好了相关的代码,复制粘贴即可使用。
注意:请自行修改表格像名称和路径为您自己的表格图片名称,然后再执行,否则会报错。
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import cv2
import numpy as np
# 表格图片名称
resultIMGName = 'table_recognition'
# 表格图片格式
resultIMGFormat = '.jpg'
# 表格图片路径
resultIMGPath = 'E:\dataddd\Cycle-CenterNet'
# 输出表格图片名称
outputIMGName = 'table_image_final'
# 输出表格图片格式
outputIMGFormat = '.jpg'
# 输出表格图片路径
outputIMGPath = 'E:\dataddd\Cycle-CenterNet'
input_IMG = ('%s/%s%s'%(resultIMGPath,resultIMGName,resultIMGFormat)).replace('\\','/')
output_IMG = ('%s/%s%s'%(outputIMGPath,outputIMGName,outputIMGFormat)).replace('\\','/')
# 定义表格识别 pipeline
table_recognition = pipeline(Tasks.table_recognition, model='damo/cv_dla34_table-structure-recognition_cycle-centernet')
# 读取图片并进行表格识别
result = table_recognition(input_IMG)
# -1 表示保留图片的 alpha 通道信息,如果不需要可以改成 0 或 1。
img = cv2.imread(input_IMG, -1)
# 在图片上绘制表格边框
polygons = result['polygons']
for i in range(len(polygons)):
x1, y1 = polygons[i][0:2]
x2, y2 = polygons[i][2:4]
x3, y3 = polygons[i][4:6]
x4, y4 = polygons[i][6:8]
pts = np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,0,255),2)
# 输出绘制后的图片
cv2.imwrite(output_IMG, img)
# 提示输出完成
print( '表格识别结果保存到<%s>'% output_IMG )
五、效果展示
六、总结
模型介绍
预处理和后处理
测试时的主要预处理和后处理如下:
- Resize Pad(预处理): 输入图片长边resize到1024,短边等比例缩放,并且补pad到长短边相等。同时有减均值除方差等归一化操作。
- 表格拼接(后处理):基于模型推理的gbox,将离散bbox拼接起来得到完整表格。
模型局限性以及可能的偏差
- 模型主要用于有线表格,无线表格不支持
训练数据介绍
本模型训练数据为WTW,训练集为10970张。
模型训练流程
本模型利用imagenet预训练参数进行初始化,然后在训练数据集上进行训练。