在PaddlePaddle中预测引擎和训练引擎底层有着不同的优化方法, 预测引擎使用了AnalysisPredictor,专门针对推理进行了优化,该引擎可以对模型进行多项图优化,减少不必要的内存拷贝。如果用户在部署已训练模型的过程中对性能有较高的要求,我们提供了独立于PaddleDetection的预测脚本,方便用户直接集成部署。当前C++部署支持基于Fairmot的单镜头类别预测部署,并支持人流量统计、出入口计数功能。
主要包含三个步骤:
- 准备环境
- 导出预测模型
- C++预测
环境要求:
- GCC 8.2
- CUDA 10.1/10.2/11.1; CUDNN 7.6/8.1
- CMake 3.0+
- TensorRT 6/7
NVIDIA Jetson用户请参考Jetson平台编译指南完成JetPack安装
git clone https://github.com/PaddlePaddle/PaddleDetection.git
# C++部署代码与其他目录代码独立
cd deploy/pptracking/cpp
请根据环境选择适当的预测库进行下载,参考C++预测库下载列表
下载并解压后./paddle_inference
目录包含内容为:
paddle_inference
├── paddle # paddle核心库和头文件
|
├── third_party # 第三方依赖库和头文件
|
└── version.txt # 版本和编译信息
注意: 如果用户环境与官网提供环境不一致(如cuda 、cudnn、tensorrt版本不一致等),或对飞桨源代码有修改需求,或希望进行定制化构建,可参考文档自行源码编译预测库。
Linux编译:
编译cmake
的命令在scripts/build.sh
中,请根据实际情况修改主要参数,其主要内容说明如下:
# 是否使用GPU(即是否使用 CUDA)
WITH_GPU=ON
# 是否使用MKL or openblas,TX2需要设置为OFF
WITH_MKL=OFF
# 是否集成 TensorRT(仅WITH_GPU=ON 有效)
WITH_TENSORRT=ON
# TensorRT 的include路径
TENSORRT_INC_DIR=/path/to/TensorRT/include
# TensorRT 的lib路径
TENSORRT_LIB_DIR=/path/to/TensorRT/lib
# Paddle 预测库路径
PADDLE_DIR=/path/to/paddle_inference/
# Paddle 预测库名称
PADDLE_LIB_NAME=libpaddle_inference
# CUDA 的 lib 路径
CUDA_LIB=/path/to/cuda/lib
# CUDNN 的 lib 路径
CUDNN_LIB=/path/to/cudnn/lib
# OPENCV路径
OPENCV_DIR=/path/to/opencv
修改脚本设置好主要参数后,执行build.sh
脚本:
sh ./scripts/build.sh
Windows编译:
- 安装配置OpenCV
-
在OpenCV官网下载适用于Windows平台的3.4.6版本,下载地址
-
运行下载的可执行文件,将OpenCV解压至指定目录,如
D:\projects\opencv
-
配置环境变量,如下流程所示(如果使用全局绝对路径,可以不用设置环境变量)
- 我的电脑->属性->高级系统设置->环境变量
- 在系统变量中找到Path(如没有,自行创建),并双击编辑
- 新建,将opencv路径填入并保存,如
D:\projects\opencv\build\x64\vc14\bin
-
使用CMake生成项目文件
执行如下命令项目文件:
cmake . -G "Visual Studio 16 2019" -A x64 -T host=x64 -DWITH_GPU=ON -DWITH_MKL=ON -DCMAKE_BUILD_TYPE=Release -DCUDA_LIB=path_to_cuda_lib -DCUDNN_LIB=path_to_cudnn_lib -DPADDLE_DIR=path_to_paddle_lib -DPADDLE_LIB_NAME=paddle_inference -DOPENCV_DIR=path_to_opencv -DWITH_KEYPOINT=ON
- 编译
用
Visual Studio 2019
打开cpp
文件夹下的PaddleObjectDetector.sln
,将编译模式设置为Release
,点击生成
->`全部生成
编译产出的可执行文件在Release
目录下
注意:
TX2
平台的CUDA
、CUDNN
需要通过JetPack
安装。- 已提供linux和tx2平台的opencv下载方式,其他环境请自行安装opencv
- Windows用户推荐使用Visual Studio 2019编译
将训练保存的权重导出为预测库需要的模型格式,使用PaddleDetection下的tools/export_model.py
导出模型
python tools/export_model.py -c configs/mot/fairmot/fairmot_hrnetv2_w18_dlafpn_30e_576x320.yml -o weights=https://paddledet.bj.bcebos.com/models/mot/fairmot_hrnetv2_w18_dlafpn_30e_576x320.pdparams
预测模型会默认导出到output_inference/fairmot_hrnetv2_w18_dlafpn_30e_576x320
目录下,包括infer_cfg.yml
, model.pdiparams
, model.pdiparams.info
, model.pdmodel
导出模型也可以通过预测模型列表中'算法介绍部分'直接下载使用
完成以上步骤后,可以通过build/main
(Linux)或main.exe
(Windows)进行预测,参数列表如下:
参数 | 说明 |
---|---|
--track_model_dir | 导出的跟踪预测模型所在路径 |
--video_file | 要预测的视频文件路径 |
--device | 运行时的设备,可选择CPU/GPU/XPU ,默认为CPU |
--gpu_id | 指定进行推理的GPU device id(默认值为0) |
--run_mode | 使用GPU时,默认为paddle, 可选(paddle/trt_fp32/trt_fp16/trt_int8) |
--output_dir | 输出图片所在的文件夹, 默认为output | |
--use_mkldnn | CPU预测中是否开启MKLDNN加速 |
--cpu_threads | 设置cpu线程数,默认为1 |
--do_entrance_counting | 是否进行出入口流量统计,默认为否 |
--save_result | 是否保存跟踪结果 |
样例一:
# 使用CPU测试视频 `test.mp4` , 模型和测试视频均移至`build`目录下
./main --track_model_dir=./fairmot_hrnetv2_w18_dlafpn_30e_576x320 --video_file=test.mp4
# 视频可视化预测结果默认保存在当前目录下output/test.mp4文件中
样例二:
# 使用GPU测试视频 `test.mp4` , 模型和测试视频均移至`build`目录下,实现出入口计数功能,并保存跟踪结果
./main -video_file=test.mp4 -track_model_dir=./fairmot_dla34_30e_1088x608/ --device=gpu --do_entrance_counting=True --save_result=True
# 视频可视化预测结果默认保存在当前目录下`output/test.mp4`中
# 跟踪结果保存在`output/mot_output.txt`中
# 计数结果保存在`output/flow_statistic.txt`中