rknn模型转换
RKNN(Rockchip Neural Network)是瑞芯微(Rockchip)针对其芯片平台设计的神经网络推理框架,支持将主流深度学习框架训练的模型转换为RKNN格式,以便在瑞芯微芯片上高效运行。转换过程涉及模型优化、量化和适配硬件加速器。
1、转换工具安装
在Linux系统中,新建虚拟环境(conda或者python env虚拟环境下)安装RKNN-Toolkit工具包,瑞芯微官方提供Python环境下的工具链:
pip install rknn-toolkit2 # 根据芯片型号选择版本
2、模型准备
准备模型文件 确保拥有冻结的模型(.pt文件)或训练检查点(.ckpt)。冻结模型需包含完整的计算图和权重。使用官方ultralytics的模型进行导出onnx没有问题,在后处理阶段对conf_thresh和nms都进行过滤。
另外,也可以参考野火鲁班猫的版本:
https://doc.embedfire.com/linux/rk356x/Ai/zh/latest/lubancat_ai/example/yolo11.html#id1
模型导出使用专门针对rknn优化的 ultralytics_yolo11 。
3、校准数据集
生成图片校准txt文件,在量化过程中需要使用。
import os
img_dir = './calibration_img'#校准图片位置
output_file = './dataset.txt'
extensions = ('.jpg', '.jpeg', '.png', '.bmp')
img_paths = [
f for f in os.listdir(img_dir)
if f.lower().endswith(extensions)
]
img_paths.sort()
with open(output_file, 'w') as f:
for filename in img_paths:
path = './{}/{}'.format(os.path.basename(img_dir), filename)
f.write(path + '\n')
print(f'共写入 {len(img_paths)} 张图片路径到 {output_file}')
4、转换成rknn模型
编写转换脚本 创建Python脚本,使用RKNN-Toolkit加载原始模型并配置转换参数:
#安装了rknn toolkit使用
from rknn.api import RKNN
import os
# 配置路径
ONNX_PATH = "./onnx_models/640/yolov12n-640.onnx" # 输入ONNX模型
RKNN_PATH = "./rknn_models/640/yolov12n-640.rknn" # 输出RKNN模型
CALIB_PATH = "./dataset.txt" # 校准图路径文件
def main():
# 1. 创建RKNN实例,开启日志(方便调试)
rknn = RKNN(verbose=True)
# 2. 配置NPU运行参数(针对RK3588优化)
print("=== 配置模型参数 ===")
rknn.config(
mean_values=[[0, 0, 0]], # 归一化均值(YOLO11用0)
std_values=[[255, 255, 255]], # 归一化标准差(YOLO11用255,对应输入除以255)
target_platform="rk3588", # 目标硬件
#optimization_level=3, # 优化级别(3为最高)
#quantize_input_node=True, # 对输入节点量化(提升速度)
# 若需混合精度量化(部分层用FP16),添加以下行:
# precision_mode="hybrid",
# float_dtype="fp16"
)
# 3. 加载ONNX模型(关键:指定输入尺寸和归一化参数)
print("=== 加载ONNX模型 ===")
ret = rknn.load_onnx(
model=ONNX_PATH,
# 声明输入节点信息:名称(从Netron查看)、尺寸、数据类型
#inputs=["images"], # YOLO11的输入节点名固定为images
#input_size_list=[[3,320, 320]], # NCHW格式
)
if ret != 0:
print("加载ONNX模型失败!")
exit(ret)
# 4. 构建模型(量化核心步骤,耗时约10分钟)
print("=== 构建模型 ===")
ret = rknn.build(
do_quantization=True, # 开启INT8量化
dataset=CALIB_PATH, # 校准数据集
#quantized_dtype="int8" # 量化类型
)
if ret != 0:
print("构建模型失败!")
exit(ret)
# 5. 导出RKNN模型
print("=== 导出RKNN模型 ===")
ret = rknn.export_rknn(RKNN_PATH)
if ret != 0:
print("导出模型失败!")
exit(ret)
# 6. 可选:测试模型在NPU上的推理效果(验证精度)
print("=== 初始化运行时 ===")
ret = rknn.init_runtime()
if ret != 0:
print("初始化运行时失败!")
exit(ret)
# 用一张测试图验证(可选)
import cv2
import numpy as np
img = cv2.imread("platalea_minor.jpg") # 随便选一张校准图
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (640, 640))
#img = img.transpose(2, 0, 1) # HWC→CHW
img = img.astype(np.float32) / 255.0 # 归一化
img = np.expand_dims(img, axis=0) # 加batch维度
print("=== 测试推理 ===")
outputs = rknn.inference(inputs=[img])
print(f"推理输出形状:{outputs[0].shape}") # 应输出(1, 8400, 85)
# 7. 释放资源
rknn.release()
print("=== 转换完成 ===")
if __name__ == "__main__":
main()
关键参数说明
target_platform: 指定目标硬件(如rk3566、rk3588等)。do_quantization: 启用量化可减少模型大小并提升推理速度。dataset: 量化时需提供校准数据集路径(文本文件列出样本路径)。
5、验证转换结果
以上代码中已经加了验证代码。
可以参考https://github.com/airockchip/rknn-toolkit2/tree/master/rknpu2/examples/rknn_yolov5_demo
https://gitee.com/LubanCat/lubancat_ai_manual_code
6、常见问题处理
1、板卡推理运行AttributeError: /usr/lib/librknnrt.so: undefined symbol: rknn_set_input_shapes
方法:使用 rknn-Toolkit2 的版本和板卡推理使用的 librknnrt.so 库版本保持一致。使用pip install进行升级或者降级;或者需要将librknnrt.so拷贝到对应的位置;
在linux平台上,我们需要添加librknnrt.so(鲁班猫板卡系统默认已经有,可以更新下), 该文件从 RKNPU2 的runtime/XXXX/Linux/rknn_server目录下获取,或者教程配套例程中获取。为避免其他问题,
2、关于警告
W RKNN: Output(269/271/273): size_with_stride larger than model origin size
这个警告不影响结果,是 RKNN 内存对齐的提示,输出 tensor 因为 stride 对齐导致分配内存略大于实际数据大小,正常现象。
参考文献
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)