Skip to content

Commit 6315ee3

Browse files
authored
Merge pull request #2 from RapidAI/adapt_yolo_model
Adapt yolo model
2 parents f6fbb58 + 983d637 commit 6315ee3

File tree

14 files changed

+930
-561
lines changed

14 files changed

+930
-561
lines changed

README.md

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,63 +10,87 @@
1010
</div>
1111

1212
### 最近更新
13+
1314
- **2024.10.15**
1415
- 完成初版代码,包含目标检测,语义分割,角点方向识别三个模块
16+
- **2024.11.2**
17+
- 补充新训练yolo11的目标检测模型和边缘检测模型
18+
- 增加自动下载,轻量化包体积
19+
- 补充onnx-gpu推理支持,给出benchmark测试结果
20+
- 补充在线示例使用
1521

1622
### 简介
17-
💡✨ 强大且高效的表格检测,支持论文、期刊、杂志、发票、收据、签到单等各种表格。
1823

19-
🚀 支持高精度 Paddle 版本和量化 ONNX 版本,单图 CPU 推理仅需 1.5 秒,Paddle-GPU(V100) 仅需 0.2 秒
24+
💡✨ 强大且高效的表格检测,支持论文、期刊、杂志、发票、收据、签到单等各种表格
2025

26+
🚀 支持来源于paddle和yolo的版本,默认模型组合单图 CPU 推理仅需 1.2 秒,onnx-GPU(V100) 最小组合仅需 0.4 秒,paddle-gpu版0.2s
2127
🛠️ 支持三个模块自由组合,独立训练调优,提供 ONNX 转换脚本和微调训练方案。
2228

2329
🌟 whl 包轻松集成使用,为下游 OCR、表格识别和数据采集提供强力支撑。
2430

25-
📚参考项目 [百度表格检测大赛第2名方案](https://aistudio.baidu.com/projectdetail/5398861?searchKeyword=%E8%A1%A8%E6%A0%BC%E6%A3%80%E6%B5%8B%E5%A4%A7%E8%B5%9B&searchTab=ALL) 的实现方案,补充大量真实场景数据再训练
31+
📚参考项目 [百度表格检测大赛第2名方案](https://aistudio.baidu.com/projectdetail/5398861?searchKeyword=%E8%A1%A8%E6%A0%BC%E6%A3%80%E6%B5%8B%E5%A4%A7%E8%B5%9B&searchTab=ALL)
32+
的实现方案,补充大量真实场景数据再训练
2633
![img.png](readme_resource/structure.png)
2734
👇🏻训练数据集在致谢, 作者天天上班摸鱼搞开源,希望大家点个⭐️支持一下
2835

2936
### 使用建议
37+
3038
📚 文档场景: 无透视旋转,只使用目标检测\
3139
📷 拍照场景小角度旋转(-90~90): 默认左上角,不使用角点方向识别\
3240
🔍 使用在线体验找到适合你场景的模型组合
33-
### 在线体验
3441

42+
### 在线体验
3543

3644
### 效果展示
45+
3746
![res_show.jpg](readme_resource/res_show.jpg)![res_show2.jpg](readme_resource/res_show2.jpg)
47+
3848
### 安装
39-
为简化使用,已经将最小的量化模型打包到 rapid_table_det 中,需要更高精度或gpu推理,请自行下载对应模型
40-
🪜下载模型 [modescope模型仓](https://www.modelscope.cn/models/jockerK/TableExtractor) [release assets](https://github.com/Joker1212/RapidTableDetection/releases/tag/v0.0.0)
49+
50+
🪜模型会自动下载,也可以自己去仓库下载 [modescope模型仓](https://www.modelscope.cn/models/jockerK/TableExtractor)
51+
4152
``` python {linenos=table}
4253
# 建议使用清华源安装 https://pypi.tuna.tsinghua.edu.cn/simple
4354
pip install rapid-table-det
4455
```
4556

4657
#### 参数说明
47-
cpu和gpu的初始化完全一致
48-
```
49-
table_det = TableDetector(
50-
# 目标检测表格模型
51-
obj_model_path="models/obj_det_paddle(obj_det.onnx)",
52-
# 边角检测表格模型(从复杂环境得到表格多边形框)
53-
edge_model_path="models/edge_det_paddle(edge_det.onnx)",
54-
# 角点方向识别
55-
cls_model_path="models/cls_det_paddle(cls_det.onnx)",
56-
# 文档场景已经由版面识别模型提取设置为False
57-
use_obj_det=True,
58-
# 只有90,180,270大角度旋转且无透视时候设置为False
59-
use_edge_det=True,
60-
# 小角度(-90~90)旋转设置为False
61-
use_cls_det=True,
62-
)
63-
```
58+
59+
默认值
60+
use_cuda: False : 启用gpu加速推理 \
61+
obj_model_type="yolo_obj_det", \
62+
edge_model_type= "yolo_edge_det", \
63+
cls_model_type= "paddle_cls_det"
64+
65+
由于onnx使用gpu加速效果有限,还是建议直接使用yolox或安装paddle来执行模型会快很多(有需要我再补充整体流程)
66+
paddle的s模型由于量化导致反而速度降低和精度降低,但是模型大小减少很多
67+
68+
| `model_type` | 任务类型 | 训练来源 | 大小 | 单表格耗时(v100-16G,cuda12,cudnn9,ubuntu) |
69+
|:---------------------|:-------|:-------------------------------------|:-------|:-------------------------------------|
70+
| **yolo_obj_det** | 表格目标检测 | `yolo11-l` | `100m` | `cpu:570ms, gpu:400ms` |
71+
| `paddle_obj_det` | 表格目标检测 | `paddle yoloe-plus-x` | `380m` | `cpu:1000ms, gpu:300ms` |
72+
| `paddle_obj_det_s` | 表格目标检测 | `paddle yoloe-plus-x + quantization` | `95m` | `cpu:1200ms, gpu:1000ms` |
73+
| **yolo_edge_det** | 语义分割 | `yolo11-l-segment` | `108m` | `cpu:570ms, gpu:200ms` |
74+
| `yolo_edge_det_s` | 语义分割 | `yolo11-s-segment` | `11m` | `cpu:260ms, gpu:200ms` |
75+
| `paddle_edge_det` | 语义分割 | `paddle-dbnet` | `99m` | `cpu:1200ms, gpu:120ms` |
76+
| `paddle_edge_det_s` | 语义分割 | `paddle-dbnet + quantization` | `25m` | `cpu:860ms, gpu:760ms` |
77+
| **paddle_cls_det** | 方向分类 | `paddle pplcnet` | `6.5m` | `cpu:70ms, gpu:60ms` |
78+
79+
80+
执行参数
81+
det_accuracy=0.7,
82+
use_obj_det=True,
83+
use_edge_det=True,
84+
use_cls_det=True,
6485

6586
### 快速使用
87+
6688
``` python {linenos=table}
6789
from rapid_table_det.inference import TableDetector
68-
table_det = TableDetector()
90+
6991
img_path = f"tests/test_files/chip.jpg"
92+
table_det = TableDetector()
93+
7094
result, elapse = table_det(img_path)
7195
obj_det_elapse, edge_elapse, rotate_det_elapse = elapse
7296
print(
@@ -75,7 +99,8 @@ print(
7599
# 输出可视化
76100
# import os
77101
# import cv2
78-
# from rapid_table_det.utils import img_loader, visuallize, extract_table_img
102+
# from rapid_table_det.utils.visuallize import img_loader, visuallize, extract_table_img
103+
#
79104
# img = img_loader(img_path)
80105
# file_name_with_ext = os.path.basename(img_path)
81106
# file_name, file_ext = os.path.splitext(file_name_with_ext)
@@ -94,7 +119,7 @@ print(
94119
# cv2.imwrite(f"{out_dir}/{file_name}-visualize.jpg", img)
95120

96121
```
97-
### gpu版本使用
122+
### paddle版本使用
98123
必须下载模型,指定模型位置!
99124
``` python {linenos=table}
100125
# 建议使用清华源安装 https://pypi.tuna.tsinghua.edu.cn/simple
@@ -138,24 +163,25 @@ print(
138163

139164
```
140165

141-
142166
## FAQ (Frequently Asked Questions)
143167

144168
1. **问:如何微调模型适应特定场景?**
145-
- 答:直接参考这个项目,有非常详细的可视化操作步骤,可以得到paddle的推理模型 [百度表格检测大赛](https://aistudio.baidu.com/projectdetail/5398861?searchKeyword=%E8%A1%A8%E6%A0%BC%E6%A3%80%E6%B5%8B%E5%A4%A7%E8%B5%9B&searchTab=ALL)
146-
169+
- 答:直接参考这个项目,有非常详细的可视化操作步骤,数据集也在里面,可以得到paddle的推理模型 [百度表格检测大赛](https://aistudio.baidu.com/projectdetail/5398861?searchKeyword=%E8%A1%A8%E6%A0%BC%E6%A3%80%E6%B5%8B%E5%A4%A7%E8%B5%9B&searchTab=ALL),
170+
- yolo11的训练使用官方脚本足够简单,按官方指导转换为coco格式训练即可
147171
2. **问:如何导出onnx**
148-
- 答:在本项目tools下,有onnx_transform.ipynb文件,可以照步骤执行(因为pp-yoloe导出onnx有bug一直没修,这里我自己写了一个fix_onnx脚本改动onnx模型节点来临时解决了)
149-
172+
- 答:paddle模型需要在本项目tools下,有onnx_transform.ipynb文件
173+
yolo11的话,直接参照官方的方式一行搞定
150174
3. **问:图片有扭曲可以修正吗?**
151175
- 答:本项目只解决旋转和透视场景的表格提取,对于扭曲的场景,需要先进行扭曲修正
152176

153177
### 致谢
178+
154179
[百度表格检测大赛第2名方案](https://aistudio.baidu.com/projectdetail/5398861?searchKeyword=%E8%A1%A8%E6%A0%BC%E6%A3%80%E6%B5%8B%E5%A4%A7%E8%B5%9B&searchTab=ALL) \
155180
[WTW 自然场景表格数据集](https://tianchi.aliyun.com/dataset/108587) \
156181
[FinTabNet PDF文档表格数据集](https://developer.ibm.com/exchanges/data/all/fintabnet/) \
157182
[TableBank 表格数据集](https://doc-analysis.github.io/tablebank-page/) \
158183
[TableGeneration 表格自动生成工具](https://github.com/WenmuZhou/TableGeneration)
184+
159185
### 贡献指南
160186

161187
欢迎提交请求。对于重大更改,请先打开issue讨论您想要改变的内容。

demo_onnx.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
from rapid_table_det.inference import TableDetector
22

3-
img_path = f"tests/test_files/chip2.jpg"
3+
img_path = f"images/weixin.png"
44
table_det = TableDetector(
5-
obj_model_path="rapid_table_det/models/obj_det.onnx",
6-
edge_model_path="rapid_table_det/models/edge_det.onnx",
5+
obj_model_type="paddle_obj_det_s", edge_model_type="paddle_edge_det_s"
76
)
7+
88
result, elapse = table_det(img_path)
99
obj_det_elapse, edge_elapse, rotate_det_elapse = elapse
1010
print(
1111
f"obj_det_elapse:{obj_det_elapse}, edge_elapse={edge_elapse}, rotate_det_elapse={rotate_det_elapse}"
1212
)
1313
# 输出可视化
14-
import os
15-
import cv2
16-
from rapid_table_det.utils import img_loader, visuallize, extract_table_img
17-
18-
img = img_loader(img_path)
19-
file_name_with_ext = os.path.basename(img_path)
20-
file_name, file_ext = os.path.splitext(file_name_with_ext)
21-
out_dir = "rapid_table_det/outputs"
22-
if not os.path.exists(out_dir):
23-
os.makedirs(out_dir)
24-
extract_img = img.copy()
25-
for i, res in enumerate(result):
26-
box = res["box"]
27-
lt, rt, rb, lb = res["lt"], res["rt"], res["rb"], res["lb"]
28-
# 带识别框和左上角方向位置
29-
img = visuallize(img, box, lt, rt, rb, lb)
30-
# 透视变换提取表格图片
31-
wrapped_img = extract_table_img(extract_img.copy(), lt, rt, rb, lb)
32-
cv2.imwrite(f"{out_dir}/{file_name}-extract-{i}.jpg", wrapped_img)
33-
cv2.imwrite(f"{out_dir}/{file_name}-visualize.jpg", img)
14+
# import os
15+
# import cv2
16+
# from rapid_table_det.utils.visuallize import img_loader, visuallize, extract_table_img
17+
#
18+
# img = img_loader(img_path)
19+
# file_name_with_ext = os.path.basename(img_path)
20+
# file_name, file_ext = os.path.splitext(file_name_with_ext)
21+
# out_dir = "rapid_table_det/outputs"
22+
# if not os.path.exists(out_dir):
23+
# os.makedirs(out_dir)
24+
# extract_img = img.copy()
25+
# for i, res in enumerate(result):
26+
# box = res["box"]
27+
# lt, rt, rb, lb = res["lt"], res["rt"], res["rb"], res["lb"]
28+
# # 带识别框和左上角方向位置
29+
# img = visuallize(img, box, lt, rt, rb, lb)
30+
# # 透视变换提取表格图片
31+
# wrapped_img = extract_table_img(extract_img.copy(), lt, rt, rb, lb)
32+
# cv2.imwrite(f"{out_dir}/{file_name}-extract-{i}.jpg", wrapped_img)
33+
# cv2.imwrite(f"{out_dir}/{file_name}-visualize.jpg", img)

rapid_table_det/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,3 @@
22
# @Author: Jocker1212
33
# @Contact: xinyijianggo@gmail.com
44
from .inference import TableDetector
5-
from .utils import img_loader, visuallize, extract_table_img
6-
7-
#
8-
__all__ = ["TableDetector", "img_loader", "visuallize", "extract_table_img"]

0 commit comments

Comments
 (0)