diff --git a/test1/api.md b/test1/api.md index 7283595d0966e1abfda2409bd7096e8425e7efe5..6ce2e5904188643839e2a21c137eaa6cf78619c9 100644 --- a/test1/api.md +++ b/test1/api.md @@ -30,22 +30,32 @@ Types 1-4 follow the traditional OCR process, and 5 follow the Table OCR process [doc](table/README.md) -## 4. PaddleStructure whl package introduction +## 4. Predictive by inference engine -### 4.1 Use +Use the following commands to complete the inference +```python +python3 table/predict_system.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table +``` +After running, each image will have a directory with the same name under the directory specified in the output field. Each table in the picture will be stored as an excel, and the excel file name will be the coordinates of the table in the image. + +## 5. PaddleStructure whl package introduction -4.1.1 Use by code +### 5.1 Use + +5.1.1 Use by code ```python +import os import cv2 -from paddlestructure import PaddleStructure,draw_result +from paddlestructure import PaddleStructure,draw_result,save_res -table_engine = PaddleStructure( - output='./output/table', - show_log=True) +table_engine = PaddleStructure(show_log=True) +save_folder = './output/table' img_path = '../doc/table/1.png' img = cv2.imread(img_path) result = table_engine(img) +save_res(result, save_folder,os.path.basename(img_path).split('.')[0]) + for line in result: print(line) @@ -58,19 +68,19 @@ im_show = Image.fromarray(im_show) im_show.save('result.jpg') ``` -4.1.2 Use by command line +5.1.2 Use by command line ```bash paddlestructure --image_dir=../doc/table/1.png ``` -### 参数说明 -大部分参数和paddleocr whl包保持一致,见 [whl包文档](../doc/doc_ch/whl.md) +### Parameter Description +Most of the parameters are consistent with the paddleocr whl package, see [whl package documentation](../doc/doc_ch/whl.md) -| 字段 | 说明 | 默认值 | +| Parameter | Description | Default | |------------------------|------------------------------------------------------|------------------| -| output | excel和识别结果保存的地址 | ./output/table | -| structure_max_len | structure模型预测时,图像的长边resize尺度 | 488 | -| structure_model_dir | structure inference 模型地址 | None | -| structure_char_type | structure 模型所用字典地址 | ../ppocr/utils/dict/table_structure_dict.tx | +| output | The path where excel and recognition results are saved | ./output/table | +| structure_max_len | When the table structure model predicts, the long side of the image is resized | 488 | +| structure_model_dir | Table structure inference model path | None | +| structure_char_type | Dictionary path used by table structure model | ../ppocr/utils/dict/table_structure_dict.tx | diff --git a/test1/api_ch.md b/test1/api_ch.md index 7fafe700139c00dfb65d19c1d3f634add360b890..585379e8c6f717733ab436749441be0668b4c6d8 100644 --- a/test1/api_ch.md +++ b/test1/api_ch.md @@ -30,22 +30,32 @@ PaddleStructure 是一个用于复杂板式文字OCR的工具包,流程如下 [文档](table/README_ch.md) -## 4. PaddleStructure whl包介绍 +## 4. 预测引擎推理 -### 4.1 使用 +使用如下命令即可完成预测引擎的推理 +```python +python3 table/predict_system.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table +``` +运行完成后,每张图片会output字段指定的目录下有一个同名目录,图片里的每个表格会存储为一个excel,excel文件名为表格在图片里的坐标。 + +## 5. PaddleStructure whl包介绍 -4.1.1 代码使用 +### 5.1 使用 + +5.1.1 代码使用 ```python +import os import cv2 -from paddlestructure import PaddleStructure,draw_result +from paddlestructure import PaddleStructure,draw_result,save_res -table_engine = PaddleStructure( - output='./output/table', - show_log=True) +table_engine = PaddleStructure(show_log=True) +save_folder = './output/table' img_path = '../doc/table/1.png' img = cv2.imread(img_path) result = table_engine(img) +save_res(result, save_folder,os.path.basename(img_path).split('.')[0]) + for line in result: print(line) @@ -58,7 +68,7 @@ im_show = Image.fromarray(im_show) im_show.save('result.jpg') ``` -4.1.2 命令行使用 +5.1.2 命令行使用 ```bash paddlestructure --image_dir=../doc/table/1.png ``` @@ -69,8 +79,8 @@ paddlestructure --image_dir=../doc/table/1.png | 字段 | 说明 | 默认值 | |------------------------|------------------------------------------------------|------------------| | output | excel和识别结果保存的地址 | ./output/table | -| structure_max_len | structure模型预测时,图像的长边resize尺度 | 488 | -| structure_model_dir | structure inference 模型地址 | None | -| structure_char_type | structure 模型所用字典地址 | ../ppocr/utils/dict/table_structure_dict.tx | +| table_max_len | 表格结构模型预测时,图像的长边resize尺度 | 488 | +| table_model_dir | 表格结构模型 inference 模型地址 | None | +| table_char_type | 表格结构模型所用字典地址 | ../ppocr/utils/dict/table_structure_dict.tx | diff --git a/test1/layoutparser-0.0.0-py3-none-any.whl b/test1/layoutparser-0.0.0-py3-none-any.whl deleted file mode 100644 index e3fa17fc4dab24440761ce04deac64f36d16591e..0000000000000000000000000000000000000000 Binary files a/test1/layoutparser-0.0.0-py3-none-any.whl and /dev/null differ diff --git a/test1/paddlestructure.py b/test1/paddlestructure.py index 171d55b38ab06f0fc6a874df597281e20de0483a..d8199101bb2d97b7bad063c4bec66eeea656c1fa 100644 --- a/test1/paddlestructure.py +++ b/test1/paddlestructure.py @@ -32,7 +32,7 @@ logger = get_logger() from ppocr.utils.utility import check_and_read_gif, get_image_file_list from ppocr.utils.network import maybe_download, download_with_progressbar, confirm_model_dir_url, is_link -__all__ = ['PaddleStructure', 'draw_result', 'to_excel'] +__all__ = ['PaddleStructure', 'draw_result', 'save_res'] VERSION = '2.1' BASE_DIR = os.path.expanduser("~/.paddlestructure/") @@ -40,7 +40,7 @@ BASE_DIR = os.path.expanduser("~/.paddlestructure/") model_urls = { 'det': 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/table/en_ppocr_mobile_v2.0_table_det_infer.tar', 'rec': 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/table/en_ppocr_mobile_v2.0_table_rec_infer.tar', - 'structure': 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/table/en_ppocr_mobile_v2.0_table_structure_infer.tar' + 'table': 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/table/en_ppocr_mobile_v2.0_table_structure_infer.tar' } @@ -51,7 +51,7 @@ def parse_args(mMain=True): parser.add_help = mMain for action in parser._actions: - if action.dest in ['rec_char_dict_path', 'structure_char_dict_path']: + if action.dest in ['rec_char_dict_path', 'table_char_dict_path']: action.default = None if mMain: return parser.parse_args() @@ -76,13 +76,13 @@ class PaddleStructure(OCRSystem): params.rec_model_dir, rec_url = confirm_model_dir_url(params.rec_model_dir, os.path.join(BASE_DIR, VERSION, 'rec'), model_urls['rec']) - params.structure_model_dir, structure_url = confirm_model_dir_url(params.structure_model_dir, - os.path.join(BASE_DIR, VERSION, 'structure'), - model_urls['structure']) + params.table_model_dir, table_url = confirm_model_dir_url(params.table_model_dir, + os.path.join(BASE_DIR, VERSION, 'table'), + model_urls['table']) # download model maybe_download(params.det_model_dir, det_url) maybe_download(params.rec_model_dir, rec_url) - maybe_download(params.structure_model_dir, structure_url) + maybe_download(params.table_model_dir, table_url) if params.rec_char_dict_path is None: params.rec_char_type = 'EN' @@ -90,12 +90,12 @@ class PaddleStructure(OCRSystem): params.rec_char_dict_path = str(Path(__file__).parent / 'ppocr/utils/dict/table_dict.txt') else: params.rec_char_dict_path = str(Path(__file__).parent.parent / 'ppocr/utils/dict/table_dict.txt') - if params.structure_char_dict_path is None: + if params.table_char_dict_path is None: if os.path.exists(str(Path(__file__).parent / 'ppocr/utils/dict/table_structure_dict.txt')): - params.structure_char_dict_path = str( + params.table_char_dict_path = str( Path(__file__).parent / 'ppocr/utils/dict/table_structure_dict.txt') else: - params.structure_char_dict_path = str( + params.table_char_dict_path = str( Path(__file__).parent.parent / 'ppocr/utils/dict/table_structure_dict.txt') print(params) @@ -145,4 +145,24 @@ def main(): for item in result: logger.info(item['res']) save_res(result, save_folder, img_name) - logger.info('result save to {}'.format(os.path.join(save_folder, img_name))) \ No newline at end of file + logger.info('result save to {}'.format(os.path.join(save_folder, img_name))) + +if __name__ == '__main__': + table_engine = PaddleStructure(show_log=True) + + img_path = '../test/test_imgs/PMC1173095_006_00.png' + img = cv2.imread(img_path) + result = table_engine(img) + save_res(result, '/Users/zhoujun20/Desktop/工作相关/table/table_pr/PaddleOCR/output/table', + os.path.basename(img_path).split('.')[0]) + + for line in result: + print(line) + + from PIL import Image + + font_path = '../doc/fonts/simfang.ttf' + image = Image.open(img_path).convert('RGB') + im_show = draw_result(image, result, font_path=font_path) + im_show = Image.fromarray(im_show) + im_show.save('result.jpg') \ No newline at end of file diff --git a/test1/table/README.md b/test1/table/README.md index 2ee8bbaf47b61dca39818311cd884ef00af94a35..1fb00f011137df1e31ccaea44e8a2a98a98bb252 100644 --- a/test1/table/README.md +++ b/test1/table/README.md @@ -36,7 +36,7 @@ In gt json, the key is the image name, the value is the corresponding gt, and gt Use the following command to evaluate. After the evaluation is completed, the teds indicator will be output. ```python -python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --structure_model_dir=path/to/structure_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --structure_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --gt_path=path/to/gt.json +python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --gt_path=path/to/gt.json ``` @@ -44,6 +44,6 @@ python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_di First cd to the PaddleOCR/ppstructure directory ```python -python3 table/predict_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --structure_model_dir=path/to/structure_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --structure_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table +python3 table/predict_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table ``` -After running, the excel sheet of each picture will be saved in the directory specified by the table_output field \ No newline at end of file +After running, the excel sheet of each picture will be saved in the directory specified by the output field \ No newline at end of file diff --git a/test1/table/README_ch.md b/test1/table/README_ch.md index 29f88bb5c069178760a3ed17c1ce4858d2370173..03f002f98b3f37a251638d1b1e11812ef703f5fc 100644 --- a/test1/table/README_ch.md +++ b/test1/table/README_ch.md @@ -36,7 +36,7 @@ json 中,key为图片名,value为对于的gt,gt是一个由四个item组 准备完成后使用如下命令进行评估,评估完成后会输出teds指标。 ```python -python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --structure_model_dir=path/to/structure_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --structure_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --gt_path=path/to/gt.json +python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --gt_path=path/to/gt.json ``` @@ -44,6 +44,6 @@ python3 table/eval_table.py --det_model_dir=path/to/det_model_dir --rec_model_di 先cd到PaddleOCR/ppstructure目录下 ```python -python3 table/predict_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --structure_model_dir=path/to/structure_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --structure_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table +python3 table/predict_table.py --det_model_dir=path/to/det_model_dir --rec_model_dir=path/to/rec_model_dir --table_model_dir=path/to/table_model_dir --image_dir=../doc/table/1.png --rec_char_dict_path=../ppocr/utils/dict/table_dict.txt --table_char_dict_path=../ppocr/utils/dict/table_structure_dict.txt --rec_char_type=EN --det_limit_side_len=736 --det_limit_type=min --output ../output/table ``` -运行完成后,每张图片的excel表格会保存到table_output字段指定的目录下 +运行完成后,每张图片的excel表格会保存到output字段指定的目录下 diff --git a/test1/table/predict_structure.py b/test1/table/predict_structure.py index 455bf7e7b93bc7a97635027c73900ffb39f50f95..1070c93ea61ac0efea7e700d00c8144f4139fbd8 100755 --- a/test1/table/predict_structure.py +++ b/test1/table/predict_structure.py @@ -41,7 +41,7 @@ class TableStructurer(object): def __init__(self, args): pre_process_list = [{ 'ResizeTableImage': { - 'max_len': args.structure_max_len + 'max_len': args.table_max_len } }, { 'NormalizeImage': { @@ -61,14 +61,14 @@ class TableStructurer(object): }] postprocess_params = { 'name': 'TableLabelDecode', - "character_type": args.structure_char_type, - "character_dict_path": args.structure_char_dict_path, + "character_type": args.table_char_type, + "character_dict_path": args.table_char_dict_path, } self.preprocess_op = create_operators(pre_process_list) self.postprocess_op = build_post_process(postprocess_params) self.predictor, self.input_tensor, self.output_tensors, self.config = \ - utility.create_predictor(args, 'structure', logger) + utility.create_predictor(args, 'table', logger) def __call__(self, img): ori_im = img.copy() diff --git a/test1/utility.py b/test1/utility.py index 0dd220af7975de95f770dbf26e9f00e74782d5b5..f21b287f7d4a044838d6949fae588547ee93ec3e 100644 --- a/test1/utility.py +++ b/test1/utility.py @@ -23,10 +23,10 @@ def init_args(): # params for output parser.add_argument("--output", type=str, default='./output/table') # params for table structure - parser.add_argument("--structure_max_len", type=int, default=488) - parser.add_argument("--structure_model_dir", type=str) - parser.add_argument("--structure_char_type", type=str, default='en') - parser.add_argument("--structure_char_dict_path", type=str, default="../ppocr/utils/dict/table_structure_dict.txt") + parser.add_argument("--table_max_len", type=int, default=488) + parser.add_argument("--table_model_dir", type=str) + parser.add_argument("--table_char_type", type=str, default='en') + parser.add_argument("--table_char_dict_path", type=str, default="../ppocr/utils/dict/table_structure_dict.txt") return parser diff --git a/tools/infer/utility.py b/tools/infer/utility.py index 1d652e7d352da90bcc08b701f332f586ebb9339c..90ac5aa5ba2a33707965159d0486bb42957e3fce 100755 --- a/tools/infer/utility.py +++ b/tools/infer/utility.py @@ -201,8 +201,8 @@ def create_predictor(args, mode, logger): model_dir = args.cls_model_dir elif mode == 'rec': model_dir = args.rec_model_dir - elif mode == 'structure': - model_dir = args.structure_model_dir + elif mode == 'table': + model_dir = args.table_model_dir else: model_dir = args.e2e_model_dir @@ -331,7 +331,7 @@ def create_predictor(args, mode, logger): config.disable_glog_info() config.delete_pass("conv_transpose_eltwiseadd_bn_fuse_pass") - if mode == 'structure': + if mode == 'table': config.delete_pass("fc_fuse_pass") # not supported for table config.switch_use_feed_fetch_ops(False) config.switch_ir_optim(True)