diff --git a/inference/CMakeLists.txt b/inference/CMakeLists.txt index 8c3808dabe86edb54e613a1b5a6b0a4a0617e79a..6a13d69eb2d2096b9077ae2e062c43b5812b152a 100644 --- a/inference/CMakeLists.txt +++ b/inference/CMakeLists.txt @@ -69,6 +69,7 @@ link_directories("${CMAKE_CURRENT_BINARY_DIR}/ext/yaml-cpp/lib") link_directories("${CMAKE_CURRENT_BINARY_DIR}") if (WIN32) include_directories("${PADDLE_DIR}/paddle/fluid/inference") + include_directories("${PADDLE_DIR}/paddle/include") link_directories("${PADDLE_DIR}/paddle/fluid/inference") include_directories("${OPENCV_DIR}/build/include") include_directories("${OPENCV_DIR}/opencv/build/include") @@ -133,6 +134,7 @@ if(WITH_MKL) else () set(MATH_LIB ${PADDLE_DIR}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX}) + execute_process(COMMAND cp -r ${PADDLE_DIR}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} /usr/lib) endif () set(MKLDNN_PATH "${PADDLE_DIR}/third_party/install/mkldnn") if(EXISTS ${MKLDNN_PATH}) @@ -147,22 +149,22 @@ else() set(MATH_LIB ${PADDLE_DIR}/third_party/install/openblas/lib/libopenblas${CMAKE_STATIC_LIBRARY_SUFFIX}) endif() +if (WIN32) + if(EXISTS "${PADDLE_DIR}/paddle/fluid/inference/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(DEPS + ${PADDLE_DIR}/paddle/fluid/inference/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(DEPS + ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() +endif() + if(WITH_STATIC_LIB) - if (WIN32) - set(DEPS - ${PADDLE_DIR}/paddle/fluid/inference/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - else () set(DEPS ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - endif() else() - if (WIN32) - set(DEPS - ${PADDLE_DIR}/paddle/fluid/inference/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) - else () set(DEPS ${PADDLE_DIR}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) - endif() endif() if (NOT WIN32) @@ -237,6 +239,8 @@ if (WIN32) COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./mkldnn.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./mkldnn.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_DIR}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll ) endif() + +execute_process(COMMAND cp -r ${CMAKE_SOURCE_DIR}/images ${CMAKE_SOURCE_DIR}/conf ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/inference/README.md b/inference/README.md index 5e65246dc1053b7f671a91ff11e7b00021edeb31..8f4dc27b8781f1b64f41f652ac9206ed1ea69bd8 100644 --- a/inference/README.md +++ b/inference/README.md @@ -1,6 +1,15 @@ # PaddleSeg C++预测部署方案 -## 说明 + +[1.说明](#1说明) + +[2.主要目录和文件](#2主要目录和文件) + +[3.编译](#3编译) + +[4.预测并可视化结果](#4预测并可视化结果) + +## 1.说明 本目录提供一个跨平台的图像分割模型的C++预测部署方案,用户通过一定的配置,加上少量的代码,即可把模型集成到自己的服务中,完成图像分割的任务。 @@ -11,7 +20,7 @@ - 高性能,除了`PaddlePaddle`自身带来的性能优势,我们还针对图像分割的特点对关键步骤进行了性能优化 -## 主要目录和文件 +## 2.主要目录和文件 ``` inference @@ -22,7 +31,7 @@ inference ├── images │ └── humanseg # 示例人像分割模型测试图片目录 ├── tools -│ └── visualize.py # 示例人像分割模型结果可视化脚本 +│ └── visualize.py # 示例分割模型结果可视化脚本 ├── docs | ├── linux_build.md # Linux 编译指南 | ├── windows_vs2015_build.md # windows VS2015编译指南 @@ -40,7 +49,7 @@ inference ``` -## 编译 +## 3.编译 支持在`Windows`和`Linux`平台编译和使用: - [Linux 编译指南](./docs/linux_build.md) - [Windows 使用 Visual Studio 2019 Community 编译指南](./docs/windows_vs2019_build.md) @@ -48,11 +57,11 @@ inference `Windows`上推荐使用最新的`Visual Studio 2019 Community`直接编译`CMake`项目。 -## 预测并可视化结果 +## 4.预测并可视化结果 完成编译后,便生成了需要的可执行文件和链接库,然后执行以下步骤: -### 1. 下载模型文件 +### 4.1. 下载模型文件 我们提供了一个人像分割模型示例用于测试,点击右侧地址下载:[示例模型下载地址](https://paddleseg.bj.bcebos.com/inference_model/deeplabv3p_xception65_humanseg.tgz) 下载并解压,解压后目录结构如下: @@ -69,7 +78,7 @@ deeplabv3p_xception65_humanseg **假设**`Linux`上对应的路径则为`/root/projects/models/deeplabv3p_xception65_humanseg`。 -### 2. 修改配置 +### 4.2. 修改配置 基于`PaddleSeg`训练的模型导出时,会自动生成对应的预测模型配置文件,请参考文档:[模型导出](../docs/model_export.md)。 @@ -90,7 +99,7 @@ DEPLOY: # 均值 MEAN: [0.40787450980392154, 0.4575254901960784, 0.481078431372549] # 方差 - STD: [1.0, 1.0, 1.0] + STD: [0.00392156862745098, 0.00392156862745098, 0.00392156862745098] # 图片类型, rgb 或者 rgba IMAGE_TYPE: "rgb" # 分类类型数 @@ -106,7 +115,9 @@ DEPLOY: ``` 修改字段`MODEL_PATH`的值为你在**上一步**下载并解压的模型文件所放置的目录即可。 -### 3. 执行预测 +**注意**在使用CPU版本预测库时,`USE_GPU`的值必须设为0,否则无法正常预测。 + +### 4.3. 执行预测 在终端中切换到生成的可执行文件所在目录为当前目录(Windows系统为`cmd`)。 @@ -128,9 +139,7 @@ D:\projects\PaddleSeg\inference\build\Release>demo.exe --conf=D:\\projects\\Padd | input_dir | 需要预测的图片目录 | -配置文件说明请参考上一步,样例程序会扫描input_dir目录下的所有图片,并生成对应的预测结果图片: - -文件`demo.jpg`预测的结果存储在`demo_jpg.png`中,可视化结果在`demo_jpg_scoremap.png`中, 原始尺寸的预测结果在`demo_jpg_recover.png`中。 +配置文件说明请参考上一步,样例程序会扫描input_dir目录下的所有以**jpg或jpeg**为后缀的图片,并生成对应的预测结果(若input_dir目录下没有以**jpg或jpeg**为后缀的图片,程序会报错)。图像分割会对`demo.jpg`的每个像素进行分类,其预测的结果保存在`demo_jpg.png`中。分割预测结果的图不能直接看到效果,必须经过可视化处理。对于二分类的图像分割模型,样例程序自动将预测结果转换成可视化结果,保存在`demo_jpg_scoremap.png`中, 原始尺寸的预测结果在`demo_jpg_recover.png`中,如下图。对于**多分类**的图像分割模型,请参考[可视化脚本使用方法](./docs/vis.md)。 输入原图 ![avatar](images/humanseg/demo2.jpeg) diff --git a/inference/docs/demo.jpg b/inference/docs/demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e5f2157e2e5ae9628e764ef3585461fc50841fd Binary files /dev/null and b/inference/docs/demo.jpg differ diff --git a/inference/docs/demo_jpg.png b/inference/docs/demo_jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..cc702a6900eb48903794adc601821b3717d2ff68 Binary files /dev/null and b/inference/docs/demo_jpg.png differ diff --git a/inference/docs/linux_build.md b/inference/docs/linux_build.md index 80dc2d0f24424ed7e2bdaa0a353cf86bd5b2c9ac..613317c5279a142df3990acb20c60fb424be046f 100644 --- a/inference/docs/linux_build.md +++ b/inference/docs/linux_build.md @@ -1,12 +1,12 @@ # Linux平台 编译指南 ## 说明 -本文档在 `Linux`平台使用`GCC 4.8.5` 和 `GCC 4.9.4`测试过,如果需要使用更高G++版本编译使用,则需要重新编译Paddle预测库,请参考: [从源码编译Paddle预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_usage/deploy/inference/build_and_install_lib_cn.html#id15)。 +本文档在 `Linux`平台使用`GCC 4.8.5` 和 `GCC 4.9.4`测试过,如果需要使用更高版本的GCC编译使用,则需要重新编译PaddlePaddle预测库,请参考: [从源码编译Paddle预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_usage/deploy/inference/build_and_install_lib_cn.html#id15)。 ## 前置条件 * G++ 4.8.2 ~ 4.9.4 -* CUDA 8.0/ CUDA 9.0 * CMake 3.0+ +* CUDA 8.0 / CUDA 9.0 / CUDA 10.0, cudnn 7+ (仅在使用GPU版本的预测库时需要) 请确保系统已经安装好上述基本软件,**下面所有示例以工作目录为 `/root/projects/`演示**。 @@ -20,7 +20,17 @@ ### Step2: 下载PaddlePaddle C++ 预测库 fluid_inference -目前仅支持`CUDA 8` 和 `CUDA 9`,请点击 [PaddlePaddle预测库下载地址](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_usage/deploy/inference/build_and_install_lib_cn.html)下载对应的版本。 +PaddlePaddle C++ 预测库主要分为CPU版本和GPU版本。其中,针对不同的CUDA版本,GPU版本预测库又分为三个版本预测库:CUDA 8、CUDA 9和CUDA 10版本预测库。以下为各版本C++预测库的下载链接: + +| 版本 | 链接 | +| ---- | ---- | +| CPU版本 | [fluid_inference.tgz](https://paddle-inference-lib.bj.bcebos.com/latest-cpu-avx-mkl/fluid_inference.tgz) | +| CUDA 8版本 | [fluid_inference.tgz](https://paddle-inference-lib.bj.bcebos.com/latest-gpu-cuda8-cudnn7-avx-mkl/fluid_inference.tgz) | +| CUDA 9版本 | [fluid_inference.tgz](https://paddle-inference-lib.bj.bcebos.com/latest-gpu-cuda9-cudnn7-avx-mkl/fluid_inference.tgz) | +| CUDA 10版本 | [fluid_inference.tgz](https://paddle-inference-lib.bj.bcebos.com/latest-gpu-cuda10-cudnn7-avx-mkl/fluid_inference.tgz) | + + +针对不同的CPU类型、不同的指令集,官方提供更多可用的预测库版本,目前已经推出1.6版本的预测库,具体请参考以下链接:[C++预测库下载列表](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_usage/deploy/inference/build_and_install_lib_cn.html) 下载并解压后`/root/projects/fluid_inference`目录包含内容为: @@ -44,7 +54,7 @@ wget -c https://paddleseg.bj.bcebos.com/inference/opencv-3.4.6.zip unzip opencv-3.4.6.zip && cd opencv-3.4.6 # 3. 创建build目录并编译, 这里安装到/usr/local/opencv3目录 mkdir build && cd build -cmake .. -DCMAKE_INSTALL_PREFIX=/root/projects/opencv3 -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_ZLIB=ON -DBUILD_ZLIB=ON -DWITH_JPEG=ON -DBUILD_JPEG=ON -DWITH_PNG=ON -DBUILD_PNG=ON -DWITH_TIFF=ON -DBUILD_TIFF=ON +cmake .. -DCMAKE_INSTALL_PREFIX=/root/projects/opencv3 -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DBUILD_IPP_IW=OFF -DWITH_LAPACK=OFF -DWITH_EIGEN=OFF -DCMAKE_INSTALL_LIBDIR=lib64 -DWITH_ZLIB=ON -DBUILD_ZLIB=ON -DWITH_JPEG=ON -DBUILD_JPEG=ON -DWITH_PNG=ON -DBUILD_PNG=ON -DWITH_TIFF=ON -DBUILD_TIFF=ON make -j4 make install ``` @@ -53,24 +63,31 @@ make install ### Step4: 编译 -`CMake`编译时,涉及到四个编译参数用于指定核心依赖库的路径, 他们的定义如下: +`CMake`编译时,涉及到四个编译参数用于指定核心依赖库的路径, 他们的定义如下:(带*表示仅在使用**GPU版本**预测库时指定) | 参数名 | 含义 | | ---- | ---- | -| CUDA_LIB | cuda的库路径 | -| CUDNN_LIB | cuDnn的库路径| -| OPENCV_DIR | OpenCV的安装路径, | +| * CUDA_LIB | CUDA的库路径 | +| * CUDNN_LIB | cudnn的库路径| +| OPENCV_DIR | OpenCV的安装路径 | | PADDLE_DIR | Paddle预测库的路径 | -执行下列操作时,**注意**把对应的参数改为你的上述依赖库实际路径: +在使用**GPU版本**预测库进行编译时,可执行下列操作。**注意**把对应的参数改为你的上述依赖库实际路径: ```shell cd /root/projects/PaddleSeg/inference mkdir build && cd build -cmake .. -DWITH_GPU=ON -DPADDLE_DIR=/root/projects/fluid_inference -DCUDA_LIB=/usr/local/cuda/lib64/ -DOPENCV_DIR=/root/projects/opencv3/ -DCUDNN_LIB=/usr/local/cuda/lib64/ +cmake .. -DWITH_GPU=ON -DPADDLE_DIR=/root/projects/fluid_inference -DCUDA_LIB=/usr/local/cuda/lib64/ -DOPENCV_DIR=/root/projects/opencv3/ -DCUDNN_LIB=/usr/local/cuda/lib64/ -DWITH_STATIC_LIB=OFF make ``` +在使用**CPU版本**预测库进行编译时,可执行下列操作。 +```shell +cd /root/projects/PaddleSeg/inference +mkdir build && cd build +cmake .. -DWITH_GPU=OFF -DPADDLE_DIR=/root/projects/fluid_inference -DOPENCV_DIR=/root/projects/opencv3/ -DWITH_STATIC_LIB=OFF +make +``` ### Step5: 预测及可视化 @@ -80,6 +97,4 @@ make ./demo --conf=/path/to/your/conf --input_dir=/path/to/your/input/data/directory ``` -更详细说明请参考ReadMe文档: [预测和可视化部分](../README.md) - - +更详细说明请参考README文档: [预测和可视化部分](../README.md) diff --git a/inference/docs/vis.md b/inference/docs/vis.md new file mode 100644 index 0000000000000000000000000000000000000000..bed5c7adba7c9739fa0a10a46d04ff6b060eeeb2 --- /dev/null +++ b/inference/docs/vis.md @@ -0,0 +1,39 @@ +# 图像分割结果可视化说明 + +本文档介绍如何使用可视化脚本对图像分割结果进行可视化处理。**注意:可视化脚本处理仅针对PaddleSeg C++预测部署方案生成的预测结果。** + +## 说明 +图像分割模型会对预测的图像的每个像素进行分类,所以图像分割模型的预测结果是图像里每个像素的标签,我们将预测结果以图片格式保存。例如预测图片`demo.jpg`,其预测的结果以图片格式保存在`demo_jpg.png`中。保存分割预测结果的图片并不能直接看到效果(一张全黑的图),必须经过可视化处理。以下为使用方法。 + +```bash +# 假设当前路径为PaddleSeg根目录 +# 切换到脚本所在目录 +cd inference/tools/ +# 拷贝保存分割预测结果的图片到本目录 +cp XXX/demo_jpg.png . +# 运行可视化脚本 +python visualize.py demo.jpg demo_jpg.png vis_result.png +``` + +以下为上述运行可视化脚本例子中每个参数的含义,请根据测试机器中图片的**实际路径**修改对应参数。 + +| 参数 | 含义 | +|-------|----------| +| demo.jpg | 原图路径 | +| demo_jpg.png | 保存预测结果的图片的路径 | +| vis_result.png| 可视化后的效果图路径| + + +**可视化结果展示:** + +以下以cityscape模型的预测结果进行展示。 + +原图(`demo.jpg`): +![avatar](demo.jpg) + +预测结果图(`demo_jpg.png`, 仅用来保存预测的结果,需经过可视化处理): +![avatar](demo_jpg.png) + +效果图(`vis_result.png`): +![avatar](vis_result.png) + diff --git a/inference/docs/vis_result.png b/inference/docs/vis_result.png new file mode 100644 index 0000000000000000000000000000000000000000..0b342a3d4d90bdf088c06880164b9ccf9b2cbec1 Binary files /dev/null and b/inference/docs/vis_result.png differ diff --git a/inference/docs/windows_vs2015_build.md b/inference/docs/windows_vs2015_build.md index b57167aeb977be8b8003fb57bf5d12a4824c2059..360e70558d06765863bab0d0ae652847befbabd4 100644 --- a/inference/docs/windows_vs2015_build.md +++ b/inference/docs/windows_vs2015_build.md @@ -5,7 +5,7 @@ ## 前置条件 * Visual Studio 2015 -* CUDA 8.0/ CUDA 9.0 +* CUDA 8.0/ CUDA 9.0/ CUDA 10.0,cudnn 7+ (仅在使用GPU版本的预测库时需要) * CMake 3.0+ 请确保系统已经安装好上述基本软件,**下面所有示例以工作目录为 `D:\projects`演示**。 @@ -20,12 +20,14 @@ ### Step2: 下载PaddlePaddle C++ 预测库 fluid_inference -根据Windows环境,下载相应版本的PaddlePaddle预测库,并解压到`D:\projects\`目录 +PaddlePaddle C++ 预测库主要分为两大版本:CPU版本和GPU版本。其中,针对不同的CUDA版本,GPU版本预测库又分为三个版本预测库:CUDA 8、CUDA 9和CUDA 10版本预测库。根据Windows环境,下载相应版本的PaddlePaddle预测库,并解压到`D:\projects\`目录。以下为各版本C++预测库(CUDA 8版本基于1.5版本的预测库,其余均基于1.6版本的预测库)的下载链接: -| CUDA | GPU | 下载地址 | -|------|------|--------| -| 8.0 | Yes | [fluid_inference.zip](https://bj.bcebos.com/v1/paddleseg/fluid_inference_win.zip) | -| 9.0 | Yes | [fluid_inference_cuda90.zip](https://paddleseg.bj.bcebos.com/fluid_inference_cuda9_cudnn7.zip) | +| 版本 | 链接 | +| ---- | ---- | +| CPU版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/cpu/fluid_inference_install_dir.zip) | +| CUDA 8版本 | [fluid_inference_install_dir.zip](https://paddle-inference-lib.bj.bcebos.com/1.5.1-win/gpu_mkl_avx_8.0/fluid_inference_install_dir.zip) | +| CUDA 9版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/post97/fluid_inference_install_dir.zip) | +| CUDA 10版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/post107/fluid_inference_install_dir.zip) | 解压后`D:\projects\fluid_inference`目录包含内容为: ``` @@ -57,11 +59,12 @@ fluid_inference call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 ``` -* CMAKE编译工程 +* CMAKE编译工程 (带*表示仅在使用**GPU版本**预测库时指定) * PADDLE_DIR: fluid_inference预测库路径 - * CUDA_LIB: CUDA动态库目录, 请根据实际安装情况调整 + * *CUDA_LIB: CUDA动态库目录, 请根据实际安装情况调整 * OPENCV_DIR: OpenCV解压目录 +在使用**GPU版本**预测库进行编译时,可执行下列操作。 ``` # 切换到预测库所在目录 cd /d D:\projects\PaddleSeg\inference\ @@ -72,6 +75,17 @@ cd build D:\projects\PaddleSeg\inference\build> cmake .. -G "Visual Studio 14 2015 Win64" -DWITH_GPU=ON -DPADDLE_DIR=D:\projects\fluid_inference -DCUDA_LIB=D:\projects\cudalib\v8.0\lib\x64 -DOPENCV_DIR=D:\projects\opencv -T host=x64 ``` +在使用**CPU版本**预测库进行编译时,可执行下列操作。 +``` +# 切换到预测库所在目录 +cd /d D:\projects\PaddleSeg\inference\ +# 创建构建目录, 重新构建只需要删除该目录即可 +mkdir build +cd build +# cmake构建VS项目 +D:\projects\PaddleSeg\inference\build> cmake .. -G "Visual Studio 14 2015 Win64" -DWITH_GPU=ON -DPADDLE_DIR=D:\projects\fluid_inference -DOPENCV_DIR=D:\projects\opencv -T host=x64 +``` + 这里的`cmake`参数`-G`, 表示生成对应的VS版本的工程,可以根据自己的`VS`版本调整,具体请参考[cmake文档](https://cmake.org/cmake/help/v3.15/manual/cmake-generators.7.html) * 生成可执行文件 diff --git a/inference/docs/windows_vs2019_build.md b/inference/docs/windows_vs2019_build.md index b60201f7c7c16330fe50b4eb0f51019c4ec01f71..d7bf5d022d1c166aac58f0f6fb305964d0efb4d0 100644 --- a/inference/docs/windows_vs2019_build.md +++ b/inference/docs/windows_vs2019_build.md @@ -5,8 +5,8 @@ Windows 平台下,我们使用`Visual Studio 2015` 和 `Visual Studio 2019 Com 你也可以使用和`VS2015`一样,通过把`CMake`项目转化成`VS`项目来编译,其中**有差别的部分**在文档中我们有说明,请参考:[使用Visual Studio 2015 编译指南](./windows_vs2015_build.md) ## 前置条件 -* Visual Studio 2019 -* CUDA 8.0/ CUDA 9.0 +* Visual Studio 2019 +* CUDA 8.0/ CUDA 9.0/ CUDA 10.0,cudnn 7+ (仅在使用GPU版本的预测库时需要) * CMake 3.0+ 请确保系统已经安装好上述基本软件,我们使用的是`VS2019`的社区版。 @@ -23,12 +23,14 @@ Windows 平台下,我们使用`Visual Studio 2015` 和 `Visual Studio 2019 Com ### Step2: 下载PaddlePaddle C++ 预测库 fluid_inference -根据Windows环境,下载相应版本的PaddlePaddle预测库,并解压到`D:\projects\`目录 +PaddlePaddle C++ 预测库主要分为两大版本:CPU版本和GPU版本。其中,针对不同的CUDA版本,GPU版本预测库又分为三个版本预测库:CUDA 8、CUDA 9和CUDA 10版本预测库。根据Windows环境,下载相应版本的PaddlePaddle预测库,并解压到`D:\projects\`目录。以下为各版本C++预测库(CUDA 8版本基于1.5版本的预测库,其余均基于1.6版本的预测库)的下载链接: -| CUDA | GPU | 下载地址 | -|------|------|--------| -| 8.0 | Yes | [fluid_inference.zip](https://bj.bcebos.com/v1/paddleseg/fluid_inference_win.zip) | -| 9.0 | Yes | [fluid_inference_cuda90.zip](https://paddleseg.bj.bcebos.com/fluid_inference_cuda9_cudnn7.zip) | +| 版本 | 链接 | +| ---- | ---- | +| CPU版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/cpu/fluid_inference_install_dir.zip) | +| CUDA 8版本 | [fluid_inference_install_dir.zip](https://paddle-inference-lib.bj.bcebos.com/1.5.1-win/gpu_mkl_avx_8.0/fluid_inference_install_dir.zip) | +| CUDA 9版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/post97/fluid_inference_install_dir.zip) | +| CUDA 10版本 | [fluid_inference_install_dir.zip](https://paddle-wheel.bj.bcebos.com/1.6.0/win-infer/mkl/post107/fluid_inference_install_dir.zip) | 解压后`D:\projects\fluid_inference`目录包含内容为: ``` @@ -39,7 +41,6 @@ fluid_inference | └── version.txt # 版本和编译信息 ``` -**注意:** `CUDA90`版本解压后目录名称为`fluid_inference_cuda90`。 ### Step3: 安装配置OpenCV @@ -67,15 +68,15 @@ fluid_inference 4. 点击`浏览`,分别设置编译选项指定`CUDA`、`OpenCV`、`Paddle预测库`的路径 -![step4](https://paddleseg.bj.bcebos.com/inference/vs2019_step5.png) - -三个编译参数的含义说明如下: +三个编译参数的含义说明如下(带*表示仅在使用**GPU版本**预测库时指定): | 参数名 | 含义 | | ---- | ---- | -| CUDA_LIB | cuda的库路径 | +| *CUDA_LIB | cuda的库路径 | | OPENCV_DIR | OpenCV的安装路径, | | PADDLE_DIR | Paddle预测库的路径 | +**注意**在使用CPU版本预测库时,需要把CUDA_LIB的勾去掉。 +![step4](https://paddleseg.bj.bcebos.com/inference/vs2019_step5.png) **设置完成后**, 点击上图中`保存并生成CMake缓存以加载变量`。 diff --git a/inference/predictor/seg_predictor.cpp b/inference/predictor/seg_predictor.cpp index c6dae1e4fb7fdd9cb0f0d2180f6830f404f98761..5488ec946c96aaed543221a9f5d64be77092fba2 100644 --- a/inference/predictor/seg_predictor.cpp +++ b/inference/predictor/seg_predictor.cpp @@ -1,6 +1,6 @@ #include "seg_predictor.h" #include - +#undef min namespace PaddleSolution { int Predictor::init(const std::string& conf) { @@ -237,7 +237,7 @@ namespace PaddleSolution { imgs_batch.push_back(imgs[idx]); } - if (!_preprocessor->batch_process(imgs_batch, input_buffer.data(), org_height.data(), org_width.data())) { + if (!_preprocessor->batch_process(imgs_batch, input_buffer.data(), org_width.data(), org_height.data())) { return -1; } auto im_tensor = _main_predictor->GetInputTensor("image"); diff --git a/inference/tools/visualize.py b/inference/tools/visualize.py index 87373e9192bf47dab214fdf128b2e290f2124365..e51d41435987ecec8e3c08967a5aea95337d9acc 100644 --- a/inference/tools/visualize.py +++ b/inference/tools/visualize.py @@ -7,14 +7,20 @@ color_map = [[128, 64, 128], [244, 35, 231], [69, 69, 69], [102, 102, 156], [106, 142, 35], [152, 250, 152], [69, 129, 180], [219, 19, 60], [255, 0, 0], [0, 0, 142], [0, 0, 69], [0, 60, 100], [0, 79, 100], [0, 0, 230], [119, 10, 32]] - -im = cv2.imread(sys.argv[1]) - -# Please note (224, 224) just for daheng model -print("visualizing...") -for i in range(0, 224): - for j in range(0, 224): - im[i, j] = color_map[im[i, j, 0]] - -cv2.imwrite(sys.argv[1], im) -print("visualizing done!") +# python visualize.py demo1.jpg demo1_jpg.png vis_result.png +if __name__ == "__main__": + if len(sys.argv) != 4: + print("Usage: python visualize.py demo1.jpg demo1_jpg.png vis_result.png") + else: + ori_im = cv2.imread(sys.argv[1]) + ori_shape = ori_im.shape + print(ori_shape) + im = cv2.imread(sys.argv[2]) + shape = im.shape + print("visualizing...") + for i in range(0, shape[0]): + for j in range(0, shape[1]): + im[i, j] = color_map[im[i, j, 0]] + im = cv2.resize(im, (ori_shape[1], ori_shape[0])) + cv2.imwrite(sys.argv[3], im) + print("visualizing done!") diff --git a/serving/seg-serving/op/reader_op.cpp b/serving/seg-serving/op/reader_op.cpp index b825d81bae728f4fe5bc0d7982995f3ae00326fa..47ec7345d05329bcfedab5c26feb1aa51dbd6b13 100644 --- a/serving/seg-serving/op/reader_op.cpp +++ b/serving/seg-serving/op/reader_op.cpp @@ -123,31 +123,21 @@ int ReaderOp::inference() { const int HH = _image_8u_tmp.rows; const int WW = _image_8u_tmp.cols; const int CC = _image_8u_tmp.channels(); + //HH: cols WW:rows in_width_vec->push_back(HH); in_height_vec->push_back(WW); - // resize/crop + // resize if (_image_8u_tmp.cols != resize.width || _image_8u_tmp.rows != resize.height) { -// int short_egde = std::min(_image_8u_tmp.cols, _image_8u_tmp.rows); -// int yy = static_cast((_image_8u_tmp.rows - short_egde) / 2); -// int xx = static_cast((_image_8u_tmp.cols - short_egde) / 2); -// _image_8u_tmp = -// cv::Mat(_image_8u_tmp, cv::Rect(xx, yy, short_egde, short_egde)); -// if (_image_8u_tmp.cols != resize.width || -// _image_8u_tmp.rows != resize.height) { cv::Mat resize_image; -// cv::resize(_image_8u_tmp, resize_image, resize); -// _image_8u_tmp = resize_image; -// } -// - cv::resize(_image_8u_tmp, resize_image, resize); - _image_8u_tmp = resize_image; - LOG(INFO) << "Succ crop one image[CHW=" << _image_8u_tmp.channels() - << ", " << _image_8u_tmp.cols << ", " << _image_8u_tmp.rows - << "]" - << " from image[CHW=" << CC << ", " << HH << ", " << WW << "]"; + cv::resize(_image_8u_tmp, resize_image, resize); + _image_8u_tmp = resize_image; + LOG(INFO) << "Succ crop one image[CHW=" << _image_8u_tmp.channels() + << ", " << _image_8u_tmp.cols << ", " << _image_8u_tmp.rows + << "]" + << " from image[CHW=" << CC << ", " << HH << ", " << WW << "]"; } // BGR->RGB transformer