Cycle-CenterNet表格结构识别模型
表格结构识别,即给定一张图片,检测出图中单元格的物理坐标(四个顶点)以及逻辑坐标(行号列号)。主要用于给输入图片输出图中表格单元格拼接后的物理坐标,具体地,模型输出的框的坐标为单元格的四个角点的坐标,左上角为第一个点,按照顺时针的顺序依次输出各个点的坐标,分别为(x1,y1)(x2,y2)(x3,y3)(x4,y4)。用户可以自行尝试各种输入图片。
模型描述
本模型是以自底向上的方式:
- 基于单元格中心点回归出到4个顶点的距离,解码出单元格bbox;同时基于单元格顶点,回归出到共用该顶点的单元格的中心点距离,解码出gbox。
- 基于gbox(group box),将离散的bbox拼接起来得到精准完整的电子表格;
- 第二步的拼接将单元格从“离散”变为“连续”,因此用后处理算法获得单元格的行列信息。目前上线模型实现前两步的功能,第三步暂时未提供。Cycle-CenterNet模型介绍,详见:Parsing Table Structures in the Wild 。
部署教程
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
首先我们需要确认一个工作目录,用来存放Cycle-CenterNet
的相关环境依赖文件。本站所选择的目录为D盘的根目录下openai.wiki
文件夹,完整路径为:D:\openai.wiki\Cycle-CenterNet
。
检测D盘是否在openai.wiki目录下有没有cv_effnetv2_video-human-matting
文件夹,没有则创建该文件夹。
if not exist D:\openai.wiki\Cycle-CenterNet mkdir D:\openai.wiki\Cycle-CenterNet
强制切换工作路径为D盘的openai.wiki\Cycle-CenterNet
文件夹。
cd /d D:\openai.wiki\Cycle-CenterNet
为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请参考如下文章,安装部署Conda之后再继续以下步骤。
在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。
conda create -p D:\openai.wiki\Cycle-CenterNet\ENV python=3.7
执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?
提示,我们直接按下回车即可。
初始化Conda环境,避免后续可能报错。
conda init cmd.exe
激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate D:\openai.wiki\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
使用教程
推荐下载VS Code代码编辑器,然后在代码编辑器器内新建一个Python文件,粘贴如下代码,在代码编辑器的右下角选择Python环境为D:\openai.wiki\Cycle-CenterNet\ENV
。
该模型官方并未给出示例,本站已经帮您写好了相关的代码,复制粘贴即可使用。
注意:请自行修改表格像名称和路径为您自己的表格图片名称,然后再执行,否则会报错。
# 本代码由openai.wiki所提供,转载请注明出处,谢谢。 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import cv2 import numpy as np # 表格图片名称 resultIMGName = 'table_recognition' # 表格图片格式 resultIMGFormat = '.jpg' # 表格图片路径 resultIMGPath = 'D:\openai.wiki\Cycle-CenterNet' # 输出表格图片名称 outputIMGName = 'table_image_final' # 输出表格图片格式 outputIMGFormat = '.jpg' # 输出表格图片路径 outputIMGPath = 'D:\openai.wiki\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预训练参数进行初始化,然后在训练数据集上进行训练。
用处不大啊图片识别出来输出的还是图片,要是输出的是表格还是有实际用处不过还是谢谢站长让我们这样的小白也能部署操作。站长有识别后输出是表格的吗。
@落夜秦雨 其实这个模型的功能主要是用来识别单元格的物理坐标,方便后缀做标记,然后将识别到的文本重绘制指定区域内,在特定场景下还是比较有用的哈。
最后那张图就是站长自己识别输出的
@PhiltreX 站长您好,请问您可以提示一下模型怎么进行训练吗