瑞芯微RK3588芯片部署YOLO11n检测模型

发布于:2025-09-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

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()


网站公告

今日签到

点亮在社区的每一天
去签到