From 1685115da8d64a26b4b173355cf15bdb535e4cd3 Mon Sep 17 00:00:00 2001 From: WenmuZhou Date: Thu, 29 Jul 2021 18:08:33 +0800 Subject: [PATCH] add en layout doc --- doc/table/PaddleDetection_config.png | Bin 56700 -> 0 bytes ppstructure/README.md | 2 +- ppstructure/layout/README.md | 14 +- ppstructure/layout/README_en.md | 135 ++++++++++++ .../layout/train_layoutparser_model.md | 68 +++--- .../layout/train_layoutparser_model_en.md | 204 ++++++++++++++++++ 6 files changed, 391 insertions(+), 32 deletions(-) delete mode 100644 doc/table/PaddleDetection_config.png create mode 100644 ppstructure/layout/README_en.md create mode 100644 ppstructure/layout/train_layoutparser_model_en.md diff --git a/doc/table/PaddleDetection_config.png b/doc/table/PaddleDetection_config.png deleted file mode 100644 index d18932b66cc148b7796fe4b319ad9eb82c2a2868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56700 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 diff --git a/ppstructure/layout/README_en.md b/ppstructure/layout/README_en.md new file mode 100644 index 00000000..d31dbe35 --- /dev/null +++ b/ppstructure/layout/README_en.md @@ -0,0 +1,135 @@ +# Getting Started + +[1. Install whl package](#Install whl package) + +[2. Quick Start](#Quick Start) + +[3. PostProcess](#PostProcess) + +[4. Results](#Results) + +[5. Training](#Training) + + + +## 1. Install whl package +```bash +wget https://paddleocr.bj.bcebos.com/whl/layoutparser-0.0.0-py3-none-any.whl +pip install -U layoutparser-0.0.0-py3-none-any.whl +``` + + + +## 2. Quick Start + +Use LayoutParser to identify the layout of a given document: + +```python +import layoutparser as lp +image = cv2.imread("imags/paper-image.jpg") +image = image[..., ::-1] + +# load model +model = lp.PaddleDetectionLayoutModel(config_path="lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config", + threshold=0.5, + label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"}, + enforce_cpu=False, + enable_mkldnn=True) +# detect +layout = model.detect(image) + +# show result +lp.draw_box(image, layout, box_width=3, show_element_type=True) +``` + +The following figure shows the result, with different colored detection boxes representing different categories and displaying specific categories in the upper left corner of the box with `show_element_type` + +
+ +
+`PaddleDetectionLayoutModel`parameters are described as follows: + +| parameter | description | default | remark | +| :------------: | :------------------------------------------------------: | :---------: | :----------------------------------------------------------: | +| config_path | model config path | None | Specify config_ path will automatically download the model (only for the first time,the model will exist and will not be downloaded again) | +| model_path | model path | None | local model path, config_ path and model_ path must be set to one, cannot be none at the same time | +| threshold | threshold of prediction score | 0.5 | \ | +| input_shape | picture size of reshape | [3,640,640] | \ | +| batch_size | testing batch size | 1 | \ | +| label_map | category mapping table | None | Setting config_ path, it can be none, and the label is automatically obtained according to the dataset name_ map | +| enforce_cpu | whether to use CPU | False | False to use GPU, and True to force the use of CPU | +| enforce_mkldnn | whether mkldnn acceleration is enabled in CPU prediction | True | \ | +| thread_num | the number of CPU threads | 10 | \ | + +The following model configurations and label maps are currently supported, which you can use by modifying '--config_path' and '--label_map' to detect different types of content: + +| dataset | config_path | label_map | +| ------------------------------------------------------------ | ------------------------------------------------------------ | --------------------------------------------------------- | +| [TableBank](https://doc-analysis.github.io/tablebank-page/index.html) word | lp://TableBank/ppyolov2_r50vd_dcn_365e_tableBank_word/config | {0:"Table"} | +| TableBank latex | lp://TableBank/ppyolov2_r50vd_dcn_365e_tableBank_latex/config | {0:"Table"} | +| [PubLayNet](https://github.com/ibm-aur-nlp/PubLayNet) | lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config | {0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"} | + +* TableBank word and TableBank latex are trained on datasets of word documents and latex documents respectively; +* Download TableBank dataset contains both word and latex。 + + + +## 3. PostProcess + +Layout parser contains multiple categories, if you only want to get the detection box for a specific category (such as the "Text" category), you can use the following code: + +```python +# filter areas for a specific text type +text_blocks = lp.Layout([b for b in layout if b.type=='Text']) +figure_blocks = lp.Layout([b for b in layout if b.type=='Figure']) + +# text areas may be detected within the image area, delete these areas +text_blocks = lp.Layout([b for b in text_blocks \ + if not any(b.is_in(b_fig) for b_fig in figure_blocks)]) + +# sort text areas and assign ID +h, w = image.shape[:2] + +left_interval = lp.Interval(0, w/2*1.05, axis='x').put_on_canvas(image) + +left_blocks = text_blocks.filter_by(left_interval, center=True) +left_blocks.sort(key = lambda b:b.coordinates[1]) + +right_blocks = [b for b in text_blocks if b not in left_blocks] +right_blocks.sort(key = lambda b:b.coordinates[1]) + +# the two lists are merged and the indexes are added in order +text_blocks = lp.Layout([b.set(id = idx) for idx, b in enumerate(left_blocks + right_blocks)]) + +# display result +lp.draw_box(image, text_blocks, + box_width=3, + show_element_id=True) +``` + +Displays results with only the "Text" category: + +
+ +
+ + +## 4. Results + +| Dataset | mAP | CPU time cost | GPU time cost | +| --------- | ---- | ------------- | ------------- | +| PubLayNet | 93.6 | 1713.7ms | 66.6ms | +| TableBank | 96.2 | 1968.4ms | 65.1ms | + +**Envrionment:** + +​ **CPU:** Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz,24core + +​ **GPU:** a single NVIDIA Tesla P40 + + + +## 5. Training + +The above model is based on PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection) ,if you want to train your own layout parser model,please refer to:[train_layoutparser_model](train_layoutparser_model_en.md) + diff --git a/ppstructure/layout/train_layoutparser_model.md b/ppstructure/layout/train_layoutparser_model.md index 0a4554e1..e1cd2e07 100644 --- a/ppstructure/layout/train_layoutparser_model.md +++ b/ppstructure/layout/train_layoutparser_model.md @@ -1,15 +1,24 @@ # 训练版面分析 -* [1. 安装](#安装) - * [1.1 环境要求](#环境要求) - * [1.2 安装PaddleDetection](#安装PaddleDetection) -* [2. 准备数据](#准备数据) -* [3. 配置文件改动和说明](#配置文件改动和说明) -* [4. PaddleDetection训练](#训练) -* [5. PaddleDetection预测](#预测) -* [6. 预测部署](#预测部署) - * [6.1 模型导出](#模型导出) - * [6.2 layout parser预测](#layout_parser预测) +[1. 安装](#安装) + +​ [1.1 环境要求](#环境要求) + +​ [1.2 安装PaddleDetection](#安装PaddleDetection) + +[2. 准备数据](#准备数据) + +[3. 配置文件改动和说明](#配置文件改动和说明) + +[4. PaddleDetection训练](#训练) + +[5. PaddleDetection预测](#预测) + +[6. 预测部署](#预测部署) + +​ [6.1 模型导出](#模型导出) + +​ [6.2 layout parser预测](#layout_parser预测) @@ -64,10 +73,10 @@ tar -xvf publaynet.tar.gz | `train/` | Images in the training subset | 335,703 | | `val/` | Images in the validation subset | 11,245 | | `test/` | Images in the testing subset | 11,405 | -| `train.json` | Annotations for training images | | -| `val.json` | Annotations for validation images | | -| `LICENSE.txt` | Plaintext version of the CDLA-Permissive license | | -| `README.txt` | Text file with the file names and description | | +| `train.json` | Annotations for training images | 1 | +| `val.json` | Annotations for validation images | 1 | +| `LICENSE.txt` | Plaintext version of the CDLA-Permissive license | 1 | +| `README.txt` | Text file with the file names and description | 1 | 如果使用其它数据集,请参考[准备训练数据](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/PrepareDataSet.md) @@ -77,23 +86,30 @@ tar -xvf publaynet.tar.gz 我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml`配置进行训练,配置文件摘要如下: -
- -
+```bash +_BASE_: [ + '../datasets/coco_detection.yml', + '../runtime.yml', + './_base_/ppyolov2_r50vd_dcn.yml', + './_base_/optimizer_365e.yml', + './_base_/ppyolov2_reader.yml', +] + +snapshot_epoch: 8 +weights: output/ppyolov2_r50vd_dcn_365e_coco/model_final +``` +从中可以看到 `ppyolov2_r50vd_dcn_365e_coco.yml` 配置需要依赖其他的配置文件,在该例子中需要依赖: -从上图看到 `ppyolov2_r50vd_dcn_365e_coco.yml` 配置需要依赖其他的配置文件,在该例子中需要依赖: +- coco_detection.yml:主要说明了训练数据和验证数据的路径 -``` -coco_detection.yml:主要说明了训练数据和验证数据的路径 +- runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个epoch存储checkpoint等 -runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个epoch存储checkpoint等 +- optimizer_365e.yml:主要说明了学习率和优化器的配置 -optimizer_365e.yml:主要说明了学习率和优化器的配置 +- ppyolov2_r50vd_dcn.yml:主要说明模型和主干网络的情况 -ppyolov2_r50vd_dcn.yml:主要说明模型和主干网络的情况 +- ppyolov2_reader.yml:主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等 -ppyolov2_reader.yml:主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等 -``` 根据实际情况,修改上述文件,比如数据集路径、batch size等。 @@ -147,7 +163,7 @@ python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer ## 6. 预测部署 -在layout parser中使用自己训练好的模型, +在layout parser中使用自己训练好的模型。 diff --git a/ppstructure/layout/train_layoutparser_model_en.md b/ppstructure/layout/train_layoutparser_model_en.md new file mode 100644 index 00000000..ffe10262 --- /dev/null +++ b/ppstructure/layout/train_layoutparser_model_en.md @@ -0,0 +1,204 @@ +# Training layout-parse + +[1. Installation](#Installation) + +​ [1.1 Requirements](#Requirements) + +​ [1.2 Install PaddleDetection](#Install PaddleDetection) + +[2. Data preparation](#Data preparation) + +[3. Configuration](#Configuration) + +[4. Training](#Training) + +[5. Prediction](#Prediction) + +[6. Deployment](#Deployment) + +​ [6.1 Export model](#Export model) + +​ [6.2 Inference](#Inference) + + + +## 1. Installation + + + +### 1.1 Requirements + +- PaddlePaddle 2.1 +- OS 64 bit +- Python 3(3.5.1+/3.6/3.7/3.8/3.9),64 bit +- pip/pip3(9.0.1+), 64 bit +- CUDA >= 10.1 +- cuDNN >= 7.6 + + + +### 1.2 Install PaddleDetection + +```bash +# Clone PaddleDetection repository +cd +git clone https://github.com/PaddlePaddle/PaddleDetection.git + +cd PaddleDetection +# Install other dependencies +pip install -r requirements.txt +``` + +For more installation tutorials, please refer to: [Install doc](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md) + + + +## 2. Data preparation + +Download the [PubLayNet](https://github.com/ibm-aur-nlp/PubLayNet) dataset + +```bash +cd PaddleDetection/dataset/ +mkdir publaynet +# execute the command,download PubLayNet +wget -O publaynet.tar.gz https://dax-cdn.cdn.appdomain.cloud/dax-publaynet/1.0.0/publaynet.tar.gz?_ga=2.104193024.1076900768.1622560733-649911202.1622560733 +# unpack +tar -xvf publaynet.tar.gz +``` + +PubLayNet directory structure after decompressing : + +| File or Folder | Description | num | +| :------------- | :----------------------------------------------- | ------- | +| `train/` | Images in the training subset | 335,703 | +| `val/` | Images in the validation subset | 11,245 | +| `test/` | Images in the testing subset | 11,405 | +| `train.json` | Annotations for training images | 1 | +| `val.json` | Annotations for validation images | 1 | +| `LICENSE.txt` | Plaintext version of the CDLA-Permissive license | 1 | +| `README.txt` | Text file with the file names and description | 1 | + +For other datasets,please refer to [the PrepareDataSet]((https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/PrepareDataSet.md) ) + + + +## 3. Configuration + +We use the `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` configuration for training,the configuration file is as follows + +```bash +_BASE_: [ + '../datasets/coco_detection.yml', + '../runtime.yml', + './_base_/ppyolov2_r50vd_dcn.yml', + './_base_/optimizer_365e.yml', + './_base_/ppyolov2_reader.yml', +] + +snapshot_epoch: 8 +weights: output/ppyolov2_r50vd_dcn_365e_coco/model_final +``` +The `ppyolov2_r50vd_dcn_365e_coco.yml` configuration depends on other configuration files, in this case: + +- coco_detection.yml:mainly explains the path of training data and verification data + +- runtime.yml:mainly describes the common parameters, such as whether to use the GPU and how many epoch to save model etc. + +- optimizer_365e.yml:mainly explains the learning rate and optimizer configuration + +- ppyolov2_r50vd_dcn.yml:mainly describes the model and the network + +- ppyolov2_reader.yml:mainly describes the configuration of data readers, such as batch size and number of concurrent loading child processes, and also includes post preprocessing, such as resize and data augmention etc. + + +Modify the preceding files, such as the dataset path and batch size etc. + + + +## 4. Training + +PaddleDetection provides single-card/multi-card training mode to meet various training needs of users: + +* GPU single card training + +```bash +export CUDA_VISIBLE_DEVICES=0 #Don't need to run this command on Windows and Mac +python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml +``` + +* GPU multi-card training + +```bash +export CUDA_VISIBLE_DEVICES=0,1,2,3 +python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval +``` + +--eval: training while verifying + +* Model recovery training + +During the daily training, if training is interrupted due to some reasons, you can use the -r command to resume the training: + +```bash +export CUDA_VISIBLE_DEVICES=0,1,2,3 +python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --eval -r output/ppyolov2_r50vd_dcn_365e_coco/10000 +``` + +Note: If you encounter "`Out of memory error`" , try reducing `batch_size` in the `ppyolov2_reader.yml` file + +prediction + +## 5. Prediction + +Set parameters and use PaddleDetection to predict: + +```bash +export CUDA_VISIBLE_DEVICES=0 +python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=images/paper-image.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final --use_vdl=Ture +``` + +`--draw_threshold` is an optional parameter. According to the calculation of [NMS](https://ieeexplore.ieee.org/document/1699659), different threshold will produce different results, ` keep_top_k ` represent the maximum amount of output target, the default value is 10. You can set different value according to your own actual situation。 + + + +## 6. Deployment + +Use your trained model in Layout Parser + + + +### 6.1 Export model + +n the process of model training, the model file saved contains the process of forward prediction and back propagation. In the actual industrial deployment, there is no need for back propagation. Therefore, the model should be translated into the model format required by the deployment. The `tools/export_model.py` script is provided in PaddleDetection to export the model. + +The exported model name defaults to `model.*`, Layout Parser's code model is `inference.*`, So change [PaddleDetection/ppdet/engine/trainer. Py ](https://github.com/PaddlePaddle/PaddleDetection/blob/b87a1ea86fa18ce69e44a17ad1b49c1326f19ff9/ppdet/engine/trainer.py# L512) (click on the link to see the detailed line of code), change 'model' to 'inference'. + +Execute the script to export model: + +```bash +python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --output_dir=./inference -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final.pdparams +``` + +The prediction model is exported to `inference/ppyolov2_r50vd_dcn_365e_coco` ,including:`infer_cfg.yml`(prediction not required), `inference.pdiparams`, `inference.pdiparams.info`,`inference.pdmodel` + +More model export tutorials, please refer to:[EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md) + + + +### 6.2 Inference + +`model_path` represent the trained model path, and layoutparser is used to predict: + +```bash +import layoutparser as lp +model = lp.PaddleDetectionLayoutModel(model_path="inference/ppyolov2_r50vd_dcn_365e_coco", threshold=0.5,label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"},enforce_cpu=True,enable_mkldnn=True) +``` + + + +*** + +More PaddleDetection training tutorials,please reference:[PaddleDetection Training](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/GETTING_STARTED_cn.md) + +*** + -- GitLab