0 瑞芯微RK3588简介
RK3588 是瑞芯微(Rockchip)推出的新一代旗舰级 SoC(System on Chip),采用 ARM 架构,以高性能和低功耗为核心设计理念,定位于 8K 级多媒体处理、人工智能加速、边缘计算和高端工业应用 等领域。
0.1 核心架构
CPU:八核设计,包含 4× Cortex-A76 + 4× Cortex-A55,采用 big.LITTLE 架构,兼顾高性能与能效比。
GPU:内置 ARM Mali-G610 MC4,支持 OpenGL ES 3.2、Vulkan 1.2、OpenCL 2.2,能够满足高端图形渲染与游戏、多媒体应用。
NPU:集成 6 TOPS算力的 AI 加速引擎,可高效运行深度学习推理框架(如 TensorFlow、PyTorch、ONNX 等),适合边缘 AI 部署。
0.2 多媒体与显示能力
视频编解码:支持 8K@60fps H.265/H.264/VP9 视频解码,最高可达 8K 视频播放;支持 8K@30fps 编码。
多屏显示:最多可同时驱动 4 路显示输出,支持 HDMI 2.1、eDP 1.4、MIPI-DSI 等接口。
摄像头支持:具备多路 MIPI-CSI 接口,支持高像素多摄像头输入,适合机器视觉与多路视频采集。
1 安装环境
1.1 操作系统
推荐安装 Ubuntu 20.04
1.2 开发工具安装
安装 GCC 编译器、CMake 等基础开发工具,命令如下:
sudo apt update
sudo apt install gcc g++ cmake
1.3 深度学习环境
安装 YOLO 所需的 ultralytics 包:
pip install ultralytics
同时安装常用依赖:
pip install numpy opencv-python
1.4RK3588 专用 SDK 安装
RKNN-Toolkit2:用于模型转换、量化与调试
RKNN Model Zoo:包含常见模型的示例与后处理代码
1.4.1 安装RKNN-Toolkit2
pip install rknn-toolkit2 -i https://pypi.org/simple
运行下面命令验证是否安装成功:
# 进入 Python 交互模式
python
# 导入 RKNN 类
from rknn.api import RKNN
1.4.2 安装RKNN Model Zoo
##rknn_model_zoo
git clone https://github.com/airockchip/rknn_model_zoo.git
2.部署流程
2.1 模型训练与导出
在服务器或 PC 上训练 YOLO11 模型,完成后将 .pt
文件导出为 ONNX 格式:
具体的YOLO训练流程看我的其他文章有详细说明奥
from ultralytics import YOLO
# 加载预训练的 YOLO11 模型或您自己训练的模型
model = YOLO("yolov11n.pt") # 替换为您的 .pt 文件路径
# 导出模型为 ONNX 格式
model.export(format="onnx")
此时得到的 model.onnx
将作为后续转换的输入。
2.2 ONNX模型转换为 RKNN 格式:
将量化后的 ONNX 模型通过瑞芯微提供的模型转换工具转换为 RK3588 专用的 RKNN 格式,该格式能够被 NPU 直接识别和执行。
目前RK3588平台上最常用的方法是将PyTorch的pt模型转换为ONNX格式,再通过RKNN-Toolkit2工具将ONNX模型转成RKNN模型。针对YOLO11-RKNN的转换,主要需要对网络结构进行修改,重点是移除特定操作。
由于 RKNN 不支持部分 YOLO 原始算子,需要对模型结构做以下调整:
移除 后处理模块(如 NMS、DFL),这些操作改为 CPU 后处理
新增置信度输出分支,加速外部后处理
可视化检查 ONNX 结构,确认无不支持的算子
转换模型代码:
import sys
from rknn.api import RKNN
DATASET_PATH = './COCO/coco_subset_20.txt' # 量化数据集路径
DEFAULT_RKNN_PATH = './yolo11n.rknn' # 默认输出RKNN模型路径
DEFAULT_QUANT = True # 默认是否量化
def parse_arg():
"""
解析命令行参数
Returns:
model_path: ONNX模型路径
platform: 目标平台
do_quant: 是否进行量化
output_path: RKNN模型输出路径
"""
if len(sys.argv) < 3:
print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]))
print(" platform choose from [rk3562,rk3566,rk3568,rk3588,rk3576,rk1808,rv1109,rv1126]")
print(" dtype choose from [i8, fp] for [rk3562,rk3566,rk3568,rk3588,rk3576]")
print(" dtype choose from [u8, fp] for [rk1808,rv1109,rv1126]")
exit(1)
model_path = sys.argv[1]
platform = sys.argv[2]
# 根据输入参数确定是否量化
do_quant = DEFAULT_QUANT
if len(sys.argv) > 3:
model_type = sys.argv[3]
if model_type not in ['i8', 'u8', 'fp']:
print("ERROR: Invalid model type: {}".format(model_type))
exit(1)
elif model_type in ['i8', 'u8']:
do_quant = True
else:
do_quant = False
# 确定输出路径
if len(sys.argv) > 4:
output_path = sys.argv[4]
else:
output_path = DEFAULT_RKNN_PATH
return model_path, platform, do_quant, output_path
if __name__ == '__main__':
# 解析命令行参数
model_path, platform, do_quant, output_path = parse_arg()
# 创建RKNN对象
rknn = RKNN(verbose=False)
# 配置预处理参数
print('--> Config model')
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=platform)
print('done')
# 加载ONNX模型
print('--> Loading model')
ret = rknn.load_onnx(model=model_path)
if ret != 0:
print('Load model failed!')
exit(ret)
print('done')
# 构建RKNN模型
print('--> Building model')
ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)
if ret != 0:
print('Build model failed!')
exit(ret)
print('done')
# 导出RKNN模型
print('--> Export rknn model')
ret = rknn.export_rknn(output_path)
if ret != 0:
print('Export rknn model failed!')
exit(ret)
print('done')
# 释放资源
rknn.release()
运行指令:
# 用法: python convert.py model_path [rk3566|rk3588|rk3562] [i8/u8/fp] [output_path]
python convert.py ./yolo11n.onnx rk3588 i8 ./yolo11n.rknn
分别是输入路径,板子型号,精度模式和输出路径
3.推理代码
#检测任务
import cv2
import numpy as np
from rknn.api import RKNN
# 加载 RKNN 模型
rknn = RKNN()
ret = rknn.load_rknn('yolov11.rknn')
if ret != 0:
print('Load RKNN model failed!')
exit(ret)
# 初始化运行环境
ret = rknn.init_runtime()
if ret != 0:
print('Init runtime environment failed!')
exit(ret)
# 读取输入图像
img = cv2.imread('test.jpg')
img = cv2.resize(img, (640, 640)) # 调整图像尺寸为模型输入尺寸
img = img.transpose(2, 0, 1) # 转换通道顺序为 (C, H, W)
img = img.astype(np.float32) / 255.0 # 归一化处理
# 模型推理
outputs = rknn.inference(inputs=[img])
# 后处理:解析输出结果,绘制检测框
# 此处根据 YOLO 模型的输出格式进行解析,不同版本的 YOLO 输出格式略有差异
# 以下为简化示例
for output in outputs:
# 解析边界框坐标、类别和置信度
boxes = output[:, :4]
scores = output[:, 4]
classes = output[:, 5]
# 过滤低置信度结果
mask = scores > 0.5
boxes = boxes[mask]
scores = scores[mask]
classes = classes[mask]
# 绘制检测框
for box, score, cls in zip(boxes, scores, classes):
x1, y1, x2, y2 = box.astype(int)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, f'Class: {int(cls)}, Score: {score:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 保存并显示结果图像
cv2.imwrite('result.jpg', img)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 释放资源
rknn.release()