RKNN Toolkit2 开发套件(Python接口)运行在PC平台(x86/arm64),提供了模型转换、 量化功能、模型推理、性能和内存评估、量化精度分析、模型加密等功能。官方教程如下:

下载地址:瑞芯微官方 RKNN-Toolkit2工程 或 AIMC Asagrd数据中心:团队文件/AIMC_LAB/软件安装包/RKNN-TOOLKIT目录下下载。

1 rknn模型转换(以yolo v8为例)

1.1 rknn-toolkit2 X86平台安装

首先创建一个虚拟环境,rknn-toolkit2支持Python3.8~3.12。

python -m venv rknn_venv

激活虚拟环境

source rknn_venv/bin/activate
# 配置pip源
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/

跳转至官方工程根目录,目录下文件如下所示:

# ls
CHANGELOG.md  README.md     doc  rknn-toolkit-lite2  rknpu2
LICENSE       autosparsity  res  rknn-toolkit2

首先安装依赖库,依赖库在rknn-toolkit2/packages/x86_64/目录下,请根据Python版本选择对应的requirements文件。

# 安装依赖库,根据rknn-toolkit2\doc\requirements_cp38-1.4.0.txt
pip install -r rknn-toolkit2/packages/x86_64/requirements_cp312-2.3.2.txt

安装rknn_toolkit2,根据系统的python版本和架构(最新版本支持arm64和x86)选择不同的whl文件安装

pip install rknn-toolkit2/packages/x86_64/rknn_toolkit2-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Installing collected packages: rknn-toolkit2
Successfully installed rknn-toolkit2-2.3.2

检测是否安装成功:

(rknn_venv) root@aimc-AI:/home/aimc/Project/rknn/rknn-toolkit2# python
Python 3.12.3 (main, Jan 22 2026, 20:57:42) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rknn.api import RKNN
>>> 

输入quit()或者使用快捷键Ctrl+D退出。

这小节熟悉下Toolkit-lite2工具,该工具在PC平台上使用,提供python接口简化模型的部署和运行。 用户通过该工具可以便捷地完成一些功能:

模型转换,Toolkit-lite2工具导入原始的Caffe、TensorFlow、TensorFlow Lite、ONNX、Pytorch、MXNet等模型转换成RKNN模型(), 也支持导入RKNN模型然后在NPU平台 上加载推理等。

量化功能,支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化(asymmetric_quantized-8),并支持混合量化功能。

模型推理,能够在PC上模拟NPU运行RKNN模型并获取推理结果;或将RKNN模型分发到指定的NPU设备上进行推理并获取推理结果。

性能和内存评估,连接板卡,将RKNN模型分发到指定NPU设备上运行,然后评估模型在实际设备上运行时的性能和内存占用情况。

量化精度分析,该功能将给出模型量化后每一层推理结果与浮点模型推理结果的余弦距离,以分析量化误差是如何出现的,为提高量化模型的精度提供思路。

模型加密功能,使用指定的加密等级将RKNN模型整体加密,因为RKNN模型的解密是在NPU驱动中完成的,所以使用加密模型时,与普通RKNN模型一样加载即可,NPU驱动会自动对其进行解密。

使用Toolkit-lite2,可以运行在PC上,通过模拟器运行模型,然后进行推理,或者模型转换等操作;也可以运行在连接的板卡NPU上, 将RKNN模型传到NPU设备上运行,再从NPU设备上获取推理结果、性能信息等等。

1.2 以yolo v8为例进行模型转换

RKNN-Toolkit2提供了丰富的功能,包括模型转换、性能分析、部署调试等。本节将重点介绍RKNNToolkit2的模型转换功能。模型转换是RKNN-Toolkit2的核心功能之一,它允许用户将各种不同框架的深度学习模型转换为RKNN格式以在RKNPU上运行。用户可参考如下模型转换流程图以理解如何进行模型转换。

首先获取yolo v8权重文件,可以使用官方预训练pt文件,或自行训练(或者使用AIMC YOLO在线训练平台)

示例 yolo v8n模型(输出12个类别)

1.2.1 将pytorch模型转换为中间格式ONNX

在转换yolo v8/11模型时,推荐使用RK官方修改后的代码RK 平台下的 YOLOv8,并不能直接使用 Ultralytics 原始导出的 ONNX。

原因在于:
瑞芯微官方对 YOLOv8 的输出结构做了针对 NPU 的修改。

瑞芯微提供的YOLOV8工程地址:https://github.com/airockchip/ultralytics_yolov8

RK官方的解释为:

在基于不影响输出结果, 不需要重新训练模型的条件下, 有以下改动:

修改输出结构, 移除后处理结构. (后处理结果对于量化不友好)

dfl 结构在 NPU 处理上性能不佳,移至模型外部的后处理阶段,此操作大部分情况下可提升推理性能。

模型输出分支新增置信度的总和,用于后处理阶段加速阈值筛选。

训练阶段:仍然可以使用 Ultralytics 官方 YOLOv8

导出 / 部署阶段:切换到瑞芯微官方 YOLOv8 工程

首先复制瑞芯微官方yolo v8文件中的ultralytics文件夹至工作目录下,使用如下程序引用该库

import numpy as np
from ultralytics import YOLO
import matplotlib.pyplot as plt
from PIL import Image
import cv2
import shutil
import os
 
model = YOLO("/home/aimc/Project/rknn/test/model.pt")
 
# 导出模型
result = model.export(format='rknn')

运行后命令行状态如下:

(rknn_venv) root@aimc-AI:/home/aimc/Project/rknn# python test/rknn_transfer_yolov8.py 
Ultralytics YOLOv8.2.82 🚀 Python-3.12.3 torch-2.3.1+cpu CPU (unknown)
Model summary (fused): 168 layers, 3,008,183 parameters, 0 gradients, 8.1 GFLOPs

PyTorch: starting from '/home/aimc/Project/rknn/test/model.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) ((1, 64, 80, 80), (1, 13, 80, 80), (1, 1, 80, 80), (1, 64, 40, 40), (1, 13, 40, 40), (1, 1, 40, 40), (1, 64, 20, 20), (1, 13, 20, 20), (1, 1, 20, 20)) (5.9 MB)

RKNN: starting export with torch 2.3.1+cpu...

RKNN: feed /home/aimc/Project/rknn/test/model.onnx to RKNN-Toolkit or RKNN-Toolkit2 to generate RKNN model.
Refer https://github.com/airockchip/rknn_model_zoo/tree/main/models/CV/object_detection/yolo
RKNN: export success ✅ 0.2s, saved as '/home/aimc/Project/rknn/test/model.onnx' (11.5 MB)

Export complete (0.5s)
Results saved to /home/aimc/Project/rknn/test
Predict:         yolo predict task=detect model=/home/aimc/Project/rknn/test/model.onnx imgsz=640  
Validate:        yolo val task=detect model=/home/aimc/Project/rknn/test/model.onnx imgsz=640 data=/home/aimc/SERVER/yolo_web/YoloUltralyticsWeb/static/datasets/1/data.yaml  
Visualize:       https://netron.app

1.2.2 ONNX转为RKNN

def onnx2rknn(
    onnx_model_path: str,
    output_rknn_path: str,
    target_platform: str = "rk3588",
    do_quantization: bool = True,
    dataset_path: str = None,
    mean_values: list = None,
    std_values: list = None,
    quant_img_RGB2BGR: bool = False,
    quantized_algorithm: str = "normal",
    quantized_method: str = "channel",
    optimization_level: int = 3,
    verbose: bool = True,
    verbose_file: str = None
) -> bool:
    """
    基于 RKNN SDK V2.3.2 实现 ONNX 模型转 RKNN 模型

    参考手册章节:3.1 模型转换、6 量化说明
    支持功能:模型转换、INT8量化、自定义归一化参数、目标平台指定

    Args:
        onnx_model_path: ONNX模型文件路径(必填)
        output_rknn_path: 输出RKNN模型路径(必填)
        target_platform: 目标硬件平台(可选,默认rk3588,支持列表见手册1.3)
                        支持值:rk2118、rk3562、rk3566、rk3568、rk3576、rk3588、
                               rv1103、rv1103b、rv1106、rv1106b、rv1126b
        do_quantization: 是否开启INT8量化(可选,默认True)
        dataset_path: 量化校正集路径(do_quantization=True时必填,格式见手册3.1.4)
                      校正集为txt文件,每行是图片路径(jpg/png/bmp/npy)
        mean_values: 输入均值归一化参数(可选,默认None,格式:[[c1, c2, c3]])
        std_values: 输入标准差归一化参数(可选,默认None,格式:[[c1, c2, c3]])
        quant_img_RGB2BGR: 量化时是否将RGB转BGR(可选,默认False,仅量化时生效)
        quantized_algorithm: 量化算法(可选,默认normal,支持normal/kl_divergence/mmse)
        quantized_method: 量化方式(可选,默认channel,支持layer/channel)
        optimization_level: 模型优化等级(可选,默认3,0=关闭所有优化,3=开启所有优化)
        verbose: 是否打印详细日志(可选,默认True)
        verbose_file: 日志输出文件(可选,默认None,verbose=True时生效)

    Returns:
        bool: 转换成功返回True,失败返回False
    """
    # 1. 校验必填参数
    if not os.path.exists(onnx_model_path):
        print(f"错误:ONNX模型文件不存在 -> {onnx_model_path}")
        return False
    if do_quantization and (dataset_path is None or not os.path.exists(dataset_path)):
        print(f"错误:量化模式下必须提供有效校正集路径 -> {dataset_path}")
        return False

    # 2. 初始化RKNN对象(手册3.1.1)
    rknn = RKNN(
        verbose=verbose,
        verbose_file=verbose_file
    )

    try:
        # 3. 模型转换配置(手册3.1.2、6.2)
        print("-> 配置模型转换参数")
        config_params = {
            "target_platform": target_platform,
            "quant_img_RGB2BGR": quant_img_RGB2BGR,
            "quantized_algorithm": quantized_algorithm,
            "quantized_method": quantized_method,
            "optimization_level": optimization_level,
            "quantized_dtype": "asymmetric_quantized-8"  # 仅支持INT8量化(手册6.2.1)
        }
        # 添加归一化参数(若有)
        if mean_values is not None:
            config_params["mean_values"] = mean_values
        if std_values is not None:
            config_params["std_values"] = std_values
        
        ret = rknn.config(**config_params)
        if ret != 0:
            print(f"错误:模型配置失败,返回码 -> {ret}")
            return False

        # 4. 加载ONNX模型(手册3.1.3)
        print(f"-> 加载ONNX模型:{onnx_model_path}")
        ret = rknn.load_onnx(model=onnx_model_path)
        if ret != 0:
            print(f"错误:ONNX模型加载失败,返回码 -> {ret}")
            return False

        # 5. 构建RKNN模型(手册3.1.4)
        print("-> 构建RKNN模型(量化模式:{})".format("开启" if do_quantization else "关闭"))
        build_params = {
            "do_quantization": do_quantization,
        }
        if do_quantization:
            build_params["dataset"] = dataset_path
        ret = rknn.build(**build_params)
        if ret != 0:
            print(f"错误:RKNN模型构建失败,返回码 -> {ret}")
            return False

        # 6. 导出RKNN模型(手册3.1.5)
        print(f"-> 导出RKNN模型:{output_rknn_path}")
        ret = rknn.export_rknn(export_path=output_rknn_path)
        if ret != 0:
            print(f"错误:RKNN模型导出失败,返回码 -> {ret}")
            return False

        print("=" * 50)
        print(f"ONNX转RKNN成功!")
        print(f"输入ONNX:{onnx_model_path}")
        print(f"输出RKNN:{output_rknn_path}")
        print(f"目标平台:{target_platform}")
        print(f"量化模式:{'开启' if do_quantization else '关闭'}")
        print("=" * 50)
        return True

    except Exception as e:
        print(f"错误:转换过程中发生异常 -> {str(e)}")
        return False
    finally:
        # 7. 释放RKNN对象资源(手册3.1.1)
        print("-> 释放RKNN资源")
        rknn.release()

以上为从onnx转换为rknn所需函数。环境依赖如下:

certifi==2026.1.4
charset-normalizer==3.4.4
contourpy==1.3.3
cycler==0.12.1
fast-histogram==0.14
filelock==3.20.3
flatbuffers==25.12.19
fonttools==4.61.1
fsspec==2026.2.0
idna==3.11
Jinja2==3.1.6
kiwisolver==1.4.9
MarkupSafe==3.0.3
matplotlib==3.10.8
ml_dtypes==0.5.4
mpmath==1.3.0
networkx==3.6.1
numpy==1.26.4
nvidia-cublas==13.0.0.19
nvidia-cublas-cu12==12.1.3.1
nvidia-cuda-cupti==13.0.48
nvidia-cuda-cupti-cu12==12.1.105
nvidia-cuda-nvrtc==13.0.48
nvidia-cuda-nvrtc-cu12==12.1.105
nvidia-cuda-runtime==13.0.48
nvidia-cuda-runtime-cu12==12.1.105
nvidia-cudnn-cu12==9.1.0.70
nvidia-cudnn-cu13==9.13.0.50
nvidia-cufft==12.0.0.15
nvidia-cufft-cu12==11.0.2.54
nvidia-cufile==1.15.0.42
nvidia-curand==10.4.0.35
nvidia-curand-cu12==10.3.2.106
nvidia-cusolver==12.0.3.29
nvidia-cusolver-cu12==11.4.5.107
nvidia-cusparse==12.6.2.49
nvidia-cusparse-cu12==12.1.0.106
nvidia-cusparselt-cu13==0.8.0
nvidia-nccl-cu12==2.20.5
nvidia-nccl-cu13==2.27.7
nvidia-nvjitlink==13.0.39
nvidia-nvjitlink-cu12==12.9.86
nvidia-nvshmem-cu13==3.3.24
nvidia-nvtx==13.0.39
nvidia-nvtx-cu12==12.1.105
onnx==1.16.1
onnxruntime==1.24.1
opencv-python==4.11.0.86
packaging==26.0
pandas==3.0.0
pillow==12.1.1
polars==1.38.1
polars-runtime-32==1.38.1
protobuf==4.25.4
psutil==7.2.2
pyparsing==3.3.2
python-dateutil==2.9.0.post0
PyYAML==6.0.3
requests==2.32.5
ruamel.yaml==0.19.1
scipy==1.17.0
setuptools==79.0.1
six==1.17.0
sympy==1.14.0
torch==2.3.1+cpu
torchaudio==2.3.1+cpu
torchvision==0.18.1+cpu
tqdm==4.67.3
triton==3.5.0
typing_extensions==4.15.0
ultralytics==8.4.14
ultralytics-thop==2.0.18
urllib3==2.6.3
wheel==0.46.3

Avatar photo

作者 skyate

发表回复