1. 项目背景与目标
在嵌入式设备上部署计算机视觉模型时,量化方式的选择直接影响推理速度和精度表现。最近我在瑞芯微RV1126平台上部署YOLOv8n模型时,系统测试了三种量化方案(int8、uint8、float16)的实际性能差异。这个测试源于一个真实项目需求——需要在低功耗边缘设备上实现每秒30帧以上的目标检测,同时保证mAP不低于原始模型的90%。
量化本质上是用低精度数据类型近似表示高精度模型参数的过程。在RKNN框架中,i8表示有符号8位整数,u8是无符号8位整数,fp则是浮点16位半精度。理论上,整数量化能带来更快的计算速度,但可能损失更多精度;而浮点量化能保留更多精度,但计算效率较低。这次测试就是要用实际数据验证这些理论假设。
2. 模型转换实操
2.1 环境准备
首先需要搭建RKNN工具链环境:
- 安装RKNN-Toolkit2(版本1.4.0)
- 配置Python3.8虚拟环境
- 准备RV1126交叉编译工具链
注意:RKNN-Toolkit2版本必须与设备端NPU驱动版本匹配,否则会出现奇怪的推理错误。我遇到过toolkit1.6.0生成的模型在旧版驱动上无法加载的情况。
2.2 ONNX模型导出
使用Ultralytics官方YOLOv8代码导出ONNX:
bash复制yolo export model=yolov8n.pt format=onnx opset=12
关键参数说明:
opset=12:确保使用ONNX的稳定算子集- 动态维度设置为
--dynamic可能会影响后续RKNN转换成功率
2.3 RKNN转换命令详解
进入RKNN模型库的YOLOv8示例目录:
bash复制cd rknn_model_zoo-main/examples/yolov8/python
三种量化方式的转换命令差异仅在于最后一个参数:
bash复制# 有符号int8量化
python convert.py yolov8n.onnx rv1126 i8
# 无符号uint8量化
python convert.py yolov8n.onnx rv1126 u8
# 浮点16量化
python convert.py yolov8n.onnx rv112
