1.3 RKNN Toolkit Lite2 板端部署详解
RKNN Toolkit Lite2 板端部署详解(Python接口,适配RK356x/RK3588)
在瑞芯微(Rockchip)NPU平台开发中,RKNN Toolkit Lite2 是板端部署RKNN模型的核心工具,作为轻量级Python编程接口,它专注于模型部署落地,体积小巧、内存占用低,完美适配RK356x、RK3588等主流板卡,是嵌入式AI应用开发的必备工具。本文将详细讲解其核心功能、部署yolov5的流程及关键注意事项,新手可直接照搬操作。
一、RKNN Toolkit Lite2 核心定位
RKNN Toolkit Lite2 是 Rockchip 专为NPU平台打造的板端模型部署工具,核心作用是将提前转换好的RKNN模型,高效部署到瑞芯微系列板卡上,实现模型的快速推理。
这里需要明确两个工具的分工,避免混淆(新手必看):
-
RKNN Toolkit2:运行在PC端,核心功能是将ONNX、Caffe、TensorFlow等主流框架的模型,转换为板端可识别的RKNN模型,同时支持模型优化、量化等操作;
-
RKNN Toolkit Lite2:运行在板端(如RK356x、RK3588),仅负责RKNN模型的部署和推理,不具备模型转换功能,体积更小巧、资源占用更低,适配嵌入式板卡的资源受限场景。
简单来说:PC端用 RKNN Toolkit2 转模型,板端用 RKNN Toolkit Lite2 跑模型,两者配合完成从模型转换到部署落地的全流程。
二、板端部署核心流程(5步搞定)
RKNN Toolkit Lite2 部署RKNN模型的流程简洁固定,无论哪种瑞芯微板卡(RK356x/RK3588等),均遵循以下5个步骤,每一步都有明确的接口调用和操作目的,新手可直接对照代码实现。
步骤1:创建RKNNLite对象
首先在Python脚本中导入RKNNLite类,创建实例对象,这是后续所有操作的基础,相当于初始化部署环境。
from rknnlite.api import RKNNLite
# 创建RKNNLite对象
rknn_lite = RKNNLite()
步骤2:导入RKNN模型(关键:平台匹配)
调用 load_rknn 接口,将PC端转换好的RKNN模型导入到板端。核心注意点:导入的模型必须与当前板卡平台对应(如RK356x对应适配该平台的模型,RK3588对应其专属模型),否则会导致部署失败。
# 导入RKNN模型(替换为自己的模型路径)
ret = rknn_lite.load_rknn("model_for_rk3588.rknn") # 适配RK3588板卡
# 或 model_for_rk356x.rknn 适配RK356x板卡
if ret != 0:
print("模型导入失败!")
exit(ret)
步骤3:初始化运行时环境
调用 init_runtime 接口,初始化板端NPU的运行时环境,这一步是模型能够正常推理的前提,会自动适配板端硬件资源。
# 初始化运行时环境
ret = rknn_lite.init_runtime()
if ret != 0:
print("运行时环境初始化失败!")
exit(ret)
步骤4:模型推理与结果处理
调用 inference 接口,传入预处理后的输入数据(如图片、传感器数据等),模型会返回推理结果,后续可根据自身需求对结果进行解析、可视化等处理(如目标检测的框选、分类结果输出)。
# 假设input_data是预处理后的输入数据(如图片数组)
outputs = rknn_lite.inference(inputs=[input_data])
# 结果处理(根据自身模型需求编写,示例为打印结果)
print("推理结果:", outputs)
步骤5:释放资源(避免内存泄漏)
推理完成后,必须调用 release 接口释放RKNNLite对象,避免板端内存泄漏,尤其是在循环推理场景中,这一步不可省略。
# 释放RKNNLite对象
rknn_lite.release()
三、关键注意事项(避坑必看)
1. 板端依赖库:librknnrt.so
板端运行RKNN Toolkit Lite2 进行推理时,会自动调用板端的 runtime 库 librknnrt.so,该库是模型与NPU硬件交互的核心。
-
默认情况:板卡镜像的
/usr/lib目录下已自带该库,无需手动安装; -
更新方法:若需要更新该库(如适配新模型、修复bug),可从
rknpu2文件中获取,将最新的librknnrt.so替换到/usr/lib目录下即可。
2. 模型适配要求
导入的RKNN模型必须与板卡平台严格匹配,RK356x板卡不能使用RK3588的模型,反之亦然;同时,模型需通过RKNN Toolkit2 转换生成,确保模型格式正确。
3. 环境安装提示
板端安装RKNN Toolkit Lite2 时,需根据板卡系统的Python版本,选择对应的whl安装包(如Python3.7对应cp37版本,Python3.9对应cp39版本),同时安装依赖库(如opencv-python、numpy),避免导入模块报错。
四、完整部署示例代码
以下是适配RK3588板卡的完整部署yolov5推理示例,替换模型路径和输入数据后,可直接在板端运行:
# 导入所需依赖库(补充缺失导入,确保代码可直接运行)
from rknnlite.api import RKNNLite
import cv2
import numpy as np
# 提前定义必要的全局变量(需根据自身实际情况修改)
# 1. 各平台对应的RKNN模型路径(替换为自己的模型路径)
RK3566_RK3568_RKNN_MODEL = "model_for_rk3566_rk3568.rknn"
RK3562_RKNN_MODEL = "model_for_rk3562.rknn"
RK3588_RKNN_MODEL = "model_for_rk3588.rknn"
# 2. 测试图片路径(替换为自己的图片路径)
IMG_PATH = "test.jpg"
# 3. 模型输入尺寸(替换为自己模型的输入尺寸,YOLOv5默认640x640)
IMG_SIZE = 640
# 提前定义辅助函数(模型后处理、绘制检测结果,适配YOLOv5模型)
def yolov5_post_process(input_data):
"""
YOLOv5模型推理结果后处理函数
功能:解析模型输出的特征图,得到检测框、类别、置信度(可根据自身模型修改)
input_data:模型推理输出的原始数据
return:检测框(boxes)、类别(classes)、置信度(scores)
"""
# 此处为简化版后处理,实际使用时需替换为完整的NMS(非极大值抑制)和解码逻辑
return None, None, None
def draw(image, boxes, scores, classes):
"""
检测结果可视化函数
功能:在图片上绘制检测框、类别和置信度
image:原始图片(BGR格式)
boxes:检测框坐标(x1,y1,x2,y2)
scores:检测框置信度
classes:检测框对应的类别
"""
if boxes is None or scores is None or classes is None:
return
# 遍历所有检测结果,绘制框和文本
for box, score, cl in zip(boxes, scores, classes):
x1, y1, x2, y2 = int(box[0]), int(box[1]), int(box[2]), int(box[3])
# 绘制绿色检测框(厚度2)
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 拼接类别和置信度文本(保留2位小数)
text = f"Class:{int(cl)} Score:{score:.2f}"
# 在检测框上方绘制文本(字体、大小、绿色、厚度2)
cv2.putText(image, text, (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
def get_host():
"""
平台识别函数(核心辅助函数)
功能:自动识别当前板卡平台(RK3562/RK3566/RK3568/RK3588)
return:板卡平台名称(字符串)
"""
# 实际部署时,可通过读取板卡系统文件(如/proc/cpuinfo)识别平台
# 此处为示例实现,可根据实际板卡环境修改
import platform
host = platform.uname().machine
if "rk3566" in host or "rk3568" in host:
return "RK3566_RK3568"
elif "rk3562" in host:
return "RK3562"
elif "rk3588" in host:
return "RK3588"
else:
return "unknown"
# 主函数(程序入口,核心部署逻辑)
if __name__ == '__main__':
# 1. 自动识别当前板卡平台
host_name = get_host()
# 2. 根据平台选择对应的RKNN模型(避免手动切换模型,适配多平台)
if host_name == 'RK3566_RK3568':
rknn_model = RK3566_RK3568_RKNN_MODEL # RK3566/RK3568板卡模型
elif host_name == 'RK3562':
rknn_model = RK3562_RKNN_MODEL # RK3562板卡模型
elif host_name == 'RK3588':
rknn_model = RK3588_RKNN_MODEL # RK3588板卡模型
else:
# 平台不支持时,打印提示并退出程序
print("This demo cannot run on the current platform: {}".format(host_name))
exit(-1)
# 3. 创建RKNNLite对象(部署的基础,初始化部署环境)
rknn_lite = RKNNLite()
# 4. 导入RKNN模型(关键步骤,加载对应平台的模型)
print('--> Load RKNN model')
ret = rknn_lite.load_rknn(rknn_model) # 传入选中的模型路径
if ret != 0: # 判断模型加载是否成功(ret=0表示成功)
print('Load RKNN model failed')
exit(ret) # 加载失败则退出程序
print('done') # 加载成功提示
# 5. 初始化运行时环境(模型推理的前提,适配板端NPU)
print('--> Init runtime environment')
# 特殊处理:RK3588板卡可指定NPU核心(此处指定使用NPU核心0,提升推理效率)
# RK356x系列板卡无需指定核心,默认自动适配
if host_name == 'RK3588':
ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
else:
ret = rknn_lite.init_runtime()
if ret != 0: # 判断环境初始化是否成功
print('Init runtime environment failed!')
exit(ret) # 初始化失败则退出程序
print('done') # 初始化成功提示
# 6. 输入数据预处理(将图片处理为模型可接受的格式)
img = cv2.imread(IMG_PATH) # 读取测试图片(OpenCV默认读取为BGR格式)
# img, ratio, (dw, dh) = letterbox(img, new_shape=(IMG_SIZE, IMG_SIZE)) # 可选:letterbox缩放(保持比例)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 格式转换:BGR→RGB(模型输入要求RGB格式)
img = cv2.resize(img, (IMG_SIZE, IMG_SIZE)) # 缩放图片:适配模型输入尺寸(如640x640)
# 7. 模型推理(核心步骤,执行预测并获取结果)
print('--> Running model')
outputs = rknn_lite.inference(inputs=[img]) # 传入预处理后的图片,返回推理结果
# np.save('./onnx_yolov5_0.npy', outputs[0]) # 可选:保存推理结果,用于调试
# np.save('./onnx_yolov5_1.npy', outputs[1])
# np.save('./onnx_yolov5_2.npy', outputs[2])
print('done') # 推理完成提示
# 8. 推理结果后处理(解析模型输出,得到可用的检测结果)
input0_data = outputs[0] # 获取模型第一个输出特征图
input1_data = outputs[1] # 获取模型第二个输出特征图
input2_data = outputs[2] # 获取模型第三个输出特征图(YOLOv5通常有3个输出)
# 调整输出形状:适配YOLOv5的解码逻辑(将特征图reshape为[3, 类别数+5, H, W])
input0_data = input0_data.reshape([3, -1]+list(input0_data.shape[-2:]))
input1_data = input1_data.reshape([3, -1]+list(input1_data.shape[-2:]))
input2_data = input2_data.reshape([3, -1]+list(input2_data.shape[-2:]))
# 调整维度顺序:将[3, C, H, W]转为[H, W, 3, C],适配后处理函数
input_data = list()
input_data.append(np.transpose(input0_data, (2, 3, 0, 1)))
input_data.append(np.transpose(input1_data, (2, 3, 0, 1)))
input_data.append(np.transpose(input2_data, (2, 3, 0, 1)))
# 调用后处理函数,解析得到检测框、类别、置信度
boxes, classes, scores = yolov5_post_process(input_data)
# 9. 结果可视化与保存(将检测结果绘制到图片上)
img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 格式转换:RGB→BGR(适配OpenCV保存/显示)
if boxes is not None: # 若有检测结果,绘制到图片上
draw(img_1, boxes, scores, classes)
# 保存处理后的图片(保存路径可修改)
cv2.imwrite("out.jpg", img_1)
# cv2.imshow("post process result", img_1) # 可选:显示图片(板端无桌面环境可注释)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# 10. 释放资源(关键步骤,避免板端内存泄漏,不可省略)
rknn_lite.release()

五、总结
RKNN Toolkit Lite2 作为瑞芯微NPU板端部署的轻量级工具,核心优势是简洁、高效、资源占用低,部署流程固定且易上手。只要掌握“创建对象→导入模型→初始化环境→推理→释放资源”这5个步骤,再注意模型与板卡的匹配、librknnrt.so库的更新,就能快速完成RKNN模型的板端部署。
后续将学习RKNPU2,一种跨平台的编程接口 (C/C++)内容,关注不迷路~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)