diff --git a/deploy/hubserving/readme.md b/deploy/hubserving/readme.md index 8144c2e7cefaed6f64763e414101445b2d80b81a..94a570e1895dcb474e51e2b5d2b4dc9a40ee49fd 100755 --- a/deploy/hubserving/readme.md +++ b/deploy/hubserving/readme.md @@ -20,7 +20,7 @@ PaddleOCR提供2种服务部署方式: # 基于PaddleHub Serving的服务部署 -hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,表格识别和PP-Structure六种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下: +hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,表格识别、PP-Structure和版面分析七种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下: ``` deploy/hubserving/ └─ ocr_cls 文本方向分类模块服务包 @@ -29,6 +29,7 @@ deploy/hubserving/ └─ ocr_system 文本检测+文本方向分类+文本识别串联服务包 └─ structure_table 表格识别服务包 └─ structure_system PP-Structure服务包 + └─ structure_layout 版面分析服务包 ``` 每个服务包下包含3个文件。以2阶段串联服务包为例,目录如下: @@ -43,6 +44,7 @@ deploy/hubserving/ocr_system/ * 2022.05.05 新增PP-OCRv3检测和识别模型。 * 2022.03.30 新增PP-Structure和表格识别两种服务。 +* 2022.08.23 新增版面分析服务。 ## 2. 快速启动服务 以下步骤以检测+识别2阶段串联服务为例,如果只需要检测服务或识别服务,替换相应文件路径即可。 @@ -59,9 +61,9 @@ pip3 install paddlehub==2.1.0 --upgrade -i https://mirror.baidu.com/pypi/simple 检测模型:./inference/ch_PP-OCRv3_det_infer/ 识别模型:./inference/ch_PP-OCRv3_rec_infer/ 方向分类器:./inference/ch_ppocr_mobile_v2.0_cls_infer/ -版面分析模型:./inference/layout_infer/ +版面分析模型:./inference/picodet_lcnet_x1_0_fgd_layout_infer/ 表格结构识别模型:./inference/ch_ppstructure_mobile_v2.0_SLANet_infer/ -``` +``` **模型路径可在`params.py`中查看和修改。** 更多模型可以从PaddleOCR提供的模型库[PP-OCR](../../doc/doc_ch/models_list.md)和[PP-Structure](../../ppstructure/docs/models_list.md)下载,也可以替换成自己训练转换好的模型。 @@ -87,6 +89,9 @@ hub install deploy/hubserving/structure_table/ # 或,安装PP-Structure服务模块: hub install deploy/hubserving/structure_system/ + +# 或,安装版面分析服务模块: +hub install deploy/hubserving/structure_layout/ ``` * 在Windows环境下(文件夹的分隔符为`\`),安装示例如下: @@ -108,6 +113,9 @@ hub install deploy\hubserving\structure_table\ # 或,安装PP-Structure服务模块: hub install deploy\hubserving\structure_system\ + +# 或,安装版面分析服务模块: +hub install deploy\hubserving\structure_layout\ ``` ### 2.4 启动服务 @@ -118,7 +126,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ --port XXXX \ --use_multiprocess \ --workers \ -``` +``` **参数:** @@ -168,7 +176,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ ```shell export CUDA_VISIBLE_DEVICES=3 hub serving start -c deploy/hubserving/ocr_system/config.json -``` +``` ## 3. 发送预测请求 配置好服务端,可使用以下命令发送预测请求,获取预测结果: @@ -185,6 +193,7 @@ hub serving start -c deploy/hubserving/ocr_system/config.json `http://127.0.0.1:8868/predict/ocr_system` `http://127.0.0.1:8869/predict/structure_table` `http://127.0.0.1:8870/predict/structure_system` +`http://127.0.0.1:8870/predict/structure_layout` - **image_dir**:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径 - **visualize**:是否可视化结果,默认为False - **output**:可视化结果保存路径,默认为`./hubserving_result` @@ -203,17 +212,19 @@ hub serving start -c deploy/hubserving/ocr_system/config.json |text_region|list|文本位置坐标| |html|str|表格的html字符串| |regions|list|版面分析+表格识别+OCR的结果,每一项为一个list,包含表示区域坐标的`bbox`,区域类型的`type`和区域结果的`res`三个字段| +|layout|list|版面分析的结果,每一项一个dict,包含版面区域坐标的`bbox`,区域类型的`label`| 不同模块返回的字段不同,如,文本识别服务模块返回结果不含`text_region`字段,具体信息如下: -| 字段名/模块名 | ocr_det | ocr_cls | ocr_rec | ocr_system | structure_table | structure_system | -| --- | --- | --- | --- | --- | --- |--- | -|angle| | ✔ | | ✔ | || -|text| | |✔|✔| | ✔ | -|confidence| |✔ |✔| | | ✔| -|text_region| ✔| | |✔ | | ✔| -|html| | | | |✔ |✔| -|regions| | | | |✔ |✔ | +| 字段名/模块名 | ocr_det | ocr_cls | ocr_rec | ocr_system | structure_table | structure_system | Structure_layout | +| --- | --- | --- | --- | --- | --- | --- | --- | +|angle| | ✔ | | ✔ | ||| +|text| | |✔|✔| | ✔ | | +|confidence| |✔ |✔| | | ✔| | +|text_region| ✔| | |✔ | | ✔| | +|html| | | | |✔ |✔|| +|regions| | | | |✔ |✔ | | +|layout| | | | | | | ✔ | **说明:** 如果需要增加、删除、修改返回字段,可在相应模块的`module.py`文件中进行修改,完整流程参考下一节自定义修改服务模块。 diff --git a/deploy/hubserving/readme_en.md b/deploy/hubserving/readme_en.md index 06eaaebacb51744844473c0ffe8b189dc545492c..dd0a74e63fe0b138c01d158e577c5c2a0244e94a 100755 --- a/deploy/hubserving/readme_en.md +++ b/deploy/hubserving/readme_en.md @@ -20,7 +20,7 @@ PaddleOCR provides 2 service deployment methods: # Service deployment based on PaddleHub Serving -The hubserving service deployment directory includes six service packages: text detection, text angle class, text recognition, text detection+text angle class+text recognition three-stage series connection, 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: +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: ``` deploy/hubserving/ └─ ocr_det text detection module service package @@ -29,6 +29,7 @@ deploy/hubserving/ └─ ocr_system text detection+text angle class+text recognition three-stage series connection service package └─ structure_table table recognition 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: @@ -43,6 +44,7 @@ deploy/hubserving/ocr_system/ * 2022.05.05 add PP-OCRv3 text detection and recognition models. * 2022.03.30 add PP-Structure and table recognition services。 +* 2022.08.23 add layout analysis services。 ## 2. Quick start service @@ -61,7 +63,7 @@ Before installing the service module, you need to prepare the inference model an text detection model: ./inference/ch_PP-OCRv3_det_infer/ text recognition model: ./inference/ch_PP-OCRv3_rec_infer/ text angle classifier: ./inference/ch_ppocr_mobile_v2.0_cls_infer/ -layout parse model: ./inference/layout_infer/ +layout parse model: ./inference/picodet_lcnet_x1_0_fgd_layout_infer/ tanle recognition: ./inference/ch_ppstructure_mobile_v2.0_SLANet_infer/ ``` @@ -89,6 +91,9 @@ hub install deploy/hubserving/structure_table/ # Or install PP-Structure service module hub install deploy/hubserving/structure_system/ + +# Or install layout analysis service module +hub install deploy/hubserving/structure_layout/ ``` * On Windows platform, the examples are as follows. @@ -110,6 +115,9 @@ hub install deploy/hubserving/structure_table/ # Or install PP-Structure service module hub install deploy\hubserving\structure_system\ + +# Or install layout analysis service module +hub install deploy\hubserving\structure_layout\ ``` ### 2.4 Start service @@ -190,8 +198,9 @@ For example, if using the configuration file to start the text angle classificat `http://127.0.0.1:8866/predict/ocr_cls` `http://127.0.0.1:8867/predict/ocr_rec` `http://127.0.0.1:8868/predict/ocr_system` -`http://127.0.0.1:8869/predict/structure_table` +`http://127.0.0.1:8869/predict/structure_table` `http://127.0.0.1:8870/predict/structure_system` +`http://127.0.0.1:8870/predict/structure_layout` - **image_dir**:Test image path, can be a single image path or an image directory path - **visualize**:Whether to visualize the results, the default value is False - **output**:The floder to save Visualization result, default value is `./hubserving_result` @@ -212,17 +221,19 @@ The returned result is a list. Each item in the list is a dict. The dict may con |text_region|list|text location coordinates| |html|str|table html str| |regions|list|The result of layout analysis + table recognition + OCR, each item is a list, including `bbox` indicating area coordinates, `type` of area type and `res` of area results| +|layout|list|The result of layout analysis, each item is a dict, including `bbox` indicating area coordinates, `label` of area type| The fields returned by different modules are different. For example, the results returned by the text recognition service module do not contain `text_region`. The details are as follows: -| field name/module name | ocr_det | ocr_cls | ocr_rec | ocr_system | structure_table | structure_system | -| --- | --- | --- | --- | --- | --- |--- | -|angle| | ✔ | | ✔ | || -|text| | |✔|✔| | ✔ | -|confidence| |✔ |✔| | | ✔| -|text_region| ✔| | |✔ | | ✔| -|html| | | | |✔ |✔| -|regions| | | | |✔ |✔ | +| field name/module name | ocr_det | ocr_cls | ocr_rec | ocr_system | structure_table | structure_system | structure_layout | +| --- | --- | --- | --- | --- | --- |--- |--- | +|angle| | ✔ | | ✔ | || | +|text| | |✔|✔| | ✔ | | +|confidence| |✔ |✔| | | ✔| | +|text_region| ✔| | |✔ | | ✔| | +|html| | | | |✔ |✔| | +|regions| | | | |✔ |✔ | | +|layout| | | | | | |✔ | **Note:** If you need to add, delete or modify the returned fields, you can modify the file `module.py` of the corresponding module. For the complete process, refer to the user-defined modification service module in the next section. diff --git a/deploy/hubserving/structure_layout/__init__.py b/deploy/hubserving/structure_layout/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c747d3e7aeca842933e083dffc01ef1fba3f4e85 --- /dev/null +++ b/deploy/hubserving/structure_layout/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. \ No newline at end of file diff --git a/deploy/hubserving/structure_layout/config.json b/deploy/hubserving/structure_layout/config.json new file mode 100644 index 0000000000000000000000000000000000000000..bc52c1ab603d5659f90a5ed8a72cdb06638fb9e5 --- /dev/null +++ b/deploy/hubserving/structure_layout/config.json @@ -0,0 +1,16 @@ +{ + "modules_info": { + "structure_layout": { + "init_args": { + "version": "1.0.0", + "use_gpu": true + }, + "predict_args": { + } + } + }, + "port": 8871, + "use_multiprocess": false, + "workers": 2 +} + diff --git a/deploy/hubserving/structure_layout/module.py b/deploy/hubserving/structure_layout/module.py new file mode 100644 index 0000000000000000000000000000000000000000..7091f123fc0039e4886d8763096952d7c445184c --- /dev/null +++ b/deploy/hubserving/structure_layout/module.py @@ -0,0 +1,143 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +sys.path.insert(0, ".") +import copy + +import time +import paddlehub +from paddlehub.common.logger import logger +from paddlehub.module.module import moduleinfo, runnable, serving +import cv2 +import paddlehub as hub + +from tools.infer.utility import base64_to_cv2 +from ppstructure.layout.predict_layout import LayoutPredictor as _LayoutPredictor +from ppstructure.utility import parse_args +from deploy.hubserving.structure_layout.params import read_params + + +@moduleinfo( + name="structure_layout", + version="1.0.0", + summary="PP-Structure layout service", + author="paddle-dev", + author_email="paddle-dev@baidu.com", + type="cv/structure_layout") +class LayoutPredictor(hub.Module): + def _initialize(self, use_gpu=False, enable_mkldnn=False): + """ + initialize with the necessary elements + """ + cfg = self.merge_configs() + cfg.use_gpu = use_gpu + if use_gpu: + try: + _places = os.environ["CUDA_VISIBLE_DEVICES"] + int(_places[0]) + print("use gpu: ", use_gpu) + print("CUDA_VISIBLE_DEVICES: ", _places) + cfg.gpu_mem = 8000 + except: + raise RuntimeError( + "Environment Variable CUDA_VISIBLE_DEVICES is not set correctly. If you wanna use gpu, please set CUDA_VISIBLE_DEVICES via export CUDA_VISIBLE_DEVICES=cuda_device_id." + ) + cfg.ir_optim = True + cfg.enable_mkldnn = enable_mkldnn + + self.layout_predictor = _LayoutPredictor(cfg) + + def merge_configs(self): + # deafult cfg + backup_argv = copy.deepcopy(sys.argv) + sys.argv = sys.argv[:1] + cfg = parse_args() + + update_cfg_map = vars(read_params()) + + for key in update_cfg_map: + cfg.__setattr__(key, update_cfg_map[key]) + + sys.argv = copy.deepcopy(backup_argv) + return cfg + + def read_images(self, paths=[]): + images = [] + for img_path in paths: + assert os.path.isfile( + img_path), "The {} isn't a valid file.".format(img_path) + img = cv2.imread(img_path) + if img is None: + logger.info("error in loading image:{}".format(img_path)) + continue + images.append(img) + return images + + def predict(self, images=[], paths=[]): + """ + Get the chinese texts in the predicted images. + Args: + images (list(numpy.ndarray)): images data, shape of each is [H, W, C]. If images not paths + paths (list[str]): The paths of images. If paths not images + Returns: + res (list): The layout results of images. + """ + + if images != [] and isinstance(images, list) and paths == []: + predicted_data = images + elif images == [] and isinstance(paths, list) and paths != []: + predicted_data = self.read_images(paths) + else: + raise TypeError("The input data is inconsistent with expectations.") + + assert predicted_data != [], "There is not any image to be predicted. Please check the input data." + + all_results = [] + for img in predicted_data: + if img is None: + logger.info("error in loading image") + all_results.append([]) + continue + starttime = time.time() + res, _ = self.layout_predictor(img) + elapse = time.time() - starttime + logger.info("Predict time: {}".format(elapse)) + + for item in res: + item['bbox'] = item['bbox'].tolist() + all_results.append({'layout': res}) + return all_results + + @serving + def serving_method(self, images, **kwargs): + """ + Run as a service. + """ + images_decode = [base64_to_cv2(image) for image in images] + results = self.predict(images_decode, **kwargs) + return results + + +if __name__ == '__main__': + layout = LayoutPredictor() + layout._initialize() + image_path = ['./ppstructure/docs/table/1.png'] + res = layout.predict(paths=image_path) + print(res) diff --git a/deploy/hubserving/structure_layout/params.py b/deploy/hubserving/structure_layout/params.py new file mode 100755 index 0000000000000000000000000000000000000000..448b66ac42dac555f084299f525ee9e91ad481d8 --- /dev/null +++ b/deploy/hubserving/structure_layout/params.py @@ -0,0 +1,32 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +class Config(object): + pass + + +def read_params(): + cfg = Config() + + # params for layout analysis + cfg.layout_model_dir = './inference/picodet_lcnet_x1_0_fgd_layout_infer/' + cfg.layout_dict_path = './ppocr/utils/dict/layout_dict/layout_publaynet_dict.txt' + cfg.layout_score_threshold = 0.5 + cfg.layout_nms_threshold = 0.5 + return cfg diff --git a/paddleocr.py b/paddleocr.py index f6fb095af34a58cc91b9fd0f22b2e95bf833e010..2adddfbe8293a29cc1f292755f70f0fa03f82c1d 100644 --- a/paddleocr.py +++ b/paddleocr.py @@ -286,11 +286,17 @@ MODEL_URLS = { } }, 'layout': { - 'ch': { + 'en': { 'url': - 'https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_layout_infer.tar', + 'https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar', 'dict_path': 'ppocr/utils/dict/layout_dict/layout_publaynet_dict.txt' + }, + 'ch': { + 'url': + 'https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_cdla_infer.tar', + 'dict_path': + 'ppocr/utils/dict/layout_dict/layout_cdla_dict.txt' } } } @@ -634,6 +640,20 @@ def main(): result = engine(img_path) save_structure_res(result, args.output, img_name) + if args.recovery: + try: + from ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx + img = cv2.imread(img_path) + h, w, _ = img.shape + res = sorted_layout_boxes(result, w) + convert_info_docx(img, res, args.output, img_name, + args.save_pdf) + except Exception as ex: + logger.error( + "error in layout recovery image:{}, err msg: {}".format( + img_name, ex)) + continue + for item in result: item.pop('img') item.pop('res') diff --git a/ppstructure/docs/quickstart.md b/ppstructure/docs/quickstart.md index f19ee2591aba955ff09b2404d3ca85c80b75d781..52331abef78c27437ecb625b77d466bd1f62bfb5 100644 --- a/ppstructure/docs/quickstart.md +++ b/ppstructure/docs/quickstart.md @@ -51,10 +51,14 @@ pip3 install "paddleocr>=2.6" pip3 install paddleclas # 安装 关键信息抽取 依赖包(如不需要KIE功能,可跳过) -pip3 install -r kie/requirements.txt +pip3 install -r ppstructure/kie/requirements.txt + +# 安装 版面恢复 依赖包(如不需要版面恢复功能,可跳过) +pip3 install -r ppstructure/recovery/requirements.txt ``` + ## 2. 便捷使用 @@ -94,7 +98,10 @@ paddleocr --image_dir=ppstructure/docs/table/table.jpg --type=structure --layout #### 2.1.6 版面恢复 ```bash +# 中文测试图 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' ``` @@ -215,9 +222,12 @@ for line in result: import os import cv2 from paddleocr import PPStructure,save_structure_res -from paddelocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx +from paddleocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx -table_engine = PPStructure(layout=False, show_log=True) +# 中文测试图 +table_engine = PPStructure(recovery=True) +# 英文测试图 +# table_engine = PPStructure(recovery=True, lang='en') save_folder = './output' img_path = 'ppstructure/docs/table/1.png' @@ -230,8 +240,8 @@ for line in result: print(line) h, w, _ = img.shape -res = sorted_layout_boxes(res, w) -convert_info_docx(img, result, save_folder, os.path.basename(img_path).split('.')[0]) +res = sorted_layout_boxes(result, w) +convert_info_docx(img, res, save_folder, os.path.basename(img_path).split('.')[0]) ``` @@ -303,4 +313,4 @@ dict 里各个字段说明如下: ## 3. 小结 -通过本节内容,相信您已经熟练掌握通过PaddleOCR whl包调用PP-Structure相关功能的使用方法,您可以参考[文档教程](../../README_ch.md#文档教程),获取包括模型训练、推理部署等更详细的使用教程。 \ No newline at end of file +通过本节内容,相信您已经熟练掌握通过PaddleOCR whl包调用PP-Structure相关功能的使用方法,您可以参考[文档教程](../../README_ch.md#文档教程),获取包括模型训练、推理部署等更详细的使用教程。 diff --git a/ppstructure/docs/quickstart_en.md b/ppstructure/docs/quickstart_en.md index dbfbf43b01c94bd6f9c729f2f6edcd1dd6aee056..83a852a33519cfaef7f5da7929fd3e33140b5c19 100644 --- a/ppstructure/docs/quickstart_en.md +++ b/ppstructure/docs/quickstart_en.md @@ -29,10 +29,17 @@ ```bash # Install paddleocr, version 2.6 is recommended pip3 install "paddleocr>=2.6" -# Install the KIE dependency packages (if you do not use the KIE, you can skip it) -pip install -r kie/requirements.txt + # Install the image direction classification dependency package paddleclas (if you do not use the image direction classification, you can skip it) pip3 install paddleclas + +# Install the KIE dependency packages (if you do not use the KIE, you can skip it) +pip3 install -r ppstructure/kie/requirements.txt + +# Install the layout recovery dependency packages (if you do not use the layout recovery, you can skip it) +pip3 install -r ppstructure/recovery/requirements.txt + + ``` @@ -73,8 +80,11 @@ Please refer to: [Key Information Extraction](../kie/README.md) . #### 2.1.6 layout recovery -```bash +``` +# Chinese pic paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true +# English pic +paddleocr --image_dir=PaddleOCR/ppstructure/docs/table/1.png --type=structure --recovery=true --lang='en' ``` @@ -192,12 +202,15 @@ Please refer to: [Key Information Extraction](../kie/README.md) . import os import cv2 from paddleocr import PPStructure,save_structure_res -from paddelocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx +from paddleocr.ppstructure.recovery.recovery_to_doc import sorted_layout_boxes, convert_info_docx -table_engine = PPStructure(layout=False, show_log=True) +# Chinese image +table_engine = PPStructure(recovery=True) +# English image +# table_engine = PPStructure(recovery=True, lang='en') save_folder = './output' -img_path = 'PaddleOCR/ppstructure/docs/table/1.png' +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]) @@ -207,8 +220,8 @@ for line in result: print(line) h, w, _ = img.shape -res = sorted_layout_boxes(res, w) -convert_info_docx(img, result, save_folder, os.path.basename(img_path).split('.')[0]) +res = sorted_layout_boxes(result, w) +convert_info_docx(img, res, save_folder, os.path.basename(img_path).split('.')[0]) ``` diff --git a/ppstructure/predict_system.py b/ppstructure/predict_system.py index d63ab3b3daf018af7d0872e42bd14b8823d193ae..da6b0770bba3ca8e01476ed433b7a48a85ba887c 100644 --- a/ppstructure/predict_system.py +++ b/ppstructure/predict_system.py @@ -77,7 +77,7 @@ class StructureSystem(object): elif self.mode == 'kie': raise NotImplementedError - def __call__(self, img, img_idx=0, return_ocr_result_in_table=False): + def __call__(self, img, return_ocr_result_in_table=False, img_idx=0): time_dict = { 'image_orientation': 0, 'layout': 0, diff --git a/ppstructure/recovery/recovery_to_doc.py b/ppstructure/recovery/recovery_to_doc.py index 0a556093d17050f65440f8e962015a86de696107..73b497d49d0961b253738eddad49c88c12c13601 100644 --- a/ppstructure/recovery/recovery_to_doc.py +++ b/ppstructure/recovery/recovery_to_doc.py @@ -12,9 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import cv2 import os -import pypandoc from copy import deepcopy from docx import Document @@ -30,7 +28,7 @@ from ppocr.utils.logging import get_logger logger = get_logger() -def convert_info_docx(img, res, save_folder, img_name, save_pdf): +def convert_info_docx(img, res, save_folder, img_name, save_pdf=False): doc = Document() doc.styles['Normal'].font.name = 'Times New Roman' doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') diff --git a/ppstructure/recovery/requirements.txt b/ppstructure/recovery/requirements.txt index 5ba3099d64574954c65ac8169798759dd7c053ac..37e6151bdcd546d032f86e256d00d566c1b6b488 100644 --- a/ppstructure/recovery/requirements.txt +++ b/ppstructure/recovery/requirements.txt @@ -1,5 +1,5 @@ -pypandoc python-docx docx2pdf fitz -PyMuPDF \ No newline at end of file +PyMuPDF +beautifulsoup4 \ No newline at end of file