资讯动态

rknn_model_zoo 中 YOLOv8-Pose 人体关键点检测的 RKNN 部署实战指南

发布时间:2026/10/4 1:58:45 来源:尧图企业网站定制
示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载本指南以 examples/yolov8_pose 为例完整讲解将 YOLOv8-Pose 模型yolov8n-pose从 PyTorch/ONNX 转换到 RKNN 格式、在 RKNPU 平台上进行推理与后处理、以及通过 Python、Android、Linux 三种方式运行 demo 的全流程。读完本文你将掌握 yolo 姿态估计模型在 RK3562 / RK3566 / RK3568 / RK3576 / RK3588 / RV1126B 等 Rockchip NPU 平台上的模型转换参数、混合量化配置、letterbox 预处理、DFL 分布焦点损失解码、关键点还原与 NMS 后处理的完整实现细节并能独立复现运行结果。1. 示例概述该示例使用的模型来自 airockchip 的 ultralytics_yolov8 开源项目使用其导出的 yolov8n-poseNano 规格的姿态估计模型进行演示。与目标检测模型不同Pose 模型除了输出检测框与类别置信度外还会输出每个人体目标上 17 个关键点关键点坐标 x、y 及置信度 conf可用于动作识别、姿态分析等场景。仓库中该示例的完整结构如下model/模型下载脚本、测试图片与类别列表python/ONNX 转 RKNN 的转换脚本与 Python 推理 democpp/C/C 版本的推理 demo含 rknpu1 / rknpu2 两套平台实现2. 当前支持平台示例官方声明支持以下 NPU 平台平台说明RK3562中低端 SoCRK3566中低端 SoCRK3568中端 SoCRK3576新一代中高端 SoCRK3588高端 SoCRV1126B安防/视觉专用 SoC从 cpp/CMakeLists.txt 的编译分支可以看出示例对底层 NPU SDK 做了分层兼容TARGET_SOC为rv1106/rv1103时使用 rknpu2 下的 RV1106_1103 专用实现并引入 dma 分配器为rk1808/rv1109/rv1126时定义RKNPU1宏并使用 rknpu1 实现其余平台统一走 rknpu2 实现。3. 预训练模型获取示例默认使用 yolov8n-pose.onnx 模型仓库根目录下已提供下载脚本 examples/yolov8_pose/model/download_model.sh执行如下命令即可将 ONNX 模型下载到model/目录cd model ./download_model.sh下载完成后model/目录下应包含yolov8n-pose.onnx待转换的 ONNX 模型bus.jpg测试图片640x640yolov8_pose_labels_list.txt类别列表文件内容为person该姿态模型仅检测 person 单一类别对应OBJ_CLASS_NUM 14. 将 ONNX 模型转换为 RKNN 模型转换入口为 examples/yolov8_pose/python/convert.py使用 Rockchip 官方rknn-toolkit2的 Python API 完成配置-加载-构建-导出四个阶段。4.1 命令行用法cd python python convert.py onnx_model TARGET_PLATFORM dtype(optional) output_rknn_path(optional) # 例如 python convert.py ../model/yolov8n-pose.onnx rk3588参数说明与源码parse_arg()逻辑一致参数含义默认值onnx_modelONNX 模型路径必填TARGET_PLATFORMNPU 平台名取值见支持平台一节必填dtypei8/u8表示量化fp表示不量化i8源码中DEFAULT_QUANT Trueoutput_rknn_pathRKNN 模型保存路径../model/yolov8_pose.rknn源码中DEFAULT_RKNN_PATH注意当前 C 代码 demo 只支持 8 位量化模型因此实际部署时推荐使用默认的i8量化方式。4.2 转换流程源码解析转换脚本的核心步骤对应以下 RKNN Toolkit API 调用链创建对象rknn RKNN(verboseFalse)模型配置rknn.config(mean_values[[0,0,0]], std_values[[255,255,255]], target_platformplatform)即输入不做均值偏移、除以 255 归一化到[0,1]加载模型rknn.load_onnx(modelmodel_path)构建模型核心差异在这里——对rv1109/rv1126/rk1808等老平台直接rknn.build(do_quantizationdo_quant, dataset..., auto_hybrid_quantTrue)对其他新平台如 rk3588量化时采用混合量化hybrid quantization两步法先rknn.hybrid_quantization_step1指定检测头的若干敏感节点走 fp 精度再rknn.hybrid_quantization_step2完成正式量化构建。导出rknn.export_rknn(output_path)释放rknn.release()其中混合量化使用的校准数据集路径为DATASET_PATH ../../../datasets/COCO/coco_subset_20.txt即仓库根目录下 datasets/COCO/coco_subset_20.txt 所列的 20 张 COCO 子集图片custom_hybrid参数将三个检测头model.22/cv4.0、cv4.1、cv4.2的Mul_output_0到Concat_6_output_0的敏感区间保留为高精度以缓解量化对姿态回归精度的损失。5. Python Demo 推理Python demo 位于 examples/yolov8_pose/python/yolov8_pose.py支持直接加载 PT/ONNX 模型或 RKNN 模型进行推理。5.1 运行方式cd python # 使用 PyTorch 模型或 ONNX 模型推理 python yolov8_pose.py --model_path pt_model/onnx_model # 使用 RKNN 模型推理需指定 NPU 平台 python yolov8_pose.py --model_path rknn_model --target TARGET_PLATFORM命令行参数--model_path模型路径必填支持.pt/.onnx/.rknn--target目标 RKNPU 平台默认rk3566如rk3588--device_id设备 ID默认None本机运行当加载 RKNN 模型时脚本依次执行rknn.load_rknn()→rknn.init_runtime(target..., device_id...)→rknn.inference(inputs[infer_img])最终将结果绘制并保存为result.jpg。5.2 预处理letterbox 缩放脚本中的letterbox_resize实现标准 letterbox 策略按min(target_w/width, target_h/height)计算等比缩放比例将图片缩放至 640x640 并居中放置剩余区域填充背景色demo 中bg_color56对应 cpp/rknpu2/yolov8-pose.cc 中 C 侧默认的bg_color114两者均为偏灰填充色。函数同时返回缩放比例aspect_ratio与偏移量offset_x/offset_y供后处理时把结果坐标映射回原图。输入在送入模型前还需做 BGR→RGB 通道翻转infer_img letterbox_img[..., ::-1]与转换时std_values[[255,255,255]]的归一化设置配合。5.3 输出张量解析与后处理模型输出 4 个张量其中results[:3]为三个尺度的检测头输出results[3]为关键点张量特征图尺寸分别为 80x80stride8、40x40stride16、20x20stride32对应输入 640x640每个检测头每个位置输出1 64维64 维为 4 组 DFLDistribution Focal Loss回归参数每组 16 个 bin1 维为类别置信度后处理链路对应 python/yolov8_pose.py 中process()函数对 64 维定位特征按 16 一组做softmax再乘以索引权重求和得到期望值即完成 DFL 解码结合网格坐标(w0.5, h0.5)与 stride 还原出中心点与宽高得到检测框置信度经 sigmoid 后与阈值objectThresh 0.5比较过滤低分框对三个尺度结果合并后执行NMSnmsThresh 0.4得到最终目标关键点坐标按 stride 缩放到 640 分辨率再通过(coord - offset) / aspect_ratio映射回原图。5.4 关键点与骨架绘制脚本内置 COCO 姿态约定的 17 关键点可视化配置kpt_color为各关键点颜色skeleton定义了 19 条骨架连线如 16→14、14→12、6→12、7→13、4→6、5→7 等limb_color为各连线颜色。绘制时对置信度为 0即x0 and y0的关键点与骨架连线跳过最终输出带检测框、关键点圆点和骨架线的result.jpg。6. Android DemoAndroid 侧使用仓库根目录的build-android.sh统一构建脚本。6.1 编译构建# 回到 rknn_model_zoo 根目录 cd ../../ # 先设置 Android NDK 路径 export ANDROID_NDK_PATHandroid_ndk_path ./build-android.sh -t TARGET_PLATFORM -a ARCH -d yolov8_pose # 例如 ./build-android.sh -t rk3588 -a arm64-v8a -d yolov8_pose参数说明ANDROID_NDK_PATHAndroid NDK 路径TARGET_PLATFORMNPU 平台名ARCH设备系统架构。Android 设备通常为arm64-v8a或armeabi-v7a可通过以下命令查询adb shell cat /proc/version6.2 推送 demo 文件到设备手机/开发板通过 USB 连接后adb root adb remount adb push install/TARGET_PLATFORM_android_ARCH/rknn_yolov8_pose_demo/ /data/6.3 运行 demoadb shell cd /data/rknn_yolov8_pose_demo export LD_LIBRARY_PATH./lib ./rknn_yolov8_pose_demo model/yolov8n-pose.rknn model/bus.jpg运行结束后结果保存为out.png可在宿主机上拉回查看adb pull /data/rknn_yolov8_pose_demo/out.png7. Linux DemoLinux 侧使用build-linux.sh构建适用于 RKNN Linux 环境如 RK3588 开发板。7.1 编译构建# 回到 rknn_model_zoo 根目录 cd ../../ # 若构建时找不到 GCC 交叉编译器请设置 GCC_COMPILER 路径可选 export GCC_COMPILERGCC_COMPILER_PATH ./build-linux.sh -t TARGET_PLATFORM -a ARCH -d yolov8_pose # 例如 ./build-linux.sh -t rk3588 -a aarch64 -d yolov8_pose参数说明GCC_COMPILER交叉编译器路径例如export GCC_COMPILER~/opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihfTARGET_PLATFORMNPU 平台名ARCHLinux 设备架构通常为aarch64或armhf同样可用adb shell cat /proc/version查询7.2 推送 demo 文件到设备USB 连接时adb push install/TARGET_PLATFORM_linux_ARCH/rknn_yolov8_pose_demo/ /userdata/其他板卡可用scp等方式将install/TARGET_PLATFORM_linux_ARCH/rknn_yolov8_pose_demo/下所有文件推送到/userdata。7.3 运行 demoadb shell cd /userdata/rknn_yolov8_pose_demo export LD_LIBRARY_PATH./lib ./rknn_yolov8_pose_demo model/yolov8n-pose.rknn model/bus.jpg同样结果保存在out.png拉回命令adb pull /userdata/rknn_yolov8_pose_demo/out.png8. C 侧实现与后处理原理Linux/Android demo 的可执行文件由 examples/yolov8_pose/cpp/main.cc 编译而来运行参数为model_path image_path两个命令行参数。其调用链为init_yolov8_pose_modelcpp/rknpu2/yolov8-pose.cc→read_image→inference_yolov8_pose_model→post_process→ 绘制并输出out.png。8.1 模型初始化与推理init_yolov8_pose_model通过rknn_init加载模型用rknn_query获取输入输出信息并根据输入张量布局NCHW/NHWC记录model_width / model_height / model_channel同时根据输出张量的量化属性判断is_quant从而决定后续按 int8/uint8 量化数据还是 fp32 数据解析。inference_yolov8_pose_model完成一次完整推理对输入图片执行convert_image_with_letterbox缩放填充背景色 114→rknn_inputs_set送数据 →rknn_run推理打印耗时与 FPS→rknn_outputs_get取输出 → 调用post_process后处理。8.2 后处理阈值与数据结构cpp/postprocess.h 定义了关键常量与结构OBJ_CLASS_NUM 1仅 person 一类NMS_THRESH 0.4、BOX_THRESH 0.5NMS 与置信度阈值与 Python 侧默认一致object_detect_result每个目标包含检测框box、keypoints[17][3]17 个关键点的 x、y、conf与类别、分数object_detect_result_list最多容纳OBJ_NUMB_MAX_SIZE 128个目标8.3 三尺度解码与关键点还原cpp/postprocess.cc 中的post_process遍历 3 个输出张量80x80/40x40/20x20stride 分别为 8/16/32按量化类型int8/uint8/fp32分别调用process_i8/process_u8/process_fp32完成 DFL softmax 解码与阈值过滤随后quick_sort_indice_inverse按分数降序排序、按类别分组执行 NMS。关键点数据来自第 4 个输出张量其布局为[17, 3, 8400]8400 80² 40² 20²即三个尺度的 anchor 总数通过keypoints_index index h * grid_w w定位到当前框对应的关键点按j*3*8400 k*8400 index索引取出第 j 个关键点的 x/y/conf量化模型在 RKNPU2 上输出为 FP16rknpu2::float16非量化模型输出为 FP32。最后通过 letterbox 的x_pad / y_pad / scale把框与关键点坐标映射回原图坐标。8.4 结果绘制main.cc对每个检测目标打印类别 (left top right bottom) 置信度文本用draw_rectangle画蓝色检测框、draw_text标注类别与概率百分比依据 19 条骨架连线skeleton[38]数组用draw_line画橙色骨架线用draw_circle画 17 个黄色关键点最终通过write_image(out.png, ...)保存结果。9. 预期运行结果以model/bus.jpg作为测试图demo 会打印检测到的目标、检测框坐标与置信度类似person (209 244 286 506) 0.884 person (478 238 559 526) 0.868 person (110 238 230 534) 0.825并在图片上绘制出每个人体的检测框、17 个关键点与骨架连线结果如图 1 所示Python demo 保存为result.jpgC demo 保存为out.png。注意不同平台、不同版本的工具链与 NPU 驱动下输出结果可能存在细微差异属正常现象。10. 常见问题与排查建议量化后姿态精度下降优先确认使用默认的i8 混合量化流程convert.py 中hybrid_quantization_step1/step2混合量化保留了检测头敏感节点的高精度可明显改善关键点回归精度。C demo 无法加载模型C 代码 demo 仅支持 8 位量化模型请确认转换时使用i8/u8而非fp并保证 RKNN 模型与运行平台如 rk3588匹配。坐标错位检查预处理与后处理是否使用了同一套 letterbox 参数缩放比例与偏移量Python 与 C 实现中背景填充色不同56 vs 114不会影响结果但缩放/偏移计算必须一致。构建失败Android 需正确设置ANDROID_NDK_PATHLinux 交叉编译需正确设置GCC_COMPILER并确认-a参数arm64-v8a/aarch64等与目标设备架构一致。赞分享示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载相关推荐PaddleHub 关键点检测Pose Estimation模型实战指南人体/人脸/手部关键点检测的安装、API 与 Serving 部署PaddleHub 关键点检测Pose Estimation模型实战指南人体/人脸/手部关键点检测的安装、API 与 Serving 部署 导读 本文围绕人工智能大模型微调模型推理服务PaddleFormers 人体骨骼关键点检测实战human_pose_estimation_resnet50_mpii 模块安装、预测与 Serving 部署全指南PaddleFormers 人体骨骼关键点检测实战human_pose_estimation_resnet50_mpii 模块安装、预测与 Serving 部人工智能大模型微调模型推理服务PaddleDetection 端侧人体关键点检测实战PicoDet TinyPose 的 MNN 跨平台部署全流程指南PaddleDetection 端侧人体关键点检测实战PicoDet TinyPose 的 MNN 跨平台部署全流程指南 导读 本文基于 PaddleDe人工智能深度学习计算机视觉上一篇Rust 编译器错误 E0367 深度解析为何不能为泛型类型的子集实现 Drop下一篇React 服务端渲染避免共享模块状态彻底解决并发竞态与跨请求数据泄漏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑