YOLOv8 在 RK3576 上的 RKNN 量化部署实战
背景
RK3576 是瑞芯微推出的一款 8nm 中高端 AIoT 芯片,内置 6 TOPS NPU,非常适合做端侧目标检测。本文记录将 YOLOv8 部署到 RK3576 的完整流程:PyTorch → ONNX → RKNN(int8 量化)→ C++/Python 端侧推理。
整体流程
| 阶段 | 工具 | 产物 |
|---|---|---|
| 训练/获取权重 | PyTorch / Ultralytics | yolov8n.pt |
| 导出 ONNX | Ultralytics export |
yolov8n.onnx |
| 转 RKNN + 量化 | RKNN-Toolkit2 | yolov8n.rknn |
| 端侧推理 | RKNN Runtime (librknnrt) | C++ / Python 推理程序 |
1. 导出 ONNX
使用 Ultralytics 导出 ONNX,注意关闭动态 shape(RKNN 需要固定尺寸):
1 | pip install ultralytics |
导出后可用 netron 可视化网络结构,确认输出节点为 output0(1×84×8400 的检测头)。
2. RKNN-Toolkit2 转换与量化
RKNN-Toolkit2 需要运行在 x86_64 Linux(Ubuntu 18.04/20.04/22.04)。核心转换脚本如下:
1 | from rknn.api import RKNN |
量化校准集建议
| 指标 | 建议 |
|---|---|
| 图片数量 | 200~500 张 |
| 来源 | 目标场景真实数据(比 ImageNet 更有效) |
| 尺寸 | 与推理尺寸一致(如 640×640) |
| 预处理 | 与推理阶段严格一致(BGR/RGB、归一化) |
int8 量化后若精度下降明显,可尝试
quantized_dtype="asymmetric_quantized-8"改为"dynamic_fixed_point-8"或增加校准集数量。
3. 端侧推理
在 RK3576 板卡上,通过 librknnrt 运行时加载模型。Python 侧示例:
1 | from rknnlite.api import RKNNLite |
4. 常见坑
- 动态 shape 报错:ONNX 导出务必
imgsz固定、关闭 dynamic。 - 输出为
None:检查 NPU 驱动版本是否与 RKNN-Toolkit2 版本匹配。 - 精度大幅下降:检查校准集与推理预处理是否一致(RGB 顺序、是否减均值)。
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 独孤墨迹の博客!