From 38fa8564321c6b27e282f9a0373091bad846614e Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Wed, 30 Jun 2021 19:33:04 +0800 Subject: [PATCH] add training mainbody doc (#994) * add training mainbody doc * fix en doc --- docs/en/application/mainbody_detection_en.md | 122 ++++++++++++++++++- docs/images/det/PaddleDetection_config.png | Bin 0 -> 56700 bytes docs/zh_CN/application/mainbody_detection.md | 118 +++++++++++++++++- 3 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 docs/images/det/PaddleDetection_config.png diff --git a/docs/en/application/mainbody_detection_en.md b/docs/en/application/mainbody_detection_en.md index 09276fbf..46373c37 100644 --- a/docs/en/application/mainbody_detection_en.md +++ b/docs/en/application/mainbody_detection_en.md @@ -22,7 +22,7 @@ The datasets we used for mainbody detection task are shown in the following tabl In the actual training process, all datasets are mixed together. Categories of all the labeled boxes are modified to the category `foreground`, and the detection model we trained just contains one category (`foreground`). -## 2. Model Training +## 2. Model Selection There are many types of object detection methods such as the commonly used two-stage detectors (FasterRCNN series, etc.), single-stage detectors (YOLO, SSD, etc.), anchor-free detectors (FCOS, etc.) and so on. @@ -45,3 +45,123 @@ For more information about PP-YOLO, you can refer to [PP-YOLO tutorial](https:// In the mainbody detection task, we use `ResNet50vd-DCN` as our backbone for better performance. The config file is [ppyolov2_r50vd_dcn_365e_coco.yml](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml) used for the model training, in which the dagtaset path is modified to the mainbody detection dataset. The final inference model can be downloaded [here](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar). + + +## 3. Model training + +This section mainly talks about how to train your own mainbody detection model using PaddleDetection on your own dataset. + +### 3.1 Prepare for the environment + +Download PaddleDetection and install requirements。 + +```shell +cd +git clone https://github.com/PaddlePaddle/PaddleDetection.git + +cd PaddleDetection +# install requirements +pip install -r requirements.txt +``` + +For more installation tutorials, please refer to [Installation tutorial]() + +更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL.md) + +### 3.2 Prepare for the dataset + +For customized dataset, you should convert it to COCO format. Please refer to [Customized dataset tutorial](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/static/docs/tutorials/Custom_DataSet.md) to build your own dataset with COCO format. + +In mainbody detection task, all the objects belong to foregroud. Therefore, `category_id` of all the objects in the annotation file should be modified to 1. And the `categories` map should be modified as follows, in which just class `foregroud` is included. + +```json +[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}] +``` + +### 3.3 Configuration files + +You can use `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml` to train the model, mode details are as follows. + +
+ +
+ +`ppyolov2_r50vd_dcn_365e_coco.yml` depends on other configuration files, their meanings are as follows. + + +``` +coco_detection.yml:num_class of the model, and train/eval/test dataset. + +runtime.yml:public runtime parameters, use_gpu, save_interval, etc. + +optimizer_365e.yml:learning rate and optimizer. + +ppyolov2_r50vd_dcn.yml:model architecture. + +ppyolov2_reader.yml:train/eval/test reader. +``` + +In mainbody detection task, you need to modify `num_classes` in `datasets/coco_detection.yml` to 1 (just `foreground` is included). Dataset path should also be updated. + + +### 3.4 Begin the training process + + +PaddleDetection supports many ways of training process. + +* Training using single GPU + +```bash +# not needed for windows and Mac +export CUDA_VISIBLE_DEVICES=0 +python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml +``` + +* Training using multiple GPU's + +```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:eval during training + +* Resume training: you can use `-r` to load checkpoints and resume 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 error `out of memory` occured, you can try to decrease `batch_size` in `ppyolov2_reader.yml`. + + +### 3.5 Model prediction + +Use the following command to finish the prediction process. + + + +```bash +export CUDA_VISIBLE_DEVICES=0 +python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final +``` + +`--draw_threshold` is an optional parameter. + +### 3.6 Export model and inference. + +Use the following to export the inference 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 inference model will be saved folder `inference/ppyolov2_r50vd_dcn_365e_coco`, which contains `model.pdiparams`, `model.pdiparams.info`,`model.pdmodel` and `infer_cfg.yml`(optional for mainbody detection). + +* Note: Inference model name that `PaddleDetection` exports is `model.xxx`, here if you want to keep it consistent with `PaddleClas`, you can rename `model.xxx` to `inference.xxx` for subsequent inference. + +For more model export tutorial, please refer to [EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md). + +Now you get the newest model on your own dataset. In the recognition process, you can replace the detection model path with yours. For quick start of recognition process, please refer to the [tutorial](../tutorials/quick_start_recognition_en.md). diff --git a/docs/images/det/PaddleDetection_config.png b/docs/images/det/PaddleDetection_config.png new file mode 100644 index 0000000000000000000000000000000000000000..d18932b66cc148b7796fe4b319ad9eb82c2a2868 GIT binary patch literal 56700 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 +git clone https://github.com/PaddlePaddle/PaddleDetection.git + +cd PaddleDetection +# 安装其他依赖 +pip install -r requirements.txt +``` + +更多安装教程,请参考: [安装文档](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/docs/tutorials/INSTALL_cn.md) + +### 3.2 数据准备 + +对于自定义数据集,首先需要将自己的数据集修改为COCO格式,可以参考[自定义检测数据集教程](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/static/docs/tutorials/Custom_DataSet.md)制作COCO格式的数据集。 + +主体检测任务中,所有的检测框均属于前景,在这里需要将标注文件中,检测框的`category_id`修改为1,同时将整个标注文件中的`categories`映射表修改为下面的格式,即整个类别映射表中只包含`前景`类别。 + +```json +[{u'id': 1, u'name': u'foreground', u'supercategory': u'foreground'}] +``` + +### 3.3 配置文件改动和说明 + +我们使用 `configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml`配置进行训练,配置文件摘要如下: + +
+ +
+ +从上图看到 `ppyolov2_r50vd_dcn_365e_coco.yml` 配置需要依赖其他的配置文件,这些配置文件的含义如下: + +``` +coco_detection.yml:主要说明了训练数据和验证数据的路径 + +runtime.yml:主要说明了公共的运行参数,比如是否使用GPU、每多少个epoch存储checkpoint等 + +optimizer_365e.yml:主要说明了学习率和优化器的配置 + +ppyolov2_r50vd_dcn.yml:主要说明模型和主干网络的情况 + +ppyolov2_reader.yml:主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等 +``` +在主体检测任务中,需要将`datasets/coco_detection.yml`中的`num_classes`参数修改为1(只有1个前景类别),同时将训练集和测试集的路径修改为自定义数据集的路径。 + +此外,也可以根据实际情况,修改上述文件,比如,如果显存溢出,可以将batch size和学习率等比缩小等。 + + +### 3.4 启动训练 + +PaddleDetection提供了单卡/多卡训练模式,满足用户多种训练需求。 + +* GPU 单卡训练 + +```bash +# windows和Mac下不需要执行该命令 +export CUDA_VISIBLE_DEVICES=0 +python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml +``` + +* GPU多卡训练 + +```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:表示边训练边验证 + +* 模型恢复训练 + +在日常训练过程中,有的用户由于一些原因导致训练中断,可以使用-r的命令恢复训练: + +```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 +``` + +注意:如果遇到 "`Out of memory error`" 问题, 尝试在 `ppyolov2_reader.yml` 文件中调小`batch_size` + + +### 3.5 模型预测与调试 + +使用下面的命令完成PaddleDetection的预测过程。 + +```bash +export CUDA_VISIBLE_DEVICES=0 +python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_365e_coco.yml --infer_img=your_image_path.jpg --output_dir=infer_output/ --draw_threshold=0.5 -o weights=output/ppyolov2_r50vd_dcn_365e_coco/model_final +``` + +`--draw_threshold` 是个可选参数. 根据 [NMS](https://ieeexplore.ieee.org/document/1699659) 的计算,不同阈值会产生不同的结果 `keep_top_k`表示设置输出目标的最大数量,默认值为100,用户可以根据自己的实际情况进行设定。 + +### 3.6 模型导出与预测部署。 + +执行导出模型脚本: + +```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 +``` + +预测模型会导出到`inference/ppyolov2_r50vd_dcn_365e_coco`目录下,分别为`infer_cfg.yml`(预测不需要), `model.pdiparams`, `model.pdiparams.info`,`model.pdmodel` 。 + +注意:`PaddleDetection`导出的inference模型的文件格式为`model.xxx`,这里如果希望与PaddleClas的inference模型文件格式保持一致,需要将其`model.xxx`文件修改为`inference.xxx`文件,用于后续主体检测的预测部署。 + +更多模型导出教程,请参考:[EXPORT_MODEL](https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.1/deploy/EXPORT_MODEL.md) + +导出模型之后,在主体检测与识别任务中,就可以将检测模型的路径更改为该inference模型路径,完成预测。图像识别快速体验可以参考:[图像识别快速开始教程](../tutorials/quick_start_recognition.md)。 -- GitLab