diff --git a/dygraph/deploy/EXPORT_MODEL.md b/dygraph/deploy/EXPORT_MODEL.md index afd622b0fb636a6cbabce3be189867017c9e3f66..eb46e48edd8d4621915da40e81c5d85921b404c1 100644 --- a/dygraph/deploy/EXPORT_MODEL.md +++ b/dygraph/deploy/EXPORT_MODEL.md @@ -1,66 +1,53 @@ -# 模型动转静导出 - -训练得到一个满足要求的模型后,如果想要将该模型接入到C++预测库或者Serving服务,需要通过`tools/export_model.py`将动态图模型转化为静态图模型并导出。同时,会导出预测时使用的配置文件,路径与模型保存路径相同, 配置文件名为`infer_cfg.yml`。 - -**说明:** - -- **输入部分:** 动转静导出模型输入统一为: +# PaddleDetection模型导出教程 +## 模型导出 +本章节介绍如何使用`tools/export_model.py`脚本导出模型。 +### 导出模输入输出说明 +- `PaddleDetection`中输入变量以及输入形状如下: | 输入名称 | 输入形状 | 表示含义 | | :---------: | ----------- | ---------- | | 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部分。 -具体预处理方式可参考配置文件中TestReader部分。 - -- **输出部分:** 动转静导出模型输出统一为: +- PaddleDetection`中动转静导出模型输出统一为: - 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相关操作的情况。 +**注意**模型动转静导出不支持模型结构中包含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 +# 导出YOLOv3模型 +python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml --output_dir=./inference_model \ + -o weights=weights/yolov3_darknet53_270e_coco.pdparams ``` -预测模型会导出到`inference_model/faster_rcnn_r50_1x_coco`目录下,分别为`infer_cfg.yml`, `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel`。 +预测模型会导出到`inference_model/yolov3_darknet53_270e_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] - +# 导出YOLOv3模型,输入是3x640x640 +python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml --output_dir=./inference_model \ + -o weights=weights/yolov3_darknet53_270e_coco.pdparams TestReader.inputs_def.image_shape=[3,640,640] ``` diff --git a/dygraph/deploy/README.md b/dygraph/deploy/README.md index 2f8818816bb0f70302ac4305c449669ff3c04cc5..d805ee57324ddd1d7f22695492bcbd305753be9b 100644 --- a/dygraph/deploy/README.md +++ b/dygraph/deploy/README.md @@ -1,28 +1,72 @@ # PaddleDetection 预测部署 +训练得到一个满足要求的模型后,如果想要将该模型部署到已选择的平台上,需要通过`tools/export_model.py`将模型导出预测部署的模型和配置文件。 +并在同一文件夹下导出预测时使用的配置文件,配置文件名为`infer_cfg.yml`。 -`PaddleDetection`目前支持: -- 使用`Python`和`C++`部署在`Windows` 和`Linux` 上运行 -- [在线服务化部署](./serving/README.md) -- [移动端部署](https://github.com/PaddlePaddle/Paddle-Lite-Demo) +## `PaddleDetection`目前支持的部署方式按照部署设备可以分为: +- 在本机`python`语言部署,支持在有`python paddle`(支持`CPU`、`GPU`)环境下部署,有两种方式: + - 使用`tools/infer.py`,此种方式依赖`PaddleDetection`代码库。 + - 将模型导出,使用`deploy/python/infer.py`,此种方式不依赖`PaddleDetection`代码库,可以单个`python`文件部署。 +- 在本机`C++`语言使用`paddle inference`预测库部署,支持在`Linux`和`Windows`系统下部署。请参考文档[C++部署](cpp/README.md)。 +- 在服务器端以服务形式部署,使用[PaddleServing](./serving/README.md)部署。 +- 在手机移动端部署,使用[Paddle-Lite](https://github.com/PaddlePaddle/Paddle-Lite) 在手机移动端部署。 + 常见模型部署Demo请参考[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo) 。 +- `NV Jetson`嵌入式设备上部署 ## 模型导出 -训练得到一个满足要求的模型后,如果想要将该模型接入到C++服务器端预测库或移动端预测库,需要通过`tools/export_model.py`导出该模型。 +使用`tools/export_model.py`脚本导出模型已经部署时使用的配置文件,配置文件名字为`infer_cfg.yml`。模型导出脚本如下: +```bash +# 导出YOLOv3模型 +python tools/export_model.py -c configs/yolov3/yolov3_darknet53_270e_coco.yml --output_dir=./inference_model \ + -o weights=weights/yolov3_darknet53_270e_coco.pdparams +``` +预测模型会导出到`inference_model/yolov3_darknet53_270e_coco`目录下,分别为`infer_cfg.yml`, `model.pdiparams`, `model.pdiparams.info`, `model.pdmodel`。 -- [导出教程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md) +模型导出具体请参考文档[PaddleDetection模型导出教程](EXPORT_MODEL.md)。 -模型导出后, 目录结构如下(以`yolov3_darknet`为例): -``` -yolov3_darknet # 模型目录 -├── infer_cfg.yml # 模型配置信息 -├── __model__ # 模型文件 -└── __params__ # 参数文件 +## 如何选择部署时依赖库的版本 + +### CUDA、cuDNN、TensorRT版本选择 +由于CUDA、cuDNN、TENSORRT不一定都是向前兼容的,需要使用与编译Paddle预测库使用的环境完全一致的环境进行部署。 + +### 部署时预测库版本、预测引擎版本选择 + +- Linux、Windows平台下C++部署,需要使用Paddle预测库进行部署。 + (1)Paddle官网提供在不同平台、不同环境下编译好的预测库,您可以直接使用,请在这里[Paddle预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/05_inference_deployment/inference/build_and_install_lib_cn.html) 选择。 + (2)如果您将要部署的平台环境,Paddle官网上没有提供已编译好的预测库,您可以自行编译,编译过程请参考[Paddle源码编译](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/compile/linux-compile.html)。 + +- Python语言部署,需要在对应平台上安装Paddle Python包。如果Paddle官网上没有提供该平台下的Paddle Python包,您可以自行编译,编译过程请参考[Paddle源码编译](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/compile/linux-compile.html)。 + +- PaddleServing部署 + PaddleServing 0.4.0是基于Paddle 1.8.4开发,PaddleServing 0.4.1是基于Paddle2.0开发。 + +- Paddle-Lite部署 + Paddle-Lite支持OP列表请参考:[Paddle-Lite支持的OP列表](https://paddle-lite.readthedocs.io/zh/latest/source_compile/library.html) ,请跟进所部署模型中使用到的op选择Paddle-Lite版本。 + +- NV Jetson部署 + Paddle官网提供在NV Jetson平台上已经编译好的预测库,[Paddle NV Jetson预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/05_inference_deployment/inference/build_and_install_lib_cn.html) 。 + 若列表中没有您需要的预测库,您可以在您的平台上自行编译,编译过程请参考[Paddle源码编译](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/compile/linux-compile.html)。 + + +## 部署 +- C++部署,先使用跨平台编译工具`CMake`根据`CMakeLists.txt`生成`Makefile`,支持`Windows、Linux、NV Jetson`平台,然后进行编译产出可执行文件。可以直接使用`cpp/scripts/build.sh`脚本编译: +```buildoutcfg +cd cpp +sh scripts/build.sh ``` -预测时,该目录所在的路径会作为程序的输入参数。 +- Python部署,可以使用使用`tools/infer.py`(以来PaddleDetection源码)部署,或者使用`deploy/python/infer.py`单文件部署 + +- PaddleServing部署请参考,[PaddleServing部署](./serving/README.md)部署。 + +- 手机移动端部署,请参考[Paddle-Lite-Demo](https://github.com/PaddlePaddle/Paddle-Lite-Demo)部署。 + + +## 常见问题QA +- 1、`Paddle 1.8.4`训练的模型,可以用`Paddle2.0`部署吗? + Paddle 2.0是兼容Paddle 1.8.4的,因此是可以的。但是部分模型(如SOLOv2)使用到了Paddle 2.0中新增OP,这类模型不可以。 + +- 2、Windows编译时,预测库是VS2015编译的,选择VS2017或VS2019会有问题吗? + 关于VS兼容性问题请参考:[C++Visual Studio 2015、2017和2019之间的二进制兼容性](https://docs.microsoft.com/zh-cn/cpp/porting/binary-compat-2015-2017?view=msvc-160) -## 预测部署 -- [1. Python预测(支持 Linux 和 Windows)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/python) -- [2. C++预测(支持 Linux 和 Windows)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/deploy/cpp) -- [3. 在线服务化部署](./serving/README.md) -- [4. 移动端部署](https://github.com/PaddlePaddle/Paddle-Lite-Demo) -- [5. Jetson设备部署](./cpp/docs/Jetson_build.md) +- 3、cuDNN 8.0.4连续预测会发生内存泄漏吗? + 经QA测试,发现cuDNN 8系列连续预测时都有内存泄漏问题,且cuDNN 8性能差于cuDNN 7,推荐使用CUDA + cuDNN7.6.4的方式进行部署。 diff --git a/dygraph/deploy/cpp/CMakeLists.txt b/dygraph/deploy/cpp/CMakeLists.txt index 0acb361546b535d209755d3274064fde4261be61..453be9bd742d2f4a6c10ebf3c2908a29d51c397f 100644 --- a/dygraph/deploy/cpp/CMakeLists.txt +++ b/dygraph/deploy/cpp/CMakeLists.txt @@ -3,7 +3,6 @@ project(PaddleObjectDetector CXX C) option(WITH_MKL "Compile demo with MKL/OpenBlas support,defaultuseMKL." ON) option(WITH_GPU "Compile demo with GPU/CPU, default use CPU." ON) -option(WITH_STATIC_LIB "Compile demo with static/shared library, default use shared." OFF) option(WITH_TENSORRT "Compile demo with TensorRT." OFF) option(USE_PADDLE_20RC1 "Compile demo with paddle_inference_lib 2.0rc1" ON) @@ -94,10 +93,6 @@ if (WIN32) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT") - if (WITH_STATIC_LIB) - safe_set_static_flag() - add_definitions(-DSTATIC_LIB) - endif() else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o2 -fopenmp -std=c++11") set(CMAKE_STATIC_LIBRARY_PREFIX "") @@ -180,37 +175,20 @@ if (WIN32) endif() -if (WITH_STATIC_LIB) - if (WIN32 AND USE_PADDLE_20RC1) - message("This situation is actually in dynamic build mode") - set(DEPS ${PADDLE_LIB}/paddle/lib/addle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - else() - set(DEPS ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - endif() -else() - if (WIN32) - if (USE_PADDLE_20RC1) - # 2.0rc1 win32 shared lib name is paddle_fluid.dll and paddle_fluid.lib - set(DEPS ${PADDLE_LIB}/paddle/lib/paddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - else() - # before 2.0rc1 win32 shared lib name is libpaddle_fluid.dll and libpaddle_fluid.lib - set(DEPS ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - endif() +if (WIN32) + if (USE_PADDLE_20RC1) + # 2.0rc1 win32 shared lib name is paddle_fluid.dll and paddle_fluid.lib + set(DEPS ${PADDLE_DIR}/paddle/lib/paddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) else() - # linux shared lib name is libpaddle_fluid.so - set(DEPS ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) + # before 2.0rc1 win32 shared lib name is libpaddle_fluid.dll and libpaddle_fluid.lib + set(DEPS ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) endif() -endif() - - -if(WITH_STATIC_LIB) - set(DEPS - ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) else() - set(DEPS - ${PADDLE_DIR}/paddle/lib/${WIN32_PADDLE_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) + # linux shared lib name is libpaddle_fluid.so + set(DEPS ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() +message("DEPS:" $DEPS) if (NOT WIN32) set(DEPS ${DEPS} @@ -259,6 +237,7 @@ endif() set(DEPS ${DEPS} ${OpenCV_LIBS}) add_executable(main src/main.cc src/preprocess_op.cc src/object_detector.cc) ADD_DEPENDENCIES(main ext-yaml-cpp) +message("DEPS:" $DEPS) target_link_libraries(main ${DEPS}) if (WIN32 AND WITH_MKL) diff --git a/dygraph/deploy/cpp/docs/linux_build.md b/dygraph/deploy/cpp/docs/linux_build.md index f22739638d760f62fda6d6c5938891978fdc77b6..1ddb7a150e11e4ec6c5fa1b62d6606fc60719a83 100644 --- a/dygraph/deploy/cpp/docs/linux_build.md +++ b/dygraph/deploy/cpp/docs/linux_build.md @@ -58,10 +58,6 @@ TENSORRT_LIB_DIR=/path/to/TensorRT/lib # Paddle 预测库路径 PADDLE_DIR=/path/to/fluid_inference -# Paddle 的预测库是否使用静态库来编译 -# 使用TensorRT时,Paddle的预测库通常为动态库 -WITH_STATIC_LIB=OFF - # CUDA 的 lib 路径 CUDA_LIB=/path/to/cuda/lib @@ -78,7 +74,6 @@ cmake .. \ -DTENSORRT_LIB_DIR=${TENSORRT_LIB_DIR} \ -DTENSORRT_INC_DIR=${TENSORRT_INC_DIR} \ -DPADDLE_DIR=${PADDLE_DIR} \ - -DWITH_STATIC_LIB=${WITH_STATIC_LIB} \ -DCUDA_LIB=${CUDA_LIB} \ -DCUDNN_LIB=${CUDNN_LIB} \ -DOPENCV_DIR=${OPENCV_DIR} diff --git a/dygraph/deploy/cpp/scripts/build.sh b/dygraph/deploy/cpp/scripts/build.sh index 73ba6527c2c15fd7eab715ddc9aaf704bd0e3ee6..be11362881d2e5cc726629c21502d28186be4d40 100644 --- a/dygraph/deploy/cpp/scripts/build.sh +++ b/dygraph/deploy/cpp/scripts/build.sh @@ -19,10 +19,6 @@ TENSORRT_LIB_DIR=/path/to/tensorrt/include # Paddle 预测库路径 PADDLE_DIR=/path/to/fluid_inference/ -# Paddle 的预测库是否使用静态库来编译 -# 使用TensorRT时,Paddle的预测库通常为动态库 -WITH_STATIC_LIB=OFF - # CUDA 的 lib 路径 CUDA_LIB=/path/to/cuda/lib diff --git a/dygraph/deploy/serving/README.md b/dygraph/deploy/serving/README.md new file mode 100644 index 0000000000000000000000000000000000000000..48fc2f03d687328aa1f8d26116ca8165ab202e98 --- /dev/null +++ b/dygraph/deploy/serving/README.md @@ -0,0 +1,106 @@ +# 服务端预测部署 + +`PaddleDetection`训练出来的模型可以使用[Serving](https://github.com/PaddlePaddle/Serving) 部署在服务端。 +本教程以在路标数据集[roadsign_voc](https://paddlemodels.bj.bcebos.com/object_detection/roadsign_voc.tar) 使用`configs/yolov3_mobilenet_v1_roadsign.yml`算法训练的模型进行部署。 +预训练模型权重文件为[yolov3_mobilenet_v1_roadsign.pdparams](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_roadsign.pdparams) 。 + +## 1. 首先验证模型 +``` +python tools/infer.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_roadsign.pdparams --infer_img=demo/road554.png +``` + +## 2. 安装 paddle serving +``` +# 安装 paddle-serving-client +pip install paddle-serving-client -i https://mirror.baidu.com/pypi/simple + +# 安装 paddle-serving-server +pip install paddle-serving-server -i https://mirror.baidu.com/pypi/simple + +# 安装 paddle-serving-server-gpu +pip install paddle-serving-server-gpu -i https://mirror.baidu.com/pypi/simple +``` + +## 3. 导出模型 +PaddleDetection在训练过程包括网络的前向和优化器相关参数,而在部署过程中,我们只需要前向参数,具体参考:[导出模型](https://github.com/PaddlePaddle/PaddleDetection/blob/master/docs/advanced_tutorials/deploy/EXPORT_MODEL.md) + +``` +python tools/export_serving_model.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1_roadsign.pdparams --output_dir=./inference_model +``` + +以上命令会在./inference_model文件夹下生成一个`yolov3_mobilenet_v1_roadsign`文件夹: +``` +inference_model +│ ├── yolov3_mobilenet_v1_roadsign +│ │ ├── infer_cfg.yml +│ │ ├── serving_client +│ │ │ ├── serving_client_conf.prototxt +│ │ │ ├── serving_client_conf.stream.prototxt +│ │ ├── serving_server +│ │ │ ├── conv1_bn_mean +│ │ │ ├── conv1_bn_offset +│ │ │ ├── conv1_bn_scale +│ │ │ ├── ... +``` + +`serving_client`文件夹下`serving_client_conf.prototxt`详细说明了模型输入输出信息 +`serving_client_conf.prototxt`文件内容为: +``` +feed_var { + name: "image" + alias_name: "image" + is_lod_tensor: false + feed_type: 1 + shape: 3 + shape: 608 + shape: 608 +} +feed_var { + name: "im_size" + alias_name: "im_size" + is_lod_tensor: false + feed_type: 2 + shape: 2 +} +fetch_var { + name: "multiclass_nms_0.tmp_0" + alias_name: "multiclass_nms_0.tmp_0" + is_lod_tensor: true + fetch_type: 1 + shape: -1 +} +``` + +## 4. 启动PaddleServing服务 + +``` +cd inference_model/yolov3_mobilenet_v1_roadsign/ + +# GPU +python -m paddle_serving_server_gpu.serve --model serving_server --port 9393 --gpu_ids 0 + +# CPU +python -m paddle_serving_server.serve --model serving_server --port 9393 +``` + +## 5. 测试部署的服务 +准备`label_list.txt`文件 +``` +# 进入到导出模型文件夹 +cd inference_model/yolov3_mobilenet_v1_roadsign/ + +# 将数据集对应的label_list.txt文件拷贝到当前文件夹下 +cp ../../dataset/roadsign_voc/label_list.txt . +``` + +设置`prototxt`文件路径为`serving_client/serving_client_conf.prototxt` 。 +设置`fetch`为`fetch=["multiclass_nms_0.tmp_0"])` + +测试 +``` +# 进入目录 +cd inference_model/yolov3_mobilenet_v1_roadsign/ + +# 测试代码 test_client.py 会自动创建output文件夹,并在output下生成`bbox.json`和`road554.png`两个文件 +python ../../deploy/serving/test_client.py ../../demo/road554.png +``` diff --git a/dygraph/deploy/serving/test_client.py b/dygraph/deploy/serving/test_client.py new file mode 100644 index 0000000000000000000000000000000000000000..7c2a6395f1ef34c9ca5a7bea4d23c47e9b7a63b9 --- /dev/null +++ b/dygraph/deploy/serving/test_client.py @@ -0,0 +1,40 @@ +# Copyright (c) 2020 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. + +import sys +import numpy as np +from paddle_serving_client import Client +from paddle_serving_app.reader import * +import cv2 +preprocess = Sequential([ + File2Image(), BGR2RGB(), Resize( + (608, 608), interpolation=cv2.INTER_LINEAR), Div(255.0), Transpose( + (2, 0, 1)) +]) + +postprocess = RCNNPostprocess("label_list.txt", "output", [608, 608]) +client = Client() + +client.load_client_config("serving_client/serving_client_conf.prototxt") +client.connect(['127.0.0.1:9393']) + +im = preprocess(sys.argv[1]) +fetch_map = client.predict( + feed={ + "image": im, + "im_size": np.array(list(im.shape[1:])), + }, + fetch=["multiclass_nms_0.tmp_0"]) +fetch_map["image"] = sys.argv[1] +postprocess(fetch_map) diff --git a/dygraph/docs/tutorials/PrepareDataSet.md b/dygraph/docs/tutorials/PrepareDataSet.md index bf27113476d3cf4b14e5607e7b05ac77077d1101..2689ebf089c0847ad2eeb4ca9f587bdbab77f43b 100644 --- a/dygraph/docs/tutorials/PrepareDataSet.md +++ b/dygraph/docs/tutorials/PrepareDataSet.md @@ -23,10 +23,10 @@ | 表达方式 | 说明 | | :----------------: | :--------------------------------: | | x1,y1,x2,y2 | (x1,y1)为左上角坐标,(x2,y2)为右下角坐标 | -| x,y,w,h | (x,y)为左上角坐标,w为目标区域宽度,h为目标区域高度 | +| x1,y1,w,h | (x1,y1)为左上角坐标,w为目标区域宽度,h为目标区域高度 | | xc,yc,w,h | (xc,yc)为目标区域中心坐标,w为目标区域宽度,h为目标区域高度 | -常见的目标检测数据集如Pascal VOC和COCO,采用的是第一种 `x1,y1,x2,y2` 表示物体的bounding box. +常见的目标检测数据集如Pascal VOC采用的`[x1,y1,x2,y2]` 表示物体的bounding box, COCO采用的`[x1,y1,w,h]` 表示物体的bounding box, Cformat](https://cocodataset.org/#format-data). ### 准备训练数据 @@ -208,7 +208,7 @@ json文件中包含以下key: 'area': 2765.1486500000005, # 物体的区域面积 'iscrowd': 0, # iscrowd 'image_id': 558840, # image id - 'bbox': [199.84, 200.46, 77.71, 70.88], # bbox + 'bbox': [199.84, 200.46, 77.71, 70.88], # bbox [x1,y1,w,h] 'category_id': 58, # category_id 'id': 156 # image id }