RK3588 NPU 部署 YOLOv8 全流程

第一步:确认硬件与搭建环境
  1. 确认 NPU 型号:你的 OK3588 开发板搭载的是 Rockchip RK3588 芯片,其集成的 NPU 算力高达 6 TOPS。这是我们加速推理的硬件基础。

  2. 搭建转换环境(在 PC 端进行):模型转换需要在 x86 架构的 Linux 电脑(通常是你的 Ubuntu 开发机)上进行。我们使用你熟悉的 Conda 来创建一个独立的环境。

    # 创建 Python 3.8 环境(RKNN Toolkit 推荐)
    conda create -n rknn-env python=3.8 -y
    conda activate rknn-env
    
    # 安装必要的工具
    # RKNN Toolkit 2 是模型转换的核心工具
    pip install rknn-toolkit2==2.3.0
    # 安装 YOLOv8 环境用于导出 ONNX
    pip install ultralytics onnx onnxsim
  3. 第二步:模型转换 (YOLOv8 PyTorch → RKNN)

    这是最关键的一步,目的是将你训练好的 .pt 模型转换成 NPU 能识别的 .rknn 格式。

  4. 导出 ONNX 格式:首先,将 PyTorch 模型转换为中间格式 ONNX。

    # 在 rknn-env 环境中运行此脚本
    from ultralytics import YOLO
    
    # 加载你的模型,如果没有就用官方预训练模型 yolov8n.pt 做测试
    model = YOLO('yolov8n.pt') 
    # 导出为 ONNX,设置 opset 版本为 12
    model.export(format='onnx', opset=12)

4、ONNX 转 RKNN:编写一个 Python 脚本(如 convert_to_rknn.py)来完成最后的转换。

from rknn.api import RKNN

# 创建 RKNN 对象
rknn = RKNN(verbose=True)

# 1. 配置模型输入和量化参数
# target_platform 必须指定为 'rk3588'
rknn.config(mean_values=[[0, 0, 0]], 
            std_values=[[255, 255, 255]], 
            target_platform='rk3588')

# 2. 加载 ONNX 模型
ret = rknn.load_onnx(model='yolov8n.onnx')
if ret != 0:
    print('模型加载失败!')
    exit(ret)

# 3. 构建 RKNN 模型(do_quantization=True 表示进行 INT8 量化)
#    量化需要一个包含图像路径的 dataset.txt 文件,用于校准
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
if ret != 0:
    print('模型构建失败!')
    exit(ret)

# 4. 导出 RKNN 模型
ret = rknn.export_rknn('yolov8n_rk3588.rknn')
if ret != 0:
    print('模型导出失败!')
    exit(ret)

print('模型转换成功!')

dataset.txt 文件:这是一个文本文件,每行是一张用于量化校准的图片路径(例如 ./image1.jpg),建议准备 50-200 张有代表性的图片

第三步:在 OK3588 开发板上部署与推理

将生成的 yolov8n_rk3588.rknn 文件通过 U盘或 scp 命令传输到你的 OK3588 开发板上。

  1. 在开发板上安装运行环境

    bash

    # 在 OK3588 开发板的终端执行
    sudo apt update
    sudo apt install python3-opencv
    pip3 install rknn-runtime

    rknn-runtime 是 NPU 的推理库,比 Toolkit 轻量很多。

  2. 编写 NPU 推理脚本(处理图片/视频流):在开发板上创建 npu_detect.py

    python

    # npu_detect.py
    import cv2
    from rknnlite.api import RKNNLite
    
    # 初始化 NPU
    rknn = RKNNLite()
    ret = rknn.load_rknn('yolov8n_rk3588.rknn')
    if ret != 0:
        print('加载 RKNN 模型失败')
        exit(ret)
    rknn.init_runtime()
    
    # 打开摄像头或 RTSP 流
    # cap = cv2.VideoCapture(0)  # 本地摄像头
    cap = cv2.VideoCapture("rtsp://your_rtsp_stream_address") # 你的 RTSP 流
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
    
        # 模型推理:输入图像,得到原始输出张量
        outputs = rknn.inference(inputs=[frame])
    
        # --- 此处需要添加后处理代码 ---
        # RKNN 模型的 outputs 是原始张量,需要解析成检测框、类别和置信度。
        # 这部分逻辑可以从 rknn_model_zoo 的示例中获取。
        # print(outputs) 
        # 假设我们有一个自定义的 post_process 函数
        # boxes, classes, scores = post_process(outputs)
    
        # 绘制结果(伪代码)
        # for box, cls, score in zip(boxes, classes, scores):
        #     cv2.rectangle(frame, box[:2], box[2:], (255,0,0), 2)
        #     cv2.putText(frame, f'{cls}:{score:.2f}', ...)
        
        # 显示画面
        cv2.imshow("NPU Detection", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()
    cv2.destroyAllWindows()
    rknn.release()
第四步:针对 RTSP 流的优化建议
  1. 使用 RKNN Model Zoo 的 Demo:Rockchip 官方提供了 rknn_model_zoo,里面包含了针对 YOLOv8 优化好的 Python 和 C++ 示例代码,尤其是后处理部分,能帮你节省大量时间。建议直接参考它。

  2. 性能数据参考:根据官方示例,YOLOv8 Nano 模型在 RK3588 上通过 NPU 加速,可以达到 60+ FPS 的推理速度,处理 RTSP 流绰绰有余。

  3. 多线程处理:对于 RTSP 流,为了不丢帧,可以采用“采集线程 + 推理线程”的模式。一个线程专们负责读取视频帧,另一个或多个线程负责 NPU 推理,可以显著提高吞吐量。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐