人工智能深度学习计算机视觉【免费下载链接】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 仓库中的 deploy/third_engine/demo_openvino_kpts 目录系统讲解如何将 PaddleDetection 训练的 PicoDet 目标检测模型与 TinyPose 关键点检测模型导出为 ONNX、转换为 OpenVINO IR 中间表示并最终通过 C 程序在 Intel CPU 上完成先检测人体框、再回归 17 个关键点的端到端推理。读完本文你将掌握从模型导出、环境配置、CMake 编译到四种运行模式摄像头、图片、视频、Benchmark的完整部署链路并理解 PicoDet 的 DFL 解码 NMS 流程与 TinyPose 的 DARK 坐标后处理等核心实现细节。一、Demo 概述与目录结构demo_openvino_kpts是 PaddleDetection 提供的基于 Intel OpenVINO Toolkit 的 TinyPose 推理示例其大部分实现与同仓库的demo_ncnn保持一致整体采用两阶段管线用PicoDet输入 416×416对整帧图像做目标检测筛选出类别为person的检测框用TinyPose输入 256×192对每个人的裁剪区域做关键点回归输出 17 个关节点的坐标与置信度。该目录包含以下源码文件全部位于 deploy/third_engine/demo_openvino_kpts文件职责main.cpp程序入口实现图片/摄像头/视频/Benchmark 四种模式与结果可视化picodet_openvino.h / picodet_openvino.cppPicoDet 的 OpenVINO 封装预处理、多尺度头解码DFL、NMSkeypoint_detector.h / keypoint_detector.cppTinyPose 的 OpenVINO 封装推理、输出读取与关键点后处理入口keypoint_postprocess.h / keypoint_postprocess.cpp关键点后处理仿射变换、DARK 亚像素细化、裁剪CMakeLists.txtCMake 构建脚本生成可执行文件tinypose_demo代码整体参考了 NanoDet 的 OpenVINO demo 结构源码注释中已注明并在此基础上增加了关键点检测模块。二、环境准备安装 OpenVINO Toolkit2.1 安装方式选择OpenVINO 的安装主要有两种推荐途径离线包安装推荐官方提供l_openvino_toolkit_p_2021.4.689.tgz之类的 tar.gz 安装包相较 GitHub 源码编译方式更省时稳定Docker 部署直接拉取官方镜像即可获得完整运行环境docker pull openvino/ubuntu18_dev:2021.4.1安装完成后请跟随官方 Get Started 指南完成首次初始化本文命令均以 OpenVINO 2021.4 版本为基准。2.2 环境变量配置Windows每次使用前在 cmd 中执行INSTALL_DIR\openvino_2021\bin\setupvars.bat也可以一次性写入系统环境变量NameValueINTEL_OPENVINO_DIRINSTALL_DIR\openvino_2021INTEL_CVSDK_DIR%INTEL_OPENVINO_DIR%InferenceEngine_DIR%INTEL_OPENVINO_DIR%\deployment_tools\inference_engine\shareHDDL_INSTALL_DIR%INTEL_OPENVINO_DIR%\deployment_tools\inference_engine\external\hddlngraph_DIR%INTEL_OPENVINO_DIR%\deployment_tools\ngraph\cmake并将以下路径追加到Path%INTEL_OPENVINO_DIR%\deployment_tools\inference_engine\bin\intel64\Debug;%INTEL_OPENVINO_DIR%\deployment_tools\inference_engine\bin\intel64\Release;%HDDL_INSTALL_DIR%\bin;%INTEL_OPENVINO_DIR%\deployment_tools\inference_engine\external\tbb\bin;%INTEL_OPENVINO_DIR%\deployment_tools\ngraph\libLinux每次使用前在 shell 中执行source /opt/intel/openvino_2021/bin/setupvars.sh若希望免去每次手动 source可编辑~/.bashrc在文件末尾追加vi ~/.bashrc # 在文件末尾添加 source /opt/intel/openvino_2021/bin/setupvars.sh注意环境变量中的setupvars脚本同时也为后续的 CMake 构建提供InferenceEngine_DIR等关键变量务必在编译与运行前完成 source。三、模型转换Paddle 模型 → ONNX → OpenVINO IRDemo 运行需要两个 OpenVINO 模型picodet_m_416_coco.xml与tinypose256.xml对应训练配置中的 TinyPose 256×192 模型转换分两步完成。3.1 第一步Paddle 模型导出为 ONNX以 PicoDet 为例先在仓库根目录导出 Paddle 推理模型再通过paddle2onnx与onnxsim得到精简 ONNXmodelNamepicodet_m_416_coco # 1. 导出 Paddle 推理模型 python tools/export_model.py \ -c configs/picodet/${modelName}.yml \ -o weights${modelName}.pdparams \ --output_dirinference_model # 2. 转换为 ONNX paddle2onnx --model_dir inference_model/${modelName} \ --model_filename model.pdmodel \ --params_filename model.pdiparams \ --opset_version 11 \ --save_file ${modelName}.onnx # 3. onnxsim 精简计算图 python -m onnxsim ${modelName}.onnx ${modelName}_sim.onnx几点说明上述命令需要先安装 paddle2onnx 与onnxsimpip install onnxsim仓库当前configs/picodet/目录下的实际配置文件名以picodet_m_416_coco_lcnet.yml形式存在使用-c参数时请以仓库 configs/picodet 目录下实际存在的文件名为准TinyPose 模型的导出过程与 PicoDet 完全相同export_model.pypaddle2onnxonnxsim三步其训练配置文件位于 configs/keypoint/tiny_pose/tinypose_256x192.yml。3.2 第二步ONNX 转换为 OpenVINO IR首先进入 Model Optimizer 目录并安装 ONNX 转换依赖cd INSTALL_DIR/openvino_2021/deployment_tools/model_optimizer cd ./install_prerequisites sudo install_prerequisites_onnx.sh然后执行转换注意--mean_values与--scale_values必须与训练配置中的归一化设置完全一致这是保证推理精度一致的关键mo_onnx.py --input_model ONNX_MODEL --mean_values [103.53,116.28,123.675] --scale_values [57.375,57.12,58.395] --input_shape [1,3,256,192]转换产物为.xml计算图与.bin权重两个文件二者需放在同一目录下供运行时加载。兼容性提示较新版本的 OpenVINO 转换工具在Resize算子处理上可能出现报错若遇到此类问题请回退到openvino_2021.4.689版本重试。四、编译构建CMake OpenCV InferenceEngine项目的 CMakeLists.txt 依赖三部分OpenCV、InferenceEngine推理引擎与 ngraph三者缺一不可cmake_minimum_required(VERSION 3.4.1) set(CMAKE_CXX_STANDARD 14) project(tinypose_demo) find_package(OpenCV REQUIRED) find_package(InferenceEngine REQUIRED) find_package(ngraph REQUIRED)Windows 构建OPENVINO_INSTALL_DIR\openvino_2021\bin\setupvars.bat mkdir -p build cd build cmake .. msbuild tinypose_demo.vcxproj /p:configurationrelease /p:platformx64Linux 构建source /opt/intel/openvino_2021/bin/setupvars.sh mkdir build cd build cmake .. make编译产物为tinypose_demo可执行文件。构建前请将下载好的 PicoDet 与 TinyPose 的 OpenVINO 模型文件.xml.bin放入weight/目录main.cpp 中默认按以下路径加载auto detector PicoDet(./weight/picodet_m_416.xml); auto kpts_detector new KeyPointDetector(./weight/tinypose256_git2-sim.xml, 256, 192);五、运行 Demo四种输入模式可执行文件的统一调用方式为./tinypose_demo [mode] [image_file]参数说明mode输入模式0摄像头1图片2视频3Benchmarkimage_file输入路径摄像头模式下为摄像头 ID5.1 摄像头实时推理tinypose_demo 0 05.2 图片批量推理tinypose_demo 1 IMAGE_FOLDER/*.jpg支持通配符批量匹配每张图片的处理结果会写出为keypoint_原文件名JPEG 质量 95见 main.cpp 的image_infer_kpts实现同时检测框与关键点会绘制在输出图中。5.3 视频推理tinypose_demo 2 VIDEO_PATH5.4 Benchmark 性能测试tinypose_demo 3 0Benchmark 逻辑位于 main.cpp构造一张 256×192 的全 1 灰度图像设定 center{128, 96}、scale{256, 192}先 warm-up 8 次再循环 100 次统计单次推理耗时。官方文档给出的参考测试环境与数据如下实际表现随硬件与模型版本而异平台Intel(R) Xeon(R) CPU E5-2650 v4 2.20GHz × 24 核模型TinyPose 256×192 OpenVINO 版参数MinMaxAvginfer time(s)0.0180.0620.028六、关键实现解读从源码理解双模型管线6.1 统一缩放与有效区域回映Demo 对检测模型采用等比缩放 边缘填充的预处理策略resize_uniformmain.cpp在将图像缩放至 416×416 的同时记录有效区域effect_areax/y 偏移与宽高。推理得到的检测框坐标位于填充后图像上需通过coordsback结合effect_area与缩放比例映射回原图坐标后再做可视化。6.2 PicoDet 的 DFL 解码与 NMSPicoDet 的 OpenVINO 输出包含 4 个尺度的头stride 8/16/32/64每个尺度由类别分支与距离分支组成输出节点名在 picodet_openvino.h 中以heads_info_声明std::vectorHeadInfo heads_info_{ // cls_pred|dis_pred|stride {transpose_0.tmp_0, transpose_1.tmp_0, 8}, {transpose_2.tmp_0, transpose_3.tmp_0, 16}, {transpose_4.tmp_0, transpose_5.tmp_0, 32}, {transpose_6.tmp_0, transpose_7.tmp_0, 64}, };解码流程picodet_openvino.cpp对每个特征点遍历 80 个类别取最大得分得分超过阈值demo 中检测阈值取0.4即视为候选距离分支每个框输出(reg_max1)×4个值其中reg_max_ 7对每条边做 softmax 后按期望值计算距离再乘 stride 还原到输入尺度由特征点中心(col0.5)*stride与四边距离组合出(xmin, ymin, xmax, ymax)按类别分别执行 NMSnms_threshold取0.5见 main.cpp合并所有类别得到最终检测框。6.3 TinyPose 关键点推理与 DARK 后处理关键点检测器KeyPointDetectorkeypoint_detector.h在构造时读取 IR 模型、将所有输出精度设为 FP32并加载到 CPU 设备。其默认参数为输入 256×192、score_threshold 0.3、batch_size 1、use_darktrue与训练配置 tinypose_256x192.yml 中的use_dark: true保持一致。推理与后处理要点Predictkeypoint_detector.cpp将裁剪图 resize 到 256×192 后按 HWC→CHW 填入输入 blob通过infer_request_.Infer()执行推理再按输出节点名conv2d_441.tmp_1热力图与argmax_0.tmp_0最大响应索引取回结果get_final_predskeypoint_postprocess.cpp根据 argmax 索引得到每个关节的整数坐标并依据use_dark选择 DARK 亚像素细化对热力图做高斯模糊后用泰勒展开求解 Hessian 逆乘梯度得到亚像素偏移源自 CVPR 2020 的 Distribution-Aware Coordinate Representation 方法或朴素的相邻差分修正最后通过transform_preds结合 center/scale 将热力图坐标映射回裁剪前的原图坐标输出结构为N×3的(conf, x, y)数组KeyPointResult定义见 keypoint_detector.h。6.4 人体裁剪CropImg 与 4:3 比例约束由于 TinyPose 在训练时使用 256×1924:3输入CropImgkeypoint_postprocess.cpp在根据检测框裁剪人体区域时会强制将裁剪窗口修正为 4:3 比例并向外扩展expandratio0.25的边距同时返回该裁剪区域的 center 与 scale 供后处理坐标映射使用。整个检测框→4:3 裁剪→关键点→坐标回映链路与训练阶段的 TopDownAffine 语义保持一致。七、常见问题与排查输出节点名不匹配模型输出节点名可能因 paddle、paddle2onnx、onnxsim、openvino 版本更新而变化当代码提示找不到conv2d_441.tmp_1或argmax_0.tmp_0时请用 Netron 打开你的.onnx/.xml检查实际输出节点名并同步修改 keypoint_detector.cpp 中的字符串。PicoDet 旧版本模型的输出名差异若报错Cannot find blob with name: transpose_1.tmp_0说明模型由旧版本 Paddle 导出可将 picodet_openvino.h 中的heads_info_改为如下旧式节点名std::vectorHeadInfo heads_info_{ // cls_pred|dis_pred|stride {save_infer_model/scale_0.tmp_1, save_infer_model/scale_4.tmp_1, 8}, {save_infer_model/scale_1.tmp_1, save_infer_model/scale_5.tmp_1, 16}, {save_infer_model/scale_2.tmp_1, save_infer_model/scale_6.tmp_1, 32}, {save_infer_model/scale_3.tmp_1, save_infer_model/scale_7.tmp_1, 64}, };转换工具版本问题新版本 OpenVINO 转换工具可能在Resize算子处报错建议使用openvino_2021.4.689。归一化参数一致性mo_onnx.py中的--mean_values/--scale_values必须与训练配置的归一化参数一致否则精度会明显下降同时图片/视频/摄像头模式下 PicoDet 的得分阈值0.4与 NMS 阈值0.5可在 main.cpp 等处按需调整。八、总结demo_openvino_kpts为在 Intel CPU 上部署人体检测 关键点估计提供了完整可运行的参考实现Paddle 模型经export_model.py→paddle2onnx→mo_onnx.py三步转换为 OpenVINO IR随后由 C 程序通过 InferenceEngine C API 完成 PicoDet 多尺度头解码含 DFL 软标签解码与 NMS与 TinyPose 的 DARK 亚像素关键点后处理。该 demo 的四种运行模式覆盖了实际产品中最常见的接入方式开发者可直接基于 deploy/third_engine/demo_openvino_kpts 目录中的源码进行二次开发将其移植到自己的推理框架或业务管线中。赞分享人工智能深度学习计算机视觉【免费下载链接】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 多人关键点检测 PipelinePP-PicoDet PP-TinyPose在昆仑芯 XPU 上的 FastDeploy Python 部署实战PaddleDetection 多人关键点检测 PipelinePP PicoDet PP TinyPose在昆仑芯 XPU 上的 FastDeploy人工智能深度学习计算机视觉PaddleDetection PP-TinyPose 全解析移动端实时多人关键点检测的模型库、训练与部署实践PaddleDetection PP TinyPose 全解析移动端实时多人关键点检测的模型库、训练与部署实践 PP TinyPose 是 PaddleDet人工智能深度学习计算机视觉PP-TinyPose 移动端实时多人姿态估计PaddleDetection 轻量级关键点检测模型全解析PP TinyPose 移动端实时多人姿态估计PaddleDetection 轻量级关键点检测模型全解析 PP TinyPose 是 PaddleDetect人工智能深度学习计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
