提交 9c424ff1 编写于 作者: A an1018

update doc

上级 d5d78b48
...@@ -16,5 +16,6 @@ from .paddleocr import * ...@@ -16,5 +16,6 @@ from .paddleocr import *
__version__ = paddleocr.VERSION __version__ = paddleocr.VERSION
__all__ = [ __all__ = [
'PaddleOCR', 'PPStructure', 'draw_ocr', 'draw_structure_result', 'PaddleOCR', 'PPStructure', 'draw_ocr', 'draw_structure_result',
'save_structure_res', 'download_with_progressbar' 'save_structure_res', 'download_with_progressbar', 'sorted_layout_boxes',
'convert_info_docx'
] ]
...@@ -20,16 +20,16 @@ PaddleOCR提供2种服务部署方式: ...@@ -20,16 +20,16 @@ PaddleOCR提供2种服务部署方式:
# 基于PaddleHub Serving的服务部署 # 基于PaddleHub Serving的服务部署
hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,表格识别、PP-Structure和版面分析七种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下: hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,版面分析、表格识别和PP-Structure七种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下:
``` ```
deploy/hubserving/ deploy/hubserving/
└─ ocr_cls 文本方向分类模块服务包 └─ ocr_cls 文本方向分类模块服务包
└─ ocr_det 文本检测模块服务包 └─ ocr_det 文本检测模块服务包
└─ ocr_rec 文本识别模块服务包 └─ ocr_rec 文本识别模块服务包
└─ ocr_system 文本检测+文本方向分类+文本识别串联服务包 └─ ocr_system 文本检测+文本方向分类+文本识别串联服务包
└─ structure_layout 版面分析服务包
└─ structure_table 表格识别服务包 └─ structure_table 表格识别服务包
└─ structure_system PP-Structure服务包 └─ structure_system PP-Structure服务包
└─ structure_layout 版面分析服务包
``` ```
每个服务包下包含3个文件。以2阶段串联服务包为例,目录如下: 每个服务包下包含3个文件。以2阶段串联服务包为例,目录如下:
...@@ -42,9 +42,9 @@ deploy/hubserving/ocr_system/ ...@@ -42,9 +42,9 @@ deploy/hubserving/ocr_system/
``` ```
## 1. 近期更新 ## 1. 近期更新
* 2022.08.23 新增版面分析服务。
* 2022.05.05 新增PP-OCRv3检测和识别模型。 * 2022.05.05 新增PP-OCRv3检测和识别模型。
* 2022.03.30 新增PP-Structure和表格识别两种服务。 * 2022.03.30 新增PP-Structure和表格识别两种服务。
* 2022.08.23 新增版面分析服务。
## 2. 快速启动服务 ## 2. 快速启动服务
以下步骤以检测+识别2阶段串联服务为例,如果只需要检测服务或识别服务,替换相应文件路径即可。 以下步骤以检测+识别2阶段串联服务为例,如果只需要检测服务或识别服务,替换相应文件路径即可。
......
...@@ -20,16 +20,16 @@ PaddleOCR provides 2 service deployment methods: ...@@ -20,16 +20,16 @@ PaddleOCR provides 2 service deployment methods:
# Service deployment based on PaddleHub Serving # Service deployment based on PaddleHub Serving
The hubserving service deployment directory includes seven service packages: text detection, text angle class, text recognition, text detection+text angle class+text recognition three-stage series connection, table recognition, PP-Structure and layout analysis. Please select the corresponding service package to install and start service according to your needs. The directory is as follows: The hubserving service deployment directory includes seven service packages: text detection, text angle class, text recognition, text detection+text angle class+text recognition three-stage series connection, layout analysis, table recognition and PP-Structure. Please select the corresponding service package to install and start service according to your needs. The directory is as follows:
``` ```
deploy/hubserving/ deploy/hubserving/
└─ ocr_det text detection module service package └─ ocr_det text detection module service package
└─ ocr_cls text angle class module service package └─ ocr_cls text angle class module service package
└─ ocr_rec text recognition module service package └─ ocr_rec text recognition module service package
└─ ocr_system text detection+text angle class+text recognition three-stage series connection service package └─ ocr_system text detection+text angle class+text recognition three-stage series connection service package
└─ structure_layout layout analysis service package
└─ structure_table table recognition service package └─ structure_table table recognition service package
└─ structure_system PP-Structure service package └─ structure_system PP-Structure service package
└─ structure_layout layout analysis service package
``` ```
Each service pack contains 3 files. Take the 2-stage series connection service package as an example, the directory is as follows: Each service pack contains 3 files. Take the 2-stage series connection service package as an example, the directory is as follows:
......
...@@ -562,7 +562,7 @@ class PPStructure(StructureSystem): ...@@ -562,7 +562,7 @@ class PPStructure(StructureSystem):
params.table_model_dir, params.table_model_dir,
os.path.join(BASE_DIR, 'whl', 'table'), table_model_config['url']) os.path.join(BASE_DIR, 'whl', 'table'), table_model_config['url'])
layout_model_config = get_model_config( layout_model_config = get_model_config(
'STRUCTURE', params.structure_version, 'layout', 'ch') 'STRUCTURE', params.structure_version, 'layout', lang)
params.layout_model_dir, layout_url = confirm_model_dir_url( params.layout_model_dir, layout_url = confirm_model_dir_url(
params.layout_model_dir, params.layout_model_dir,
os.path.join(BASE_DIR, 'whl', 'layout'), layout_model_config['url']) os.path.join(BASE_DIR, 'whl', 'layout'), layout_model_config['url'])
...@@ -584,7 +584,7 @@ class PPStructure(StructureSystem): ...@@ -584,7 +584,7 @@ class PPStructure(StructureSystem):
logger.debug(params) logger.debug(params)
super().__init__(params) super().__init__(params)
def __call__(self, img, return_ocr_result_in_table=False): def __call__(self, img, return_ocr_result_in_table=False, img_idx=0):
if isinstance(img, str): if isinstance(img, str):
# download net image # download net image
if img.startswith('http'): if img.startswith('http'):
...@@ -602,7 +602,8 @@ class PPStructure(StructureSystem): ...@@ -602,7 +602,8 @@ class PPStructure(StructureSystem):
if isinstance(img, np.ndarray) and len(img.shape) == 2: if isinstance(img, np.ndarray) and len(img.shape) == 2:
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
res, _ = super().__call__(img, return_ocr_result_in_table) res, _ = super().__call__(
img, return_ocr_result_in_table, img_idx=img_idx)
return res return res
...@@ -637,25 +638,54 @@ def main(): ...@@ -637,25 +638,54 @@ def main():
for line in result: for line in result:
logger.info(line) logger.info(line)
elif args.type == 'structure': elif args.type == 'structure':
result = engine(img_path) img, flag_gif, flag_pdf = check_and_read(img_path)
save_structure_res(result, args.output, img_name) if not flag_gif and not flag_pdf:
img = cv2.imread(img_path)
if args.recovery: if not flag_pdf:
try: if img is None:
from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx logger.error("error in loading image:{}".format(image_file))
img = cv2.imread(img_path) continue
img_paths = [[img_path, img]]
else:
img_paths = []
for index, pdf_img in enumerate(img):
os.makedirs(
os.path.join(args.output, img_name), exist_ok=True)
pdf_img_path = os.path.join(args.output, img_name, img_name
+ '_' + str(index) + '.jpg')
cv2.imwrite(pdf_img_path, pdf_img)
img_paths.append([pdf_img_path, pdf_img])
all_res = []
for index, (new_img_path, img) in enumerate(img_paths):
logger.info('processing {}/{} page:'.format(index + 1,
len(img_paths)))
new_img_name = os.path.basename(new_img_path).split('.')[0]
result = engine(new_img_path, img_idx=index)
save_structure_res(result, args.output, img_name, index)
if args.recovery and result != []:
from copy import deepcopy
from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes
h, w, _ = img.shape h, w, _ = img.shape
res = sorted_layout_boxes(result, w) result_cp = deepcopy(result)
convert_info_docx(img, res, args.output, img_name, result_sorted = sorted_layout_boxes(result_cp, w)
all_res += result_sorted
for item in result:
item.pop('img')
item.pop('res')
logger.info(item)
logger.info('result save to {}'.format(args.output))
if args.recovery and all_res != []:
try:
from ppstructure.recovery.recovery_to_doc import convert_info_docx
convert_info_docx(img, all_res, args.output, img_name,
args.save_pdf) args.save_pdf)
except Exception as ex: except Exception as ex:
logger.error( logger.error(
"error in layout recovery image:{}, err msg: {}".format( "error in layout recovery image:{}, err msg: {}".format(
img_name, ex)) img_name, ex))
continue continue
for item in result:
item.pop('img')
item.pop('res')
logger.info(item)
logger.info('result save to {}'.format(args.output))
...@@ -102,6 +102,8 @@ paddleocr --image_dir=ppstructure/docs/table/table.jpg --type=structure --layout ...@@ -102,6 +102,8 @@ paddleocr --image_dir=ppstructure/docs/table/table.jpg --type=structure --layout
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --recovery=true paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --recovery=true
# 英文测试图 # 英文测试图
paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --recovery=true --lang='en' paddleocr --image_dir=ppstructure/docs/table/1.png --type=structure --recovery=true --lang='en'
# pdf测试文件
paddleocr --image_dir=ppstructure/recovery/UnrealText.pdf --type=structure --recovery=true --lang='en'
``` ```
<a name="22"></a> <a name="22"></a>
......
...@@ -85,6 +85,8 @@ Please refer to: [Key Information Extraction](../kie/README.md) . ...@@ -85,6 +85,8 @@ Please refer to: [Key Information Extraction](../kie/README.md) .
paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true
# English pic # English pic
paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true --lang='en' paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true --lang='en'
# pdf file
paddleocr --image_dir=ppstructure/recovery/UnrealText.pdf --type=structure --recovery=true --lang='en'
``` ```
<a name="22"></a> <a name="22"></a>
......
...@@ -160,11 +160,13 @@ json文件包含所有图像的标注,数据以字典嵌套的方式存放, ...@@ -160,11 +160,13 @@ json文件包含所有图像的标注,数据以字典嵌套的方式存放,
``` ```
mkdir pretrained_model mkdir pretrained_model
cd pretrained_model cd pretrained_model
# 下载PubLayNet预训练模型 # 下载PubLayNet预训练模型(直接体验模型评估、预测、动转静)
wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_layout.pdparams wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout.pdparams
# 下载PubLaynet推理模型(直接体验模型推理)
wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar
``` ```
下载更多[版面分析模型](../docs/models_list.md)(中文CDLA数据集预训练模型、表格预训练模型) 如果测试图片为中文,可以下载中文CDLA数据集的预训练模型,识别10类文档区域:Table、Figure、Figure caption、Table、Table caption、Header、Footer、Reference、Equation,在[版面分析模型](../docs/models_list.md)中下载`picodet_lcnet_x1_0_fgd_layout_cdla`模型的训练模型和推理模型。如果只检测图片中的表格区域,可以下载表格数据集的预训练模型,在[版面分析模型](../docs/models_list.md)中下载`picodet_lcnet_x1_0_fgd_layout_table`模型的训练模型和推理模型。
### 4.1. 启动训练 ### 4.1. 启动训练
...@@ -216,14 +218,14 @@ TestDataset: ...@@ -216,14 +218,14 @@ TestDataset:
# 单卡训练 # 单卡训练
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python3 tools/train.py \ python3 tools/train.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--eval --eval
# 多卡训练,通过--gpus参数指定卡号 # 多卡训练,通过--gpus参数指定卡号
export CUDA_VISIBLE_DEVICES=0,1,2,3 export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py \ python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--eval --eval
``` ```
**注意:**如果训练时显存out memory,将TrainReader中batch_size调小,同时LearningRate中base_lr等比例减小。发布的config均由8卡训练得到,如果改变GPU卡数为1,那么base_lr需要减小8倍。 **注意:**如果训练时显存out memory,将TrainReader中batch_size调小,同时LearningRate中base_lr等比例减小。发布的config均由8卡训练得到,如果改变GPU卡数为1,那么base_lr需要减小8倍。
...@@ -252,9 +254,9 @@ PaddleDetection支持了基于FGD([Focal and Global Knowledge Distillation for D ...@@ -252,9 +254,9 @@ PaddleDetection支持了基于FGD([Focal and Global Knowledge Distillation for D
# 单卡训练 # 单卡训练
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
python3 tools/train.py \ python3 tools/train.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \
--eval --eval
``` ```
- `-c`: 指定模型配置文件。 - `-c`: 指定模型配置文件。
...@@ -269,8 +271,8 @@ python3 tools/train.py \ ...@@ -269,8 +271,8 @@ python3 tools/train.py \
```bash ```bash
# GPU 评估, weights 为待测权重 # GPU 评估, weights 为待测权重
python3 tools/eval.py \ python3 tools/eval.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
-o weights=./output/picodet_lcnet_x1_0_layout/best_model -o weights=./output/picodet_lcnet_x1_0_layout/best_model
``` ```
会输出以下信息,打印出mAP、AP0.5等信息。 会输出以下信息,打印出mAP、AP0.5等信息。
...@@ -292,13 +294,13 @@ python3 tools/eval.py \ ...@@ -292,13 +294,13 @@ python3 tools/eval.py \
[08/15 07:07:09] ppdet.engine INFO: Best test bbox ap is 0.935. [08/15 07:07:09] ppdet.engine INFO: Best test bbox ap is 0.935.
``` ```
使用FGD蒸馏模型进行评估: 若使用**提供的预训练模型进行评估**,或使用**FGD蒸馏训练的模型**,更换`weights`模型路径,执行如下命令进行评估:
``` ```
python3 tools/eval.py \ python3 tools/eval.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \
-o weights=output/picodet_lcnet_x2_5_layout/best_model -o weights=output/picodet_lcnet_x2_5_layout/best_model
``` ```
- `-c`: 指定模型配置文件。 - `-c`: 指定模型配置文件。
...@@ -325,18 +327,16 @@ python3 tools/infer.py \ ...@@ -325,18 +327,16 @@ python3 tools/infer.py \
- `--output_dir`: 指定可视化结果保存路径。 - `--output_dir`: 指定可视化结果保存路径。
- `--draw_threshold`:指定绘制结果框的NMS阈值。 - `--draw_threshold`:指定绘制结果框的NMS阈值。
预测图片如下所示,图片会存储在`output_dir`路径中。 若使用**提供的预训练模型进行预测**,或使用**FGD蒸馏训练的模型**,更换`weights`模型路径,执行如下命令进行预测:
使用FGD蒸馏模型进行测试:
``` ```
python3 tools/infer.py \ python3 tools/infer.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \
-o weights='output/picodet_lcnet_x2_5_layout/best_model.pdparams' \ -o weights='output/picodet_lcnet_x2_5_layout/best_model.pdparams' \
--infer_img='docs/images/layout.jpg' \ --infer_img='docs/images/layout.jpg' \
--output_dir=output_dir/ \ --output_dir=output_dir/ \
--draw_threshold=0.5 --draw_threshold=0.5
``` ```
...@@ -351,9 +351,9 @@ inference 模型(`paddle.jit.save`保存的模型) 一般是模型训练, ...@@ -351,9 +351,9 @@ inference 模型(`paddle.jit.save`保存的模型) 一般是模型训练,
```bash ```bash
python3 tools/export_model.py \ python3 tools/export_model.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
-o weights=output/picodet_lcnet_x1_0_layout/best_model \ -o weights=output/picodet_lcnet_x1_0_layout/best_model \
--output_dir=output_inference/ --output_dir=output_inference/
``` ```
* 如无需导出后处理,请指定:`-o export.benchmark=True`(如果-o已出现过,此处删掉-o) * 如无需导出后处理,请指定:`-o export.benchmark=True`(如果-o已出现过,此处删掉-o)
...@@ -368,27 +368,27 @@ output_inference/picodet_lcnet_x1_0_layout/ ...@@ -368,27 +368,27 @@ output_inference/picodet_lcnet_x1_0_layout/
└── model.pdmodel # inference模型的模型结构文件 └── model.pdmodel # inference模型的模型结构文件
``` ```
FGD蒸馏模型转inference模型步骤如下: 若使用**提供的预训练模型转Inference模型**,或使用**FGD蒸馏训练的模型**,更换`weights`模型路径,模型转inference模型步骤如下:
```bash ```bash
python3 tools/export_model.py \ python3 tools/export_model.py \
-c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \ -c configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x1_0_layout.yml \
--slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \ --slim_config configs/picodet/legacy_model/application/layout_analysis/picodet_lcnet_x2_5_layout.yml \
-o weights=./output/picodet_lcnet_x2_5_layout/best_model \ -o weights=./output/picodet_lcnet_x2_5_layout/best_model \
--output_dir=output_inference/ --output_dir=output_inference/
``` ```
### 6.2 模型推理 ### 6.2 模型推理
版面恢复任务进行推理,可以执行如下命令 若使用**提供的推理训练模型推理**,或使用**FGD蒸馏训练的模型**,更换`model_dir`推理模型路径,执行如下命令进行推理
```bash ```bash
python3 deploy/python/infer.py \ python3 deploy/python/infer.py \
--model_dir=output_inference/picodet_lcnet_x1_0_layout/ \ --model_dir=output_inference/picodet_lcnet_x1_0_layout/ \
--image_file=docs/images/layout.jpg \ --image_file=docs/images/layout.jpg \
--device=CPU --device=CPU
``` ```
- --device:指定GPU、CPU设备 - --device:指定GPU、CPU设备
......
...@@ -227,65 +227,39 @@ def main(args): ...@@ -227,65 +227,39 @@ def main(args):
if img is None: if img is None:
logger.error("error in loading image:{}".format(image_file)) logger.error("error in loading image:{}".format(image_file))
continue continue
res, time_dict = structure_sys(img) imgs = [img]
else:
imgs = img
if structure_sys.mode == 'structure': all_res = []
save_structure_res(res, save_folder, img_name) for index, img in enumerate(imgs):
res, time_dict = structure_sys(img, img_idx=index)
if structure_sys.mode == 'structure' and res != []:
save_structure_res(res, save_folder, img_name, index)
draw_img = draw_structure_result(img, res, args.vis_font_path) draw_img = draw_structure_result(img, res, args.vis_font_path)
img_save_path = os.path.join(save_folder, img_name, 'show.jpg') img_save_path = os.path.join(save_folder, img_name,
'show_{}.jpg'.format(index))
elif structure_sys.mode == 'kie': elif structure_sys.mode == 'kie':
raise NotImplementedError raise NotImplementedError
# draw_img = draw_ser_results(img, res, args.vis_font_path) # draw_img = draw_ser_results(img, res, args.vis_font_path)
# img_save_path = os.path.join(save_folder, img_name + '.jpg') # img_save_path = os.path.join(save_folder, img_name + '.jpg')
cv2.imwrite(img_save_path, draw_img) if res != []:
logger.info('result save to {}'.format(img_save_path)) cv2.imwrite(img_save_path, draw_img)
if args.recovery: logger.info('result save to {}'.format(img_save_path))
try: if args.recovery and res != []:
from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx
h, w, _ = img.shape h, w, _ = img.shape
res = sorted_layout_boxes(res, w) res = sorted_layout_boxes(res, w)
convert_info_docx(img, res, save_folder, img_name, all_res += res
args.save_pdf)
except Exception as ex:
logger.error(
"error in layout recovery image:{}, err msg: {}".format(
image_file, ex))
continue
else:
pdf_imgs = img
all_res = []
for index, img in enumerate(pdf_imgs):
res, time_dict = structure_sys(img, index)
if structure_sys.mode == 'structure' and res != []:
save_structure_res(res, save_folder, img_name, index)
draw_img = draw_structure_result(img, res,
args.vis_font_path)
img_save_path = os.path.join(save_folder, img_name,
'show_{}.jpg'.format(index))
elif structure_sys.mode == 'kie':
raise NotImplementedError
# draw_img = draw_ser_results(img, res, args.vis_font_path)
# img_save_path = os.path.join(save_folder, img_name + '.jpg')
if res != []:
cv2.imwrite(img_save_path, draw_img)
logger.info('result save to {}'.format(img_save_path))
if args.recovery and res != []:
from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx
h, w, _ = img.shape
res = sorted_layout_boxes(res, w)
all_res += res
if args.recovery and all_res != []:
try:
convert_info_docx(img, all_res, save_folder, img_name,
args.save_pdf)
except Exception as ex:
logger.error(
"error in layout recovery image:{}, err msg: {}".format(
image_file, ex))
continue
if args.recovery and all_res != []:
try:
convert_info_docx(img, all_res, save_folder, img_name,
args.save_pdf)
except Exception as ex:
logger.error("error in layout recovery image:{}, err msg: {}".
format(image_file, ex))
continue
logger.info("Predict time : {:.3f}s".format(time_dict['all'])) logger.info("Predict time : {:.3f}s".format(time_dict['all']))
......
...@@ -8,6 +8,7 @@ English | [简体中文](README_ch.md) ...@@ -8,6 +8,7 @@ English | [简体中文](README_ch.md)
- [3. Quick Start](#3) - [3. Quick Start](#3)
- [3.1 Download models](#3.1) - [3.1 Download models](#3.1)
- [3.2 Layout recovery](#3.2) - [3.2 Layout recovery](#3.2)
- [4. More](#4)
<a name="1"></a> <a name="1"></a>
...@@ -15,13 +16,16 @@ English | [简体中文](README_ch.md) ...@@ -15,13 +16,16 @@ English | [简体中文](README_ch.md)
Layout recovery means that after OCR recognition, the content is still arranged like the original document pictures, and the paragraphs are output to word document in the same order. Layout recovery means that after OCR recognition, the content is still arranged like the original document pictures, and the paragraphs are output to word document in the same order.
Layout recovery combines [layout analysis](../layout/README.md)[table recognition](../table/README.md) to better recover images, tables, titles, etc. Layout recovery combines [layout analysis](../layout/README.md)[table recognition](../table/README.md) to better recover images, tables, titles, etc. supports input files in PDF and document image formats in Chinese and English. The following figure shows the effect of restoring the layout of English and Chinese documents:
The following figure shows the result:
<div align="center"> <div align="center">
<img src="../docs/recovery/recovery.jpg" width = "700" /> <img src="../docs/recovery/recovery.jpg" width = "700" />
</div> </div>
<div align="center">
<img src="../docs/recovery/recovery_ch.jpg" width = "800" />
</div>
<a name="2"></a> <a name="2"></a>
## 2. Install ## 2. Install
...@@ -35,7 +39,7 @@ The following figure shows the result: ...@@ -35,7 +39,7 @@ The following figure shows the result:
```bash ```bash
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
# GPU installation # If you have cuda9 or cuda10 installed on your machine, please run the following command to install
python3 -m pip install "paddlepaddle-gpu" -i https://mirror.baidu.com/pypi/simple python3 -m pip install "paddlepaddle-gpu" -i https://mirror.baidu.com/pypi/simple
# CPU installation # CPU installation
...@@ -62,6 +66,8 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR ...@@ -62,6 +66,8 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR
- **(2) Install recovery's `requirements`** - **(2) Install recovery's `requirements`**
The layout restoration is exported as docx and PDF files, so python-docx and docx2pdf API need to be installed, and fitz and PyMuPDF apis need to be installed to process the input files in pdf format.
```bash ```bash
python3 -m pip install -r ppstructure/recovery/requirements.txt python3 -m pip install -r ppstructure/recovery/requirements.txt
```` ````
...@@ -70,6 +76,16 @@ python3 -m pip install -r ppstructure/recovery/requirements.txt ...@@ -70,6 +76,16 @@ python3 -m pip install -r ppstructure/recovery/requirements.txt
## 3. Quick Start ## 3. Quick Start
Through layout analysis, we divided the image/PDF documents into regions, located the key regions, such as text, table, picture, etc., and recorded the location, category, and regional pixel value information of each region. Different regions are processed separately, where:
- OCR detection and recognition is performed in the text area, and the coordinates of the OCR detection box and the text content information are added on the basis of the previous information
- The table area identifies tables and records html and text information of tables
- Save the image directly
We can restore the test picture through the layout information, OCR detection and recognition structure, table information, and saved pictures.
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 Download models ### 3.1 Download models
...@@ -85,9 +101,11 @@ https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar && ta ...@@ -85,9 +101,11 @@ https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar && ta
# Download the recognition model of the ultra-lightweight English PP-OCRv3 model and unzip it # Download the recognition model of the ultra-lightweight English PP-OCRv3 model and unzip it
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar && tar xf en_PP-OCRv3_rec_infer.tar wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar && tar xf en_PP-OCRv3_rec_infer.tar
# Download the ultra-lightweight English table inch model and unzip it # Download the ultra-lightweight English table inch model and unzip it
wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/en_ppstructure_mobile_v2.0_SLANet_infer.tar && tar xf en_ppstructure_mobile_v2.0_SLANet_infer.tar wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/en_ppstructure_mobile_v2.0_SLANet_infer.tar
tar xf en_ppstructure_mobile_v2.0_SLANet_infer.tar
# Download the layout model of publaynet dataset and unzip it # Download the layout model of publaynet dataset and unzip it
wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar && tar xf picodet_lcnet_x1_0_fgd_layout_infer.tar wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar
tar xf picodet_lcnet_x1_0_fgd_layout_infer.tar
cd .. cd ..
``` ```
If input is Chinese document,download Chinese models: If input is Chinese document,download Chinese models:
...@@ -128,3 +146,15 @@ Field: ...@@ -128,3 +146,15 @@ Field:
- recovery:whether to enable layout of recovery, default False - recovery:whether to enable layout of recovery, default False
- save_pdf:when recovery file, whether to save pdf file, default False - save_pdf:when recovery file, whether to save pdf file, default False
- output:save the recovery result path - output:save the recovery result path
<a name="4"></a>
## 4. More
For training, evaluation and inference tutorial for text detection models, please refer to [text detection doc](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_ch/detection.md).
For training, evaluation and inference tutorial for text recognition models, please refer to [text recognition doc](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_ch/recognition.md).
For training, evaluation and inference tutorial for layout analysis models, please refer to [layout analysis doc](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppstructure/layout/README_ch.md)
For training, evaluation and inference tutorial for table recognition models, please refer to [table recognition doc](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppstructure/table/README_ch.md)
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
- [3. 使用](#3) - [3. 使用](#3)
- [3.1 下载模型](#3.1) - [3.1 下载模型](#3.1)
- [3.2 版面恢复](#3.2) - [3.2 版面恢复](#3.2)
- [4. 更多](#4)
<a name="1"></a> <a name="1"></a>
...@@ -18,11 +19,14 @@ ...@@ -18,11 +19,14 @@
版面恢复就是在OCR识别后,内容仍然像原文档图片那样排列着,段落不变、顺序不变的输出到word文档中等。 版面恢复就是在OCR识别后,内容仍然像原文档图片那样排列着,段落不变、顺序不变的输出到word文档中等。
版面恢复结合了[版面分析](../layout/README_ch.md)[表格识别](../table/README_ch.md)技术,从而更好地恢复图片、表格、标题等内容,支持pdf文档、文档图片格式的输入文件,下图展示了版面恢复的结果: 版面恢复结合了[版面分析](../layout/README_ch.md)[表格识别](../table/README_ch.md)技术,从而更好地恢复图片、表格、标题等内容,支持中、英文pdf文档、文档图片格式的输入文件,下图分别展示了英文文档和中文文档版面恢复的效果:
<div align="center"> <div align="center">
<img src="../docs/recovery/recovery.jpg" width = "700" /> <img src="../docs/recovery/recovery.jpg" width = "700" />
</div> </div>
<div align="center">
<img src="../docs/recovery/recovery_ch.jpg" width = "800" />
</div>
<a name="2"></a> <a name="2"></a>
...@@ -37,10 +41,10 @@ ...@@ -37,10 +41,10 @@
```bash ```bash
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
# GPU安装 # 您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
python3 -m pip install "paddlepaddle-gpu" -i https://mirror.baidu.com/pypi/simple python3 -m pip install "paddlepaddle-gpu" -i https://mirror.baidu.com/pypi/simple
# CPU安装 # 您的机器是CPU,请运行以下命令安装
python3 -m pip install "paddlepaddle" -i https://mirror.baidu.com/pypi/simple python3 -m pip install "paddlepaddle" -i https://mirror.baidu.com/pypi/simple
``` ```
...@@ -64,6 +68,8 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR ...@@ -64,6 +68,8 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR
- **(2)安装recovery的`requirements`** - **(2)安装recovery的`requirements`**
版面恢复导出为docx、pdf文件,所以需要安装python-docx、docx2pdf API,同时处理pdf格式的输入文件,需要安装fitz、PyMuPDF API。
```bash ```bash
python3 -m pip install -r ppstructure/recovery/requirements.txt python3 -m pip install -r ppstructure/recovery/requirements.txt
``` ```
...@@ -72,11 +78,20 @@ python3 -m pip install -r ppstructure/recovery/requirements.txt ...@@ -72,11 +78,20 @@ python3 -m pip install -r ppstructure/recovery/requirements.txt
## 3. 使用 ## 3. 使用
我们通过版面分析对图片/pdf形式的文档进行区域划分,定位其中的关键区域,如文字、表格、图片等,记录每个区域的位置、类别、区域像素值信息。对不同的区域分别处理,其中:
- 文字区域直接进行OCR检测和识别,在之前信息基础上增加OCR检测框坐标和文本内容信息
- 表格区域进行表格识别,记录表格html和文字信息
- 图片直接保存
我们通过版面信息、OCR检测和识别结构、表格信息、保存的图片,对测试图片进行恢复即可。
<a name="3.1"></a> <a name="3.1"></a>
### 3.1 下载模型 ### 3.1 下载模型
如果输入为英文文档类型,下载英文模型 如果输入为英文文档类型,下载OCR检测和识别、版面分析、表格识别的英文模型
```bash ```bash
cd PaddleOCR/ppstructure cd PaddleOCR/ppstructure
...@@ -88,9 +103,11 @@ wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar ...@@ -88,9 +103,11 @@ wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar
# 下载英文超轻量PP-OCRv3识别模型并解压 # 下载英文超轻量PP-OCRv3识别模型并解压
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar && tar xf en_PP-OCRv3_rec_infer.tar wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar && tar xf en_PP-OCRv3_rec_infer.tar
# 下载英文表格识别模型并解压 # 下载英文表格识别模型并解压
wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/en_ppstructure_mobile_v2.0_SLANet_infer.tar && tar xf en_ppstructure_mobile_v2.0_SLANet_infer.tar wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/en_ppstructure_mobile_v2.0_SLANet_infer.tar
tar xf en_ppstructure_mobile_v2.0_SLANet_infer.tar
# 下载英文版面分析模型 # 下载英文版面分析模型
wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar && tar xf picodet_lcnet_x1_0_fgd_layout_infer.tar wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar
tar xf picodet_lcnet_x1_0_fgd_layout_infer.tar
cd .. cd ..
``` ```
...@@ -135,3 +152,15 @@ python3 predict_system.py \ ...@@ -135,3 +152,15 @@ python3 predict_system.py \
- recovery:是否进行版面恢复,默认False - recovery:是否进行版面恢复,默认False
- save_pdf:进行版面恢复导出docx文档的同时,是否保存为pdf文件,默认为False - save_pdf:进行版面恢复导出docx文档的同时,是否保存为pdf文件,默认为False
- output:版面恢复结果保存路径 - output:版面恢复结果保存路径
<a name="4"></a>
## 4. 更多
关于OCR检测模型的训练评估与推理,请参考:[文本检测教程](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_ch/detection.md)
关于OCR识别模型的训练评估与推理,请参考:[文本识别教程](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/doc/doc_ch/recognition.md)
关于版面分析模型的训练评估与推理,请参考:[版面分析教程](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppstructure/layout/README_ch.md)
关于表格识别模型的训练评估与推理,请参考:[表格识别教程](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppstructure/table/README_ch.md)
python-docx python-docx
docx2pdf docx2pdf
fitz fitz
PyMuPDF PyMuPDF==1.16.14
beautifulsoup4 beautifulsoup4
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册