首页/新闻资讯/正文详情

PaddleDetection TinyPose 人体关键点检测 OpenVINO C++ 部署实战:PicoDet + TinyPose 双模型推理 Demo 全解析

发布时间:2026/9/23 18:51:17 来源:云帆数科 栏目:资讯中心
PaddleDetection TinyPose 人体关键点检测 OpenVINO C++ 部署实战:PicoDet + TinyPose 双模型推理 Demo 全解析
人工智能深度学习计算机视觉【免费下载链接】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),仅供参考

相关推荐

ramsey/uuid 定制化实战:通过 FeatureSet、UuidFactory 与 Uuid::setFactory 深度定制 UUID 生成行为
ramsey/uuid 定制化实战:通过 FeatureSet、UuidFactory 与 Uuid::setFactory 深度定制 UUID 生成行为

ramsey/uuid 定制化实战:通过 FeatureSet、UuidFactory 与 Uuid::setFactory 深度定制 UUID 生成行为 【免费下载链接】uuid :snowflake: A PHP library for generating universally unique identifiers (UUIDs). 项目地址: https://gitcode.com/gh_mirrors/uui/u… · 2026/9/23 18:51:11

2014世界杯分组完整示例:从算法到代码避坑指南
2014世界杯分组完整示例:从算法到代码避坑指南

2014世界杯分组完整示例:从算法到代码避坑指南 你是不是也遇到过这种尴尬:刷了几百道 LeetCode,Python 的 for 循环写得滚瓜烂熟,Java 的 HashMap… · 2026/9/23 18:51:11

Airbyte db-harness-lib 深入解析:数据库连接器端到端测试的无引擎编排库
Airbyte db-harness-lib 深入解析:数据库连接器端到端测试的无引擎编排库

数据工程数据集成ETL后端大数据 【免费下载链接】airbyte Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud. 项目地址: https://gitcode.… · 2026/9/23 18:51:04

Atlas 300V 24G推理加速卡与YOLOv5部署全流程解析
Atlas 300V 24G推理加速卡与YOLOv5部署全流程解析

先说一个我几乎每周都能在群里看到的提问:Atlas 300V 24G是运算加速卡吗?这类问题通常出现在有人第一次接触昇腾推理硬件时。我的回答很直接:是,但它做的事情和大多数人想象中的“运算加速”不太一样。它不是用来训练模型的&#… · 2026/9/23 19:20:35

Atlas 300V 24G部署YOLOv5全流程:从模型转换到推理调优的昇腾实战指南
Atlas 300V 24G部署YOLOv5全流程:从模型转换到推理调优的昇腾实战指南

做AI部署这几年,Atlas这个词在我这儿出现的频率直线上升。早几年聊推理加速,大家默认就是英伟达的卡,CUDA、TensorRT一套组合拳打天下。但昇腾系列冒头之后,越来越多的项目在选型阶段就会问一句:能不能用Atlas跑&#… · 2026/9/23 19:20:35

中文微博情感分析源码拆包:从贝叶斯到BERT的完整基线
中文微博情感分析源码拆包:从贝叶斯到BERT的完整基线

简介:这份资源面向计算机、人工智能、通信、自动化等相关专业的本科生与研究生,以及需要完成课程设计、大作业或毕业设计的开发者,提供一套完整的中文微博情感分析项目源码与配套文档。项目围绕中文微博文本展开,覆盖朴素贝叶斯、… · 2026/9/23 19:20:35

2026最新无人机机巢性能优化:告别卡顿与死机,效率提升5倍
2026最新无人机机巢性能优化:告别卡顿与死机,效率提升5倍

2026最新无人机机巢性能优化:告别卡顿与死机,效率提升5倍 打开官方文档,是不是感觉像读天书?几十页的协议参数、复杂的通信时序图,看得人头晕眼花,却抓不住重点。其实,2026最新的无人机机巢开发中,最大的坑不在硬件,而在软件层的资源调度与… · 2026/9/23 19:20:35

面试必问Coldfusion核心源码拆解与版本升级避坑指南
面试必问Coldfusion核心源码拆解与版本升级避坑指南

面试必问Coldfusion核心源码拆解与版本升级避坑指南 版本升级后 API 全变了,这是很多老 Java 开发者转岗或接手遗留系统时最头疼的问题。尤其是 Adobe ColdFusion 这种在金融、医疗行业大量存在的遗留技术,一旦从… · 2026/9/23 19:20:28

PX4 VTOL 无空速传感器飞行:参数配置、日志分析与失速安全实战指南
PX4 VTOL 无空速传感器飞行:参数配置、日志分析与失速安全实战指南

嵌入式物联网机器人自动驾驶智能硬件 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 点击查看 免费下载 VTOL(垂直起降)固定翼飞行器依赖空速传感器来判断流过机翼的气… · 2026/9/23 19:20:22

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码