ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用RKNPU2部署YOLOv5目标检测:从模型转换到NMS后处理的完整教程

2026/8/27 15:07:31 拓冰建站 浏览量
用RKNPU2部署YOLOv5目标检测:从模型转换到NMS后处理的完整教程 用RKNPU2部署YOLOv5目标检测从模型转换到NMS后处理的完整教程【免费下载链接】rknpu2项目地址: https://gitcode.com/gh_mirrors/rk/rknpu2本文带你用RKNPU2Rockchip NPU 工具链在 RK3562/RK3566/RK3588 开发板上部署YOLOv5 目标检测模型从 ONNX 转换 RKNN 模型、RKNN 推理主流程到 NMS 后处理参数调优一份完整教程带你快速跑通端侧 AI 检测。上图为 Demo 自带的测试图片examples/rknn_yolov5_demo/model/bus.jpg运行检测后会在原图上画出目标框与置信度。一、RKNPU2 是什么为什么用它做目标检测RKNPU2是 Rockchip瑞芯微NPU 的第二代软件栈核心由两部分组成组件作用在本项目中的位置rknn-toolkit2模型转换工具PC 端运行把 ONNX 转成.rknn模型转换脚本examples/rknn_yolov5_demo/convert_rknn_demo/yolov5/onnx2rknn.pylibrknn_api端侧运行时推理库板端运行runtime/RK3588/Linux/librknn_api/对新手来说它的优势在于性能高、功耗低推理交给 NPU 硬件执行CPU 几乎不占用适合边缘盒子、IPC 摄像头等场景流程标准转换 → 推理 → 后处理三步走官方 Demo 可直接编译运行适配广同一套代码支持 RK3562、RK3566/RK3568、RK3588 及 RV1106 系列芯片Linux 与 Android 均可运行。⚠️ 新手注意由于硬件限制Demo 默认把 YOLOv5 的后处理部分移到 CPU 实现且附带模型使用 relu 激活相比 silu 精度略降、性能大幅提升详见examples/rknn_yolov5_demo/README_CN.md。二、项目结构速览YOLOv5 Demo 里有什么Demo 位于examples/rknn_yolov5_demo/核心文件一览examples/rknn_yolov5_demo/ ├── convert_rknn_demo/yolov5/ # ONNX 转 RKNN 的转换脚本 │ ├── onnx2rknn.py # 转换入口 │ ├── onnx_models/yolov5s_relu.onnx │ └── dataset.txt # 量化校准数据集列表 ├── model/ # 各平台预转换好的 .rknn 模型 │ ├── RK3562/ RK3566_RK3568/ RK3588/ │ ├── bus.jpg # 测试图片 │ └── coco_80_labels_list.txt # COCO 80 类标签 ├── src/ │ ├── main.cc # 图片检测主程序 │ ├── main_video.cc # 视频流检测主程序 │ ├── preprocess.cc # letterbox / RGA 缩放预处理 │ └── postprocess.cc # 反量化 NMS ├── include/ │ ├── postprocess.h # NMS_THRESH、BOX_THRESH 等参数 │ ├── preprocess.h │ └── rga_func.h └── utils/ # MPP 解码/编码、画框工具关键点模型按芯片平台分目录存放如model/RK3588/yolov5s-640-640.rknn运行时按自己板子选择对应目录即可。三、模型转换ONNX 转 RKNN 的最快 3 步法转换脚本为examples/rknn_yolov5_demo/convert_rknn_demo/yolov5/onnx2rknn.py在 PC 上配合 rknn-toolkit2版本 ≥ 1.4.0使用。1. 修改目标平台参数打开onnx2rknn.py将platform改成你的芯片platform rk3566 # 可改为 rk356x / rk3588 等2. 确认量化配置脚本中已给出推荐配置输入640x640、mean 为 0、std 为 255即把 0~255 归一化到 0~1并启用INT8 量化do_quantizationTrue 校准数据集dataset.txtrknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformplatform) ret rknn.build(do_quantizationTrue, datasetDATASET) ret rknn.export_rknn(RKNN_MODEL_PATH) 量化需要校准集dataset.txt内为若干图片路径校准集越贴近真实业务场景INT8 精度越稳。3. 执行转换python onnx2rknn.py生成的.rknn模型输出在rknn_models/目录拷贝到板端model/平台/目录即可使用。 替换自训练模型时的两大坑anchor 必须对齐Demo 后处理硬编码了 YOLOv5 的三组 anchor见src/postprocess.cc中anchor0/anchor1/anchor2换模型不同步修改会导致检测框解析错乱类别数与阈值COCO 80 类对应include/postprocess.h中的OBJ_CLASS_NUM 80自定义类别需同步修改。四、推理主流程从图片输入到检测框输出主程序examples/rknn_yolov5_demo/src/main.cc的完整链路如下共 5 步步骤关键 API说明① 初始化rknn_init加载.rknn模型创建推理上下文② 查询属性rknn_query获取输入/输出张量的尺寸、格式、量化 scale 与 zero-point③ 预处理letterbox / RGA缩放填充到 640x640默认letterbox保持长宽比④ 推理rknn_inputs_set→rknn_run→rknn_outputs_getNPU 执行前向计算⑤ 后处理post_process反量化 置信度过滤 NMS输出检测框letterbox 预处理参数怎么理解src/preprocess.cc中的letterbox()按最小缩放比缩放图像并居中补边避免拉伸变形——这正是 YOLOv5 训练时的预处理方式直接决定了检测精度。缩放比scale_w/scale_h和补边量pads会传入后处理用于把预测框映射回原图坐标// main.cc 中的调用 letterbox(img, resized_img, pads, min_scale, target_size);若只追求速度不在乎形变可选resize模式走 RGA 硬件加速追求精度请保持默认letterbox。五、NMS 后处理详解如何去掉重复的检测框这是新手最容易困惑的一环。NPU 输出的是80 个类别 × 每网格数百个候选框的量化张量必须经过三层漏斗才能得到最终结果原始输出(约上千候选) ── 置信度过滤 ── NMS去重 ── 最终检测框 (反量化) (BOX_THRESH) (NMS_THRESH)1. 反量化把 INT8 还原成浮点量化模型输出的是整型需按输出属性还原value (raw - zp) * scale。scale/zp 来自rknn_query的output_attrs[i].scale / .zppost_process()内部已自动处理。2. 两个关键阈值include/postprocess.h#define OBJ_CLASS_NUM 80 // 类别数COCO #define NMS_THRESH 0.45 // IOU 阈值大于该值的重叠框被抑制 #define BOX_THRESH 0.25 // 置信度阈值低于该值的框直接丢弃BOX_THRESH0.25调高 → 框更少、误检更少但可能漏检小目标NMS_THRESH0.45调低 → 去重更激进密集小目标场景容易误删调高 → 保留更多框但同一目标可能出现重复框。3. NMS 去重的核心逻辑src/postprocess.cc中的nms()按置信度降序遍历同类框用CalculateOverlap()计算两两 IOU凡 IOU 超过NMS_THRESH的框直接标记删除order[j] -1——这就是经典的Non-Maximum Suppression算法代码约 40 行非常适合作为端侧 NMS 的参考实现。最后程序在原图上用 OpenCV 画出红色边框与类别置信度文字结果保存为out.jpg。六、编译与运行快速部署到你的开发板1. 一键交叉编译修改build-linux_TARGET_PLATFORM.sh中的工具链路径TOOL_CHAIN然后执行脚本即可编译配置见CMakeLists.txt已自动链接 RKNN API、OpenCV、RGA、MPP 库export TOOL_CHAIN~/opt/tool_chain/gcc-9.3.0-x86_64_aarch64-linux-gnu/host ./build-linux_RK3588.shAndroid 端则修改ANDROID_NDK_PATH后运行build-android_TARGET_PLATFORM.sh。2. 推送到板端并运行adb push install/rknn_yolov5_demo_Linux /userdata/ adb shell cd /userdata/rknn_yolov5_demo_Linux/ export LD_LIBRARY_PATH./lib ./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn model/bus.jpg程序会先跑一次单帧输出检测详情再循环 10 次统计平均耗时含后处理例如loop count 10 , average run XX ms。3. 进阶视频流实时检测src/main_video.cc支持 H.264/H.265 文件与 RTSP 流仅 Linux基于 MPP 硬解码./rknn_yolov5_video_demo model/RK3588/yolov5s-640-640.rknn xxx.hevc 265 ./rknn_yolov5_video_demo model/RK3588/yolov5s-640-640.rknn RTSP_URL 265⚠️ RK3562 目前仅支持 H.264 视频流Android 暂不支持 RTSP。七、常见问题与调优建议问题现象排查方向框位置整体偏移/错乱anchor 未对齐、letterbox 的pads/scale未传入后处理漏检增多调低BOX_THRESH如 0.15或更换非量化模型同一目标多个框调低NMS_THRESH如 0.3精度明显下降检查量化校准集是否贴合业务场景确认 std_values 与训练归一化一致找不到 librga.so按板端 RGA 驱动版本选择对应库并加入LD_LIBRARY_PATH类别数对不上修改postprocess.h中OBJ_CLASS_NUM并替换标签文件结语至此你已经掌握了RKNPU2 部署 YOLOv5 目标检测的完整链路onnx2rknn.py三步转换出 RKNN 模型main.cc五步推理拿到检测结果再用postprocess.cc中的反量化 双阈值过滤 NMS 得到最终检测框。接下来可以试着替换成自训练模型、接入相机或 RTSP 视频流把检测能力真正落地到你的边缘设备中。【免费下载链接】rknpu2项目地址: https://gitcode.com/gh_mirrors/rk/rknpu2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考