From bc5638339f5acaeece7237861ed467fdf7ff859a Mon Sep 17 00:00:00 2001 From: wangguanzhong Date: Fri, 18 Dec 2020 16:02:31 +0800 Subject: [PATCH] [Dygraph]add export_model doc, test=document_fix (#1927) * add export_model doc, test=document_fix * update doc --- deploy/EXPORT_MODEL.md | 66 +++++++++++++++++++++++++++++++++++++++++ deploy/cpp/README.md | 9 +++--- deploy/python/README.md | 13 ++++---- 3 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 deploy/EXPORT_MODEL.md diff --git a/deploy/EXPORT_MODEL.md b/deploy/EXPORT_MODEL.md new file mode 100644 index 000000000..afd622b0f --- /dev/null +++ b/deploy/EXPORT_MODEL.md @@ -0,0 +1,66 @@ +# 模型动转静导出 + +训练得到一个满足要求的模型后,如果想要将该模型接入到C++预测库或者Serving服务,需要通过`tools/export_model.py`将动态图模型转化为静态图模型并导出。同时,会导出预测时使用的配置文件,路径与模型保存路径相同, 配置文件名为`infer_cfg.yml`。 + +**说明:** + +- **输入部分:** 动转静导出模型输入统一为: + +| 输入名称 | 输入形状 | 表示含义 | +| :---------: | ----------- | ---------- | +| image | [None, 3, H, W] | 输入网络的图像,None表示batch维度,如果输入图像大小为变长,则H,W为None | +| im_shape | [None, 2] | 图像经过resize后的大小,表示为H,W, None表示batch维度 | +| scale_factor | [None, 2] | 输入图像大小比真实图像大小,表示为scale_y, scale_x | + + +具体预处理方式可参考配置文件中TestReader部分。 + + +- **输出部分:** 动转静导出模型输出统一为: + + - bbox, NMS的输出,形状为[N, 6], 其中N为预测框的个数,6为[class_id, score, x1, y1, x2, y2]。 + - bbox\_num, 每张图片对应预测框的个数,例如batch_size为2,输出为[N1, N2], 表示第一张图包含N1个预测框,第二张图包含N2个预测框,并且预测框的总个数和NMS输出的第一维N相同 + - mask,如果网络中包含mask,则会输出mask分支 + +- 模型动转静导出不支持模型结构中包含numpy相关操作的情况。 + + +## 启动参数说明 + +| FLAG | 用途 | 默认值 | 备注 | +|:--------------:|:--------------:|:------------:|:-----------------------------------------:| +| -c | 指定配置文件 | None | | +| --output_dir | 模型保存路径 | `./output_inference` | 模型默认保存在`output/配置文件名/`路径下 | + +## 使用示例 + +使用训练得到的模型进行试用,脚本如下 + +```bash +# 导出FasterRCNN模型 +python tools/export_model.py -c configs/faster_rcnn_r50_1x_coco.yml \ + --output_dir=./inference_model \ + -o weights=output/faster_rcnn_r50_1x_coco/model_final +``` + +预测模型会导出到`inference_model/faster_rcnn_r50_1x_coco`目录下,分别为`infer_cfg.yml`, `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel`。 + + +## 设置导出模型的输入大小 + +使用Fluid-TensorRT进行预测时,由于<=TensorRT 5.1的版本仅支持定长输入,保存模型的`data`层的图片大小需要和实际输入图片大小一致。而Fluid C++预测引擎没有此限制。设置TestReader中的`image_shape`可以修改保存模型中的输入图片大小。示例如下: + +```bash +# 导出FasterRCNN模型,输入是3x640x640 +python tools/export_model.py -c configs/faster_rcnn_r50_1x_coco.yml \ + --output_dir=./inference_model \ + -o weights=https://paddlemodels.bj.bcebos.com/object_detection/dygraph/faster_rcnn_r50_1x_coco.pdparams \ + TestReader.inputs_def.image_shape=[3,640,640] + +# 导出YOLOv3模型,输入是3x320x320 +python tools/export_model.py -c configs/yolov3_darknet53_270e_coco.yml \ + --output_dir=./inference_model \ + -o weights=https://paddlemodels.bj.bcebos.com/object_detection/dygraph/yolov3_darknet53_270e_coco.pdparams \ + TestReader.inputs_def.image_shape=[3,320,320] + +``` diff --git a/deploy/cpp/README.md b/deploy/cpp/README.md index c7c5e50ff..69cb26e85 100644 --- a/deploy/cpp/README.md +++ b/deploy/cpp/README.md @@ -18,7 +18,7 @@ - 跨平台,支持在 `Windows` 和 `Linux` 完成编译、二次开发集成和部署运行 - 可扩展性,支持用户针对新模型开发自己特殊的数据预处理等逻辑 - 高性能,除了`PaddlePaddle`自身带来的性能优势,我们还针对图像检测的特点对关键步骤进行了性能优化 -- 支持各种不同检测模型结构,包括`Yolov3`/`Faster_RCNN`/`SSD`/`RetinaNet`等 +- 支持各种不同检测模型结构,包括`Yolov3`/`Faster_RCNN`/`SSD`等 ## 2.主要目录和文件 @@ -52,14 +52,15 @@ deploy/cpp ## 3.编译部署 ### 3.1 导出模型 -请确认您已经基于`PaddleDetection`的[export_model.py](https://github.com/PaddlePaddle/PaddleDetection/blob/master/tools/export_model.py)导出您的模型,并妥善保存到合适的位置。导出模型细节请参考 [导出模型教程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md)。 +请确认您已经基于`PaddleDetection`的[export_model.py](https://github.com/PaddlePaddle/PaddleDetection/blob/dygraph/tools/export_model.py)导出您的模型,并妥善保存到合适的位置。导出模型细节请参考 [导出模型教程](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/deploy/EXPORT_MODEL.md)。 模型导出后, 目录结构如下(以`yolov3_darknet`为例): ``` yolov3_darknet # 模型目录 ├── infer_cfg.yml # 模型配置信息 -├── __model__ # 模型文件 -└── __params__ # 参数文件 +├── model.pdmodel # 模型文件 +├── model.pdiparams.info #模型公用信息 +└── model.pdiparams # 参数文件 ``` 预测时,该目录所在的路径会作为程序的输入参数。 diff --git a/deploy/python/README.md b/deploy/python/README.md index b8b3b87be..d8874ea62 100644 --- a/deploy/python/README.md +++ b/deploy/python/README.md @@ -3,12 +3,9 @@ Python预测可以使用`tools/infer.py`,此种方式依赖PaddleDetection源码;也可以使用本篇教程预测方式,先将模型导出,使用一个独立的文件进行预测。 -本篇教程使用AnalysisPredictor对[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md)进行高性能预测。 +本篇教程使用AnalysisPredictor对[导出模型](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/deploy/EXPORT_MODEL.md)进行高性能预测。 -在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法, 下面列出了两种不同的预测方式。Executor同时支持训练和预测,AnalysisPredictor则专门针对推理进行了优化,是基于[C++预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/native_infer.html)的Python接口,该引擎可以对模型进行多项图优化,减少不必要的内存拷贝。如果用户在部署已训练模型的过程中对性能有较高的要求,我们提供了独立于PaddleDetection的预测脚本,方便用户直接集成部署。 - -- Executor:[Executor](https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basic_concept/executor.html#executor) -- AnalysisPredictor:[AnalysisPredictor](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/python_infer_cn.html#analysispredictor) +在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法, 预测引擎使用了AnalysisPredictor,专门针对推理进行了优化,是基于[C++预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/native_infer.html)的Python接口,该引擎可以对模型进行多项图优化,减少不必要的内存拷贝。如果用户在部署已训练模型的过程中对性能有较高的要求,我们提供了独立于PaddleDetection的预测脚本,方便用户直接集成部署。 主要包含两个步骤: @@ -18,15 +15,15 @@ Python预测可以使用`tools/infer.py`,此种方式依赖PaddleDetection源 ## 1. 导出预测模型 -PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md) +PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](https://github.com/PaddlePaddle/PaddleDetection/tree/dygraph/deploy/EXPORT_MODEL.md) -导出后目录下,包括`__model__`,`__params__`和`infer_cfg.yml`三个文件。 +导出后目录下,包括`infer_cfg.yml`, `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel`四个文件。 ## 2. 基于python的预测 ### 2.1 安装依赖 - `PaddlePaddle`的安装: - 请点击[官方安装文档](https://paddlepaddle.org.cn/install/quick) 选择适合的方式,版本为1.7以上即可 + 请点击[官方安装文档](https://paddlepaddle.org.cn/install/quick) 选择适合的方式,版本为2.0rc1以上即可 - 切换到`PaddleDetection`代码库根目录,执行`pip install -r requirements.txt`安装其它依赖 ### 2.2 执行预测程序 -- GitLab