目录
简介
特性
效果展示
表格识别
版面分析和表格识别
版面恢复
关键信息抽取
快速开始
1. 准备环境
1.1 安装PaddlePaddle
1.2 安装PaddleOCR whl包
2 快速使用
3. 便捷使用
3.1 命令行使用
3.2 Python脚本使用
3.3 返回结果说明
分析总结
简介
PP-Structure是PaddleOCR团队自研的智能文档分析系统,旨在帮助开发者更好的完成版面分析、表格识别等文档理解相关任务。
PP-StructureV2系统流程图如下所示,
- 文档图像首先经过图像矫正模块,判断整图方向并完成转正
- 随后可以完成版面信息分析与关键信息抽取2类任务。
版面分析任务中,图像首先经过版面分析模型,将图像划分为文本、表格、图像等不同区域,随后对这些区域分别进行识别,如,将表格区域送入表格识别模块进行结构化识别,将文本区域送入OCR引擎进行文字识别,最后使用版面恢复模块将其恢复为与原始图像布局一致的word或者pdf格式的文件;
关键信息抽取任务中,首先使用OCR引擎提取文本内容,然后由语义实体识别模块获取图像中的语义实体,最后经关系抽取模块获取语义实体之间的对应关系,从而提取需要的关键信息。
下面是从官网摘的一些示例图片
特性
PP-StructureV2的主要特性如下:
- 支持对图片/pdf形式的文档进行版面分析,可以划分文字、标题、表格、图片、公式等区域;
- 支持通用的中英文表格检测任务;
- 支持表格区域进行结构化识别,最终结果输出Excel文件;
- 支持基于多模态的关键信息抽取(Key Information Extraction,KIE)任务-语义实体识别(Semantic Entity Recognition,SER)和关系抽取(Relation Extraction,RE);
- 支持版面复原,即恢复为与原始图像布局一致的word或者pdf格式的文件;
- 支持自定义训练及python whl包调用等多种推理部署方式,简单易用;
- 与半自动数据标注工具PPOCRLabel打通,支持版面分析、表格识别、SER三种任务的标注。
效果展示
PP-StructureV2支持各个模块独立使用或灵活搭配,如,可以单独使用版面分析,或单独使用表格识别,这里仅展示几种代表性使用方式的可视化效果。
表格识别
疑难:
上面两张图是官网上的表格识别效果,我自己识别的效果达不到这样,
我的表格是十几列的,数据很多,可能这个也有关系,
不过当我把表格裁掉一半,剩下和上图差不多列之后,结果还是没这么好,不知道是什么问题
用一样的模型,有点怀疑是不是他用了PPOCRLabel单独标注了
版面分析和表格识别
版面恢复
下图展示了基于上一节版面分析和表格识别的结果进行版面恢复的效果。
关键信息抽取
图中不同颜色的框表示不同的类别。
快速开始
1. 准备环境
1.1 安装PaddlePaddle
如果您没有基础的Python运行环境,请参考运行环境准备。
- 您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
- 您的机器是CPU,请运行以下命令安装
python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
1.2 安装PaddleOCR whl包
# 安装 paddleocr,推荐使用2.6版本
pip3 install "paddleocr>=2.6.0.3"
# 安装 图像方向分类依赖包paddleclas(如不需要图像方向分类功能,可跳过)
pip3 install paddleclas>=2.4.3
2 快速使用
使用如下命令即可快速完成一张表格的识别。
cd PaddleOCR/ppstructure
# 下载模型
mkdir inference && cd inference
# 下载PP-OCRv3文本检测模型并解压
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_infer.tar && tar xf ch_PP-OCRv3_det_infer.tar
# 下载PP-OCRv3文本识别模型并解压
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_infer.tar && tar xf ch_PP-OCRv3_rec_infer.tar
# 下载PP-StructureV2中文表格识别模型并解压
wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/ch_ppstructure_mobile_v2.0_SLANet_infer.tar && tar xf ch_ppstructure_mobile_v2.0_SLANet_infer.tar
cd ..
# 执行表格识别
python table/predict_table.py \
--det_model_dir=inference/ch_PP-OCRv3_det_infer \
--rec_model_dir=inference/ch_PP-OCRv3_rec_infer \
--table_model_dir=inference/ch_ppstructure_mobile_v2.0_SLANet_infer \
--rec_char_dict_path=../ppocr/utils/ppocr_keys_v1.txt \
--table_char_dict_path=../ppocr/utils/dict/table_structure_dict_ch.txt \
--image_dir=docs/table/table.jpg \
--output=../output/table
运行完成后,每张图片的excel表格会保存到output字段指定的目录下,同时在该目录下回生产一个html文件,用于可视化查看单元格坐标和识别的表格。
上面使用的模型应该是目前多好的了
如需换模型,以及更多使用方法请看:ppstructure/table/README_ch.md · PaddlePaddle/PaddleOCR - Gitee.com
3. 便捷使用
3.1 命令行使用
执行下面的命令会自动使用较小的模型
- 图像方向分类+版面分析+表格识别
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --image_orientation=true
-
版面分析+表格识别
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure
-
版面分析
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --table=false --ocr=false
- 表格识别
paddleocr --image_dir=ppstructure/docs/table/table.jpg --type=structure --layout=false
3.2 Python脚本使用
- 图像方向分类+版面分析+表格识别
import os
import cv2
from paddleocr import PPStructure,draw_structure_result,save_structure_res
table_engine = PPStructure(show_log=True, image_orientation=True)
save_folder = './output'
img_path = 'ppstructure/docs/table/1.png'
img = cv2.imread(img_path)
result = table_engine(img)
save_structure_res(result, save_folder,os.path.basename(img_path).split('.')[0])
for line in result:
line.pop('img')
print(line)
from PIL import Image
font_path = 'doc/fonts/simfang.ttf' # PaddleOCR下提供字体包
image = Image.open(img_path).convert('RGB')
im_show = draw_structure_result(image, result,font_path=font_path)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
- 版面分析+表格识别
import os
import cv2
from paddleocr import PPStructure,draw_structure_result,save_structure_res
table_engine = PPStructure(show_log=True)
save_folder = './output'
img_path = 'ppstructure/docs/table/1.png'
img = cv2.imread(img_path)
result = table_engine(img)
save_structure_res(result, save_folder,os.path.basename(img_path).split('.')[0])
for line in result:
line.pop('img')
print(line)
from PIL import Image
font_path = 'doc/fonts/simfang.ttf' # PaddleOCR下提供字体包
image = Image.open(img_path).convert('RGB')
im_show = draw_structure_result(image, result,font_path=font_path)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
- 版面分析
import os
import cv2
from paddleocr import PPStructure,save_structure_res
table_engine = PPStructure(table=False, ocr=False, show_log=True)
save_folder = './output'
img_path = 'ppstructure/docs/table/1.png'
img = cv2.imread(img_path)
result = table_engine(img)
save_structure_res(result, save_folder, os.path.basename(img_path).split('.')[0])
for line in result:
line.pop('img')
print(line)
- 表格识别
import os
import cv2
from paddleocr import PPStructure,save_structure_res
table_engine = PPStructure(layout=False, show_log=True)
save_folder = './output'
img_path = 'ppstructure/docs/table/table.jpg'
img = cv2.imread(img_path)
result = table_engine(img)
save_structure_res(result, save_folder, os.path.basename(img_path).split('.')[0])
for line in result:
line.pop('img')
print(line)
3.3 返回结果说明
PP-Structure的返回结果为一个dict组成的list,示例如下:
版面分析+表格识别
[
{ 'type': 'Text',
'bbox': [34, 432, 345, 462],
'res': ([[36.0, 437.0, 341.0, 437.0, 341.0, 446.0, 36.0, 447.0], [41.0, 454.0, 125.0, 453.0, 125.0, 459.0, 41.0, 460.0]],
[('Tigure-6. The performance of CNN and IPT models using difforen', 0.90060663), ('Tent ', 0.465441)])
}
]
dict 里各个字段说明如下:
字段 | 说明 |
---|---|
type | 图片区域的类型 |
bbox | 图片区域的在原图的坐标,分别[左上角x,左上角y,右下角x,右下角y] |
res | 图片区域的OCR或表格识别结果。 表格: 一个dict,字段说明如下 html : 表格的HTML字符串在代码使用模式下,前向传入return_ocr_result_in_table=True可以拿到表格中每个文本的检测识别结果,对应为如下字段: boxes : 文本检测坐标rec_res : 文本识别结果。OCR: 一个包含各个单行文字的检测坐标和识别结果的元组 |
运行完成后,每张图片会在output
字段指定的目录下有一个同名目录,图片里的每个表格会存储为一个excel,图片区域会被裁剪之后保存下来,excel文件和图片名为表格在图片里的坐标。
/output/table/1/
└─ res.txt
└─ [454, 360, 824, 658].xlsx 表格识别结果
└─ [16, 2, 828, 305].jpg 被裁剪出的图片区域
└─ [17, 361, 404, 711].xlsx 表格识别结果
分析总结
这里用的表格识别模型是下面的第三个ppstructure_mobile_v2,是目前最好的
性能评估是这样的,在 PubTabNet[1] 评估数据集上的TEDS高达95.89%
- TEDS: 模型对表格信息还原的准确度,此指标评价内容不仅包含表格结构,还包含表格内的文字内容。
文本检测模型和文本识别模型也是最新的
按理说识别效果应该是很好的,然而
我的数据是这样的
识别出来是这样的,有的空行不能很好的识别,有的数据会挤在一行(上面和下面的图不是对应的,只是说一下问题)
官网下面的评论也看到有老哥发的评论和我的问题一样,所以这应该是一个共性问题。
不过识别简单一点的表格效果还是很不错的。
官网:PaddlePaddle: 源于产业实践的开源深度学习平台,飞桨致力于让深度学习技术的创新与应用更简单 (gitee.com)
ppstructure · PaddlePaddle/PaddleOCR - 码云 - 开源中国 (gitee.com)