ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleDetection 在 Windows 平台使用 Visual Studio 2019 编译 C++ 预测部署全指南

PaddleDetection 在 Windows 平台使用 Visual Studio 2019 编译 C++ 预测部署全指南 人工智能深度学习计算机视觉【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址https://gitcode.com/gh_mirrors/pa/PaddleDetection点击查看免费下载本篇技术指南完整讲解如何在 Windows 平台下使用 Visual Studio 2019 Community 对 PaddleDetection 的 C 端预测部署代码deploy/cpp目录进行 CMake 编译、链接 PaddlePaddle C 预测库paddle_inference并运行检测/关键点联合推理。读完本文你将掌握从源码下载、预测库与 OpenCV 安装配置、VS2019 下 CMake 生成与编译、可执行文件运行到性能基准测试的完整闭环并理解其底层调用链与源码实现原理。一、为什么选择 Visual Studio 2019 编译 C 部署代码PaddleDetection 的 C 端预测部署位于仓库的 deploy/cpp 目录该目录不依赖PaddleDetection下其他任何目录可独立编译、二次开发并集成到自有项目中。它支持跨平台Windows / Linux / Jetson可扩展新模型的预处理逻辑并对图像检测的关键步骤做了性能优化支持 YOLOv3、Faster RCNN、SSD、PP-YOLO 等多种检测模型结构。微软从 Visual Studio 2017 开始支持直接管理 CMake 跨平台编译项目但直到 Visual Studio 2019 才提供稳定且完整的支持。因此官方在 windows_vs2019_build.md 中明确推荐在 Windows 上使用 CMake 管理项目编译构建时采用Visual Studio 2019环境本文全部命令也以 VS2019 的 Community社区版为例。提示仓库还提供了 Linux 编译部署 与 NV Jetson 编译部署 两篇指南Windows 与 Linux 的 CMake 参数高度相似仅有少量平台差异见下文“平台差异”小节本文聚焦 Windows 流程。二、前置条件在开始编译前请确认系统已安装如下基本软件软件说明Visual Studio 2019需要根据 Paddle 预测库所使用的 VS 版本选择详见微软官方《Visual Studio 不同版本二进制兼容性》文档CUDA 9.0 / CUDA 10.0仅在使用 GPU 版本的预测库时需要cudnn 7TensorRT仅在使用 GPU 版本预测库且启用 TensorRT 时需要CMake 3.0可从 CMake 官网下载安装TensorRT 与预测库版本对照特别注意Windows 下预测库需要的 TensorRT 版本有严格对应关系预测库版本TensorRT 版本cuda10.1_cudnn7.6_avx_mkl_trt6TensorRT-6.0.1.5cuda10.2_cudnn7.6_avx_mkl_trt7TensorRT-7.0.0.11cuda11.0_cudnn8.0_avx_mkl_trt7TensorRT-7.2.1.6版本对齐是 Windows GPU 部署最容易踩坑的地方预测库、CUDA、cuDNN、TensorRT 四者的版本必须匹配否则运行期会报符号缺失或引擎加载失败。下面所有示例统一以工作目录为D:\projects演示。三、Step1下载代码git clone https://github.com/PaddlePaddle/PaddleDetection.git其中 C 预测代码位于PaddleDetection/deploy/cpp目录。该目录的顶层结构如下见 deploy/cpp/README.mddeploy/cpp ├── src │ ├── main.cc # 集成代码示例程序入口检测 │ ├── main_keypoint.cc # 关键点检测联合预测的程序入口 │ ├── main_jde.cc # MOT多目标跟踪程序入口 │ ├── object_detector.cc # 模型加载和预测主要逻辑封装类实现 │ ├── keypoint_detector.cc# 关键点检测器封装 │ ├── preprocess_op.cc # 预处理相关主要逻辑封装实现 │ └── utils.cc ├── include │ ├── config_parser.h # 导出模型配置 yaml 文件解析 │ ├── object_detector.h # 模型加载和预测主要逻辑封装类 │ ├── preprocess_op.h # 预处理相关主要逻辑类封装 │ └── ... ├── docs │ ├── linux_build.md # Linux 编译指南 │ └── windows_vs2019_build.md # Windows VS2019 编译指南 ├── CMakeLists.txt # cmake 编译入口文件 └── cmake # 依赖的外部项目 cmake目前仅有 yaml-cpp从 CMakeLists.txt 的源码可以看出编译目标会根据功能开关选择不同的源文件集合开启WITH_KEYPOINT编译main_keypoint.cc 检测 关键点相关源文件开启WITH_MOT编译main_jde.cc JDE 检测器 跟踪tracker/trajectory/lapjv相关源文件默认两者均不开启仅编译main.cc检测入口。四、Step2下载 PaddlePaddle C 预测库 paddle_inferencePaddlePaddle C 预测库针对不同的 CPU 和 CUDA 版本提供了多个预编译版本请按实际环境从官方 C 预测库下载列表Windows 一节选择对应版本。解压后D:\projects\paddle_inference目录包含paddle_inference ├── paddle # paddle 核心库和头文件 ├── third_party # 第三方依赖库和头文件 └── version.txt # 版本和编译信息源码视角预测库目录如何被使用CMakeLists.txt 中PADDLE_DIR指向的目录会被加入头文件搜索路径并链接第三方依赖库头文件${PADDLE_DIR}/paddle/include、third_party/install/protobuf/include、glog/include、gflags/include、xxhash/include以及third_party/boost、third_party/eigen3等库文件third_party/install/protobuf/lib、glog/lib、gflags/lib、xxhash/lib、paddle2onnx/lib、onnxruntime/lib与${PADDLE_DIR}/paddle/lib/。在 Windows 分支CMakeLists.txt下还会额外包含${PADDLE_DIR}/paddle/fluid/inference目录并链接${PADDLE_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}即paddle_inference.lib。这就是 Windows 下必须把PADDLE_LIB_NAME设置为paddle_inference的原因。五、Step3安装配置 OpenCV在 OpenCV 官网下载适用于 Windows 平台的3.4.6版本运行下载的可执行文件将 OpenCV 解压至指定目录如D:\projects\opencv配置环境变量如果后续 CMake 使用全局绝对路径可以不用设置环境变量我的电脑 → 属性 → 高级系统设置 → 环境变量在系统变量中找到Path如没有自行创建双击编辑新建将 OpenCV 的 bin 目录填入并保存如D:\projects\opencv\build\x64\vc14\bin。该 bin 目录下的opencv_world346.dll在运行阶段会被main.exe动态加载若运行时报找不到opencv_world346.dll把该 dll 拷贝到main.exe所在目录即可详见下文运行小节。六、Step4使用 CMake 编译1. 进入 cpp 目录cd D:\projects\PaddleDetection\deploy\cpp2. 使用 CMake 生成项目文件编译参数的含义说明如下带*表示仅在使用GPU 版本预测库时指定其中 CUDA 库版本尽量对齐使用 9.0、10.0 版本不要使用 9.2、10.1 等版本的 CUDA 库参数名含义*CUDA_LIBCUDA 的库路径*CUDNN_LIBCUDNN 的库路径OPENCV_DIROpenCV 的安装路径PADDLE_DIRPaddle 预测库的路径PADDLE_LIB_NAMEPaddle 预测库名称Windows 下固定为paddle_inference注意如果编译环境为 CPU需要下载 CPU 版预测库并把WITH_GPU的勾去掉如果使用的是openblas版本请把WITH_MKL勾去掉如无需使用关键点模型可以把WITH_KEYPOINT勾去掉Windows 环境下PADDLE_LIB_NAME需要设置为paddle_inference。执行如下命令生成项目文件cmake . -G Visual Studio 16 2019 -A x64 -T hostx64 -DWITH_GPUON -DWITH_MKLON -DCMAKE_BUILD_TYPERelease -DCUDA_LIBpath_to_cuda_lib -DCUDNN_LIBpath_to_cudnn_lib -DPADDLE_DIRpath_to_paddle_lib -DPADDLE_LIB_NAMEpaddle_inference -DOPENCV_DIRpath_to_opencv -DWITH_KEYPOINTON例如cmake . -G Visual Studio 16 2019 -A x64 -T hostx64 -DWITH_GPUON -DWITH_MKLON -DCMAKE_BUILD_TYPERelease -DCUDA_LIBD:\projects\packages\cuda10_0\lib\x64 -DCUDNN_LIBD:\projects\packages\cuda10_0\lib\x64 -DPADDLE_DIRD:\projects\packages\paddle_inference -DPADDLE_LIB_NAMEpaddle_inference -DOPENCV_DIRD:\projects\packages\opencv3_4_6 -DWITH_KEYPOINTON源码视角编译开关与平台差异CMakeLists.txt 顶部声明了全部可配置开关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_TENSORRT Compile demo with TensorRT. OFF) option(WITH_KEYPOINT Whether to Compile KeyPoint detector OFF) option(WITH_MOT Whether to Compile MOT detector OFF)同时PADDLE_DIR、PADDLE_LIB_NAME、OPENCV_DIR、CUDA_LIB、CUDNN_LIB、TENSORRT_INC_DIR、TENSORRT_LIB_DIR均为 CACHE 变量可通过-D传入。如果PADDLE_DIR或OPENCV_DIR未设置cmake 会直接FATAL_ERROR终止GPU 模式下未设置CUDA_LIB同样会报错终止CMakeLists.txt。平台差异还体现在静态运行库safe_set_static_flag宏会把/MD替换为/MTRelease 下配合/bigobj /MT标志避免运行库冲突MKL 依赖启用WITH_MKL时 Windows 链接mklml.lib与libiomp5md.lib使用 OpenBLAS 时链接openblas.dllDLL 自动拷贝Windows 编译完成后CMake 的POST_BUILD钩子会自动把mklml.dll、libiomp5md.dll、mkldnn.dll、paddle_inference.dll、onnxruntime.dll、paddle2onnx.dll等运行时依赖拷贝到可执行文件及release目录CMakeLists.txt保证生成物可直接运行。3. 编译用 Visual Studio 2019 打开cpp文件夹下的PaddleObjectDetector.sln将编译模式设置为Release点击生成→全部生成。编译产物可执行文件main.exe默认输出在out\build\x64-Release目录下。七、Step5预测及可视化打开cmd并切换到编译输出目录cd D:\projects\PaddleDetection\deploy\cpp\out\build\x64-Release可执行文件main即为样例预测程序。其命令行参数由 gflags 定义见 src/main.cc 与 src/main_keypoint.cc主要的参数如下参数说明--model_dir导出的检测预测模型所在路径必填--model_dir_keypointOption导出的关键点预测模型所在路径--image_file要预测的图片文件路径--image_dir要预测的图片文件夹路径--video_file要预测的视频文件路径--camera_idOption用来预测的摄像头 ID默认为 -1表示不使用摄像头预测--device运行时的设备可选择CPU/GPU/XPU默认为CPU--gpu_id指定进行推理的 GPU device id默认值为 0--run_mode使用 GPU 时默认为 paddle可选paddle/trt_fp32/trt_fp16/trt_int8--batch_size检测模型预测时的 batch size在指定image_dir时有效--batch_size_keypoint关键点模型预测时的 batch size默认为 8--run_benchmark是否重复预测来进行 benchmark 测速--output_dir输出图片所在的文件夹默认为 output--use_mkldnnCPU 预测中是否开启 MKLDNN 加速--cpu_threads设置 cpu 线程数默认为 1--use_dark关键点模型输出预测是否使用 DarkPose 后处理默认为 true此外源码中还有几个文档表格之外、但在进阶调优中很实用的参数--threshold检测置信度阈值默认 0.5--threshold_keypoint关键点得分阈值默认 0.5--trt_min_shape/--trt_max_shape/--trt_opt_shapeTensorRT 动态形状的最小/最大/最优输入尺寸默认分别为 1 / 1280 / 640对应输入[batch, 3, h, w]中的 h、w--trt_calib_mode当模型由 TensorRT 离线量化校准产出时需置为 True--use_gpu已废弃Deprecated请改用--device。注意优先级顺序camera_idvideo_fileimage_dirimage_file。该优先级在 main.cc 中体现先判断视频/摄像头分支再判断图片分支同时image_dir使用 OpenCV 的cv::glob收集目录内全部图片而单独指定image_file时batch_size必须为 1否则程序会直接退出提示如果提示找不到opencv_world346.dll把D:\projects\packages\opencv3_4_6\build\x64\vc14\bin文件夹下的opencv_world346.dll拷贝到main.exe文件夹下即可--run_benchmark如果设置为 True则需要安装依赖pip install pynvml psutil GPUtil。样例一CPU 预测单张图片# 不使用 GPU 测试图片 D:\images\test.jpeg .\main --model_dirD:\models\yolov3_darknet --image_fileD:\images\test.jpeg图片文件的可视化预测结果会保存在当前目录下output.jpg文件中实际按--output_dir指定目录输出默认output。样例二GPU 预测视频# 使用 GPU 测试视频 D:\videos\test.mp4 .\main --model_dirD:\models\yolov3_darknet --video_pathD:\videos\test.mp4 --deviceGPU视频文件目前支持.mp4格式的预测可视化预测结果会保存在当前目录下output.mp4文件中。源码中通过cv::VideoCapture读取视频、cv::VideoWriterfourcc0x00000021即 MP4V逐帧写入检测结果main.cc。样例三检测模型 关键点模型联合预测# 使用关键点模型与检测模型联合预测使用 GPU 预测 # 检测模型检测到的人送入关键点模型进行关键点预测 .\main --model_dirD:\models\yolov3_darknet --model_dir_keypointD:\models\hrnet_w32_256x192 --image_fileD:\images\test.jpeg --deviceGPU该功能需在编译时开启WITH_KEYPOINTON。从 main_keypoint.cc 可以看到联合推理的完整链路检测器先输出人体框 → 对每个class_id 0人的检测框调用CropImg裁剪 → 按--batch_size_keypoint默认 8攒批送入关键点模型 → 关键点结果经VisualizeKptsResult绘制关键点使用 20 色 colormap。视频模式下还会使用PoseSmooth做关键点时序平滑降低抖动。源码视角从命令行参数到推理引擎main入口的核心逻辑main.ccgoogle::ParseCommandLineFlags解析命令行校验--model_dir与输入源image_file/image_dir/video_file至少一个非空校验--run_mode必须是paddle/trt_fp32/trt_fp16/trt_int8之一--device必须是CPU/GPU/XPU之一构造PaddleDetection::ObjectDetector其构造函数object_detector.h依次完成解析模型目录下infer_cfg.yml读取arch、Preprocess、label_list、use_dynamic_shape、min_subgraph_size、NMS、fpn_stride、mask等字段见 config_parser.h→ 初始化预处理器 → 调用LoadModel创建paddle_infer::Predictor。模型加载时object_detector.cc加载model.pdmodel与model.pdiparams即通过 tools/export_model.py 导出的推理模型模型目录必须包含这两个文件与infer_cfg.ymlGPU 模式EnableUseGpu(200, gpu_id)并开启 IR 优化run_mode非 paddle 时调用EnableTensorRtEngine并根据infer_cfg.yml中的use_dynamic_shape决定是否通过SetTRTDynamicShapeInfo设置image输入的动态形状min/max/opt 取自--trt_min_shape等参数CPU 模式DisableGpu若--use_mkldnn开启则EnableMKLDNN并设置 10 个 shape 的缓存容量线程数取--cpu_threadsXPU 模式EnableXpu(10 * 1024 * 1024)最后统一DisableGlogInfoEnableMemoryOptim内存优化后创建预测器。预测时Predictobject_detector.cc会按 batch 依次完成BGR→RGB 转换与预处理 → 组装image、im_shape、scale_factor输入张量 → 执行predictor_-Run()→ 依据infer_cfg.yml的arch/mask字段解析输出检测框每项 6 维[class_id, score, xmin, ymin, xmax, ymax]旋转框每项 10 维SOLOv2 走独立后处理→ 通过VisualizeResult绘制类别、置信度与框掩码模型还会叠加 mask 轮廓。八、性能测试BenchmarkBenchmark 详细内容请查看仓库根目录的 deploy/BENCHMARK_INFER.md。其中针对 Windows 平台GTX 1080Ti给出了各模型的paddle_inference、trt_fp32、trt_fp16平均单图推理耗时单位 ms/imageBatch Size1去掉前 100 轮 warmup 后测试 100 轮可用来与本地环境对比验证部署效果。在本地进行测速时给main加上--run_benchmarktrue即可源码会以固定 warmup/repeats10 次重复预测并在结束时通过PrintBenchmarkLog打印preproce_time / inference_time / postprocess_time三段耗时main.cc便于定位耗时瓶颈。注意此时需要先安装pynvml psutil GPUtil依赖。九、常见问题与排查建议找不到opencv_world346.dll将 OpenCV 安装目录build\x64\vc14\bin下的 dll 拷贝到main.exe同级目录PADDLE_LIB_NAME设置错误Windows 下必须为paddle_inference否则链接阶段找不到paddle_inference.lib预测库与 TensorRT 版本不匹配严格对照上文第三节的版本表预测库、CUDA、cuDNN、TensorRT 必须配套运行时报run_mode/device不合法--run_mode只能是paddle/trt_fp32/trt_fp16/trt_int8--device只能是CPU/GPU/XPU程序启动时会校验并打印提示CPU 版 OpenBLAS 预测库编译时去掉WITH_MKL勾选CMake 会自动切换为链接 OpenBLAS 并拷贝openblas.dll模型导出C 部署使用的模型需先用 tools/export_model.py 导出得到model.pdmodel、model.pdiparams与infer_cfg.yml并将--model_dir指向该目录导出细节可参考 deploy/EXPORT_MODEL.md。至此你已可以在 Windows Visual Studio 2019 环境下完整编译并运行 PaddleDetection 的 C 检测/关键点推理程序并具备结合 deploy/cpp 源码进行二次开发与性能调优的能力。赞分享人工智能深度学习计算机视觉【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址https://gitcode.com/gh_mirrors/pa/PaddleDetection点击查看免费下载相关推荐PaddleDetection C 推理部署Linux 平台编译指南与预测程序实战PaddleDetection C 推理部署Linux 平台编译指南与预测程序实战 本指南面向需要在 Linux 服务端将 PaddleDetection人工智能深度学习计算机视觉OpenToonz Windows 平台构建实战基于 Visual Studio 2019 与 Qt 5.x 的完整编译部署指南OpenToonz Windows 平台构建实战基于 Visual Studio 2019 与 Qt 5.x 的完整编译部署指南 导读 本文以 OpenToo桌面应用图形学PaddleDetection C端预测部署指南跨平台编译、模型集成与推理加速PaddleDetection C端预测部署指南跨平台编译、模型集成与推理加速 PaddleDetection 在 deploy/cpp 目录下提供了一套人工智能深度学习计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表