参考文章:
MrHarsh10/tspi_-RKNN_MobileNetV3: 将mobliebetv3转换成RKNN部署到泰山派上
3. RKNN Toolkit2介绍 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档

首先:我用的所有配置,一台虚拟机Ubuntu部署RKNN转换  一台泰山派  

一、前言:泰山派与 RKNN 生态介绍

嘉立创泰山派搭载瑞芯微RK3566 处理器,内置 0.8TOPS 算力的嵌入式神经网络处理器(NPU),支持低功耗、高并行的神经网络运算,非常适合边缘端 AI 推理场景。瑞芯微提供完整的 RKNN 工具链支持:

  • RKNPU2:NPU 运行库与编程接口,负责板端模型推理;(安装在泰山派上)
  • RKNN Toolkit2:PC 端开发工具,支持模型转换(TensorFlow/PyTorch/ONNX 等→RKNN)、量化、性能评估;(安装在虚拟机上)
  • RKNN Toolkit Lite2:板端轻量工具,用于部署 RKNN 模型并执行推理。

本教程以MobileNetV3 图像分类模型(猫 / 牛 / 狗 / 马 / 猪 5 分类) 为例,完整覆盖 “模型训练→RKNN 转换→泰山派部署” 全流程。

(这个是他给的例子:这里面的image有MrHarsh10/tspi_-RKNN_MobileNetV3: 将mobliebetv3转换成RKNN部署到泰山派上​​​​​​​z

这里面的image有)

二、第一步:Ubuntu端基础环境搭建(训练 + 模型转换)

Ubuntu端需满足:Linux 系统(推荐 Ubuntu 20.04,模型转换仅支持 Linux)、高性能 CPU/GPU(训练加速)、已安装 Miniconda。

2.1 Miniconda 安装与换源

Miniconda 用于创建隔离的 Python 环境,避免依赖冲突。

  1. 下载安装 MinicondaMiniconda 官网下载 Linux-x86_64 版本,或用命令直接下载:

    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    bash Miniconda3-latest-Linux-x86_64.sh  # 按提示安装,默认路径即可
    source ~/.bashrc  # 激活conda(仅Linux生效,Windows用Anaconda Prompt)
    
  2. conda 与 pip 换源(国内加速)避免下载依赖超时,配置清华 / 阿里云镜像:

    # conda换清华源
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --set show_channel_urls yes
    
    # pip换阿里云源(临时生效,也可配置永久文件)
    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
    

2.2 模型训练环境搭建(MobileNetV3)

  1. 创建并激活训练环境基于 Python 3.10 创建环境(兼容多数 AI 库):

    conda create -n mobilenet python=3.10 -y
    conda activate mobilenet  # 激活环境
    
  2. 安装 PyTorch 与依赖库前往PyTorch 官网,根据 PC 是否有 GPU 选择命令(示例为 GPU 版本,无 GPU 则选 CPU 版本):

  3. 教程:(已安装可忽略)

  4. https://liumin.blog.csdn.net/article/details/130204986?fromshare=blogdetail&sharetype=blogdetail&sharerId=130204986&sharerefer=PC&sharesource=2301_80317247&sharefrom=from_link

  5. # GPU版本(需提前安装NVIDIA CUDA 11.8)
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    # CPU版本
    # pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
    
    # 安装其他依赖(数据集处理、模型保存等)
    pip install opencv-python numpy pandas tqdm
    
  6. 准备 5 分类数据集数据集结构如下(需自行收集或下载公开动物数据集):
    作者提供的文件夹内image已经有了MrHarsh10/tspi_-RKNN_MobileNetV3: 将mobliebetv3转换成RKNN部署到泰山派上

    dataset/
    ├─ cat/          # 猫的图片(至少50张,越多训练效果越好)
    │  ├─ 001.jpg
    │  └─ ...
    ├─ cattle/       # 牛的图片
    ├─ dog/          # 狗的图片
    ├─ horse/        # 马的图片(注意原文档笔误为house,需修正)
    └─ pig/          # 猪的图片
    
  7. 执行文件里面的模型训练train.py(核心逻辑:加载 MobileNetV3、定义损失函数 / 优化器、迭代训练),示例核心代码:

    # conversion/convert_to_rknn.py
    import os
    import numpy as np
    from rknn.api import RKNN
    import json
    
    class ModelConverter:
        def __init__(self, target_platform='rk3566'):
            self.target_platform = target_platform
        
        def convert_mobilenetv3(self, pt_model_path, output_rknn_path, input_size=224):
            """
            转换MobileNetV3模型为RKNN格式
            """
            print("=== 开始模型转换 ===")
            
            # 初始化RKNN
            rknn = RKNN(verbose=True)
            
            try:
                # 配置模型
                print('--> Config model')
                ret = rknn.config(
                    mean_values=[[123.675, 116.28, 103.53]],
                    std_values=[[58.395, 58.395, 58.395]], 
                    target_platform=self.target_platform,
                    quantized_dtype='asymmetric_quantized-8'
                )
                if ret != 0:
                    print('Config model failed!')
                    return False
                print('Config done')
                
                # 加载PyTorch模型
                print('--> Loading model')
                ret = rknn.load_pytorch(
                    model=pt_model_path, 
                    input_size_list=[[1, 3, input_size, input_size]]
                )
                if ret != 0:
                    print('Load model failed!')
                    return False
                print('Load model done')
                
                # 构建模型
                print('--> Building model')
                ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
                if ret != 0:
                    print('Build model failed!')
                    # 尝试不使用量化
                    print('尝试不使用量化...')
                    ret = rknn.build(do_quantization=False)
                    if ret != 0:
                        return False
                print('Build model done')
                
                # 导出RKNN模型
                print('--> Export rknn model')
                ret = rknn.export_rknn(output_rknn_path)
                if ret != 0:
                    print('Export rknn model failed!')
                    return False
                print('Export model done')
                
                print(f"转换成功!模型已保存为: {output_rknn_path}")
                return True
                
            except Exception as e:
                print(f"转换过程中出错: {e}")
                return False
            finally:
                rknn.release()
        
        def create_dataset_file(self, image_dir, output_file='dataset.txt', num_images=100):
            """
            创建量化数据集文件
            """
            import cv2
            from pathlib import Path
            
            image_paths = list(Path(image_dir).rglob('*.jpg')) + \
                         list(Path(image_dir).rglob('*.png')) + \
                         list(Path(image_dir).rglob('*.jpeg'))
            
            with open(output_file, 'w') as f:
                for img_path in image_paths[:num_images]:
                    f.write(f"{img_path}\n")
            
            print(f"创建数据集文件: {output_file}, 包含 {min(len(image_paths), num_images)} 张图片")
    
    if __name__ == '__main__':
        converter = ModelConverter(target_platform='rk3566')
        
        # 创建量化数据集
        converter.create_dataset_file('../dataset/train', 'dataset.txt')
        
        # 转换模型
        success = converter.convert_mobilenetv3(
            pt_model_path='../training/MobileNetV3.pt',
            output_rknn_path='mobilenetv3.rknn',
            input_size=224
        )
        
        if success:
            print("🎉 模型转换成功!")
        else:
            print("❌ 模型转换失败!")

    运行训练脚本:

    python train.py
    

    训练完成后,会生成mobilenetv3.pth模型权重文件。

2.3 RKNN 模型转换(PC 端 Ubuntu)

需将 PyTorch 模型转换为 RKNN 格式(泰山派 NPU 支持的唯一格式),依赖RKNN Toolkit2,且必须在 Linux 环境执行。

  1. 创建 RKNN 转换环境

    conda create -n rknn python=3.10 -y
    conda activate rknn  # 激活转换环境
    
  2. 克隆 RKNN Toolkit2 仓库

    git clone https://github.com/rockchip-linux/rknn-toolkit2.git
    cd rknn-toolkit2
    (也可以直接浏览器下载解压,终端指令太麻烦)
    也可以这个链接:git clone https://gitee.com/LubanCat/lubancat_ai_manual_code.git 里面是一样的
    我用的就这个你再改名rknn-toolkit2
  3. 安装依赖与 Toolkit2根据 Python 版本选择依赖文件(此处为 Python 3.10,对应requirements_cp310-1.6.0.txt,如果是python 3.8就选择requirements_cp38-1.6.0.txt):

    # 安装依赖(换阿里云源加速)
    pip install -r rknn-toolkit2/packages/requirements_cp310-1.6.0.txt -i https://mirrors.aliyun.com/pypi/simple/
    
    # 安装Toolkit2 wheel包(x86_64架构,Ubuntu系统)
    cd rknn-toolkit2/packages/
    pip install rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl
    
  4. 编写 PT 转 RKNN 脚本(pt2rknn.py)核心逻辑:加载 PyTorch 模型、配置转换参数、构建 RKNN 模型、导出文件。注意关闭整型量化(实验表明精度损失严重):

    import numpy as np
    import numpy as np
    import cv2
    from rknn.api import RKNN
    import os
    import torch
    
    import os
    
    
    
    
    def show_outputs(output):
        index = sorted(range(len(output)), key=lambda k : output[k], reverse=True)
        fp = open('./labels.txt', 'r')
        labels = fp.readlines()
        top5_str = 'mobilenetv3\n-----TOP 5-----\n'
        for i in range(5):
            value = output[index[i]]
            if value > 0:
                topi = '[{:>3d}] score:{:.6f} class:"{}"\n'.format(index[i], value, labels[index[i]].strip().split(':')[-1])
            else:
                topi = '[ -1]: 0.0\n'
            top5_str += topi
        print(top5_str.strip())
    
    
    def show_perfs(perfs):
        perfs = 'perfs: {}\n'.format(perfs)
        print(perfs)
    
    
    def softmax(x):
        return np.exp(x)/sum(np.exp(x))
    
    
    if __name__ == '__main__':
    
    
        rknn = RKNN(verbose=True)
    
        # Pre-process config
        input_size_list = [[1, 3, 224, 224]]
        print('--> Config model')
        rknn.config(mean_values=[123.675, 116.28, 103.53], std_values=[58.395, 58.395, 58.395], target_platform='rk3566')
        print('done')
    
        # Load model
        print('--> Loading model')
        ret = rknn.load_pytorch(model="./MobileNetV3.pt", input_size_list=input_size_list)
        if ret != 0:
            print('Load model failed!')
            exit(ret)
        print('done')
    
        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=False, dataset='./dataset.txt')
        if ret != 0:
            print('Build model failed!')
        print('done')
    
        # Export rknn model
        print('--> Export rknn model')
        ret = rknn.export_rknn('./tspi_moblienetv3_demo.rknn')
        if ret != 0:
            print('Export rknn model failed!')
            exit(ret)
        print('done')
    
        img = cv2.imread('./demo_pig.jpg')
        
        # 调整图片大小为模型所需大小
        img = cv2.resize(img, (224, 224))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = np.expand_dims(img, 0)
    
        # Init runtime environment
        print('--> Init runtime environment')
        ret = rknn.init_runtime()
        if ret != 0:
            print('Init runtime environment failed!')
            exit(ret)
        print('done')
    
        # Inference
        print('--> Running model')
        outputs = rknn.inference(inputs=[img], data_format=['nhwc'])
        print(outputs)
        show_outputs(softmax(np.array(outputs[0][0])))
        print('done')
    
        rknn.release()

    说明:dataset.txt为量化校正数据集路径文件,每行对应一张图片路径(关闭量化时可省略,但若开启需准备)。

  5. 执行模型转换mobilenetv3.pth复制到当前目录,运行脚本:

    python pt2rknn.py
    

    转换成功后,会生成mobilenetv3.rknn文件(后续部署到泰山派的核心文件)。

三、第二步:泰山派板端部署环境搭建

泰山派需安装官方 Debian10 镜像(Ubuntu 镜像存在兼容性问题),流程分为:镜像烧录→远程连接→环境配置→驱动安装。

3.1 准备工作:烧录 Debian10 镜像

  1. 下载镜像从嘉立创泰山派官网下载官方 Debian10 镜像(如TaishanPi_Debian10_202405.img)。
  2. 烧录工具使用BalenaEtcher(跨平台),选择镜像、SD 卡(建议 16GB 以上),点击 “Flash” 烧录。
  3. 启动板卡将 SD 卡插入泰山派,连接电源、网线(或 WiFi),启动板卡。

3.2 远程连接泰山派(PC 端 MobaXterm)

  1. 查询泰山派 IP若板卡连接显示器,可通过ifconfig查看 IP(如eth0网卡的inet地址,通常为192.168.x.x);若无显示器,可通过路由器管理页查看设备 IP。
  2. 远程连接打开 MobaXterm,点击 “Session”→“SSH”,输入泰山派 IP(如192.168.1.100),用户名默认debian,密码默认taishanpi,点击 “OK” 连接。

3.3 板端基础环境配置

  1. 更新系统软件

    sudo apt update && sudo apt upgrade -y
    
  2. 安装 Miniconda(ARM 架构)泰山派为 ARM64 架构,需下载对应版本的 Miniconda:

    # 创建目录并下载Miniconda
    mkdir -p ~/miniconda3
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O ~/miniconda3/miniconda.sh
    # 安装Miniconda
    bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
    rm -rf ~/miniconda3/miniconda.sh  # 删除安装包
    # 激活conda
    ~/miniconda3/bin/conda init bash
    source ~/.bashrc  # 生效配置
    
  3. conda 换源(ARM 架构适配)配置清华源,避免下载依赖超时:

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --set show_channel_urls yes
    

3.4 安装 NPU 驱动与 RKNN Lite2

  1. 下载 RKNPU2(NPU 运行库)由于板端 git 下载较慢,建议先在 PC 端下载RKNPU2 仓库,再通过 MobaXterm 的 “SFTP” 功能上传到泰山派~/目录。

  2. 复制驱动文件到系统目录RK3566 对应RK356X目录,执行以下命令:

    cd ~/rknnpu2  # 进入上传的RKNPU2目录
    # 复制rknn_server(NPU服务进程)
    sudo cp runtime/RK356X/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
    # 复制NPU运行库(librknnrt.so、librknn_api.so)
    sudo cp runtime/RK356X/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/
    sudo cp runtime/RK356X/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/
    # 启动rknn_server服务
    bash runtime/RK356X/Linux/rknn_server/aarch64/usr/bin/start_rknn.sh
    
  3. 创建板端推理环境并安装 RKNN Lite2

    # 创建并激活环境
    conda create -n rknn_lite python=3.10 -y
    conda activate rknn_lite
    
    # 安装依赖(编译工具与OpenCV)
    sudo apt install gcc -y
    pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/
    
    # 安装RKNN Toolkit Lite2(ARM64版本)
    # 从PC端下载Lite2的wheel包:https://github.com/rockchip-linux/rknn-toolkit2/tree/master/rknn_toolkit_lite2/packages
    # 选择对应Python 3.10的ARM64包(如rknn_toolkit_lite2-1.6.0-cp310-cp310-linux_aarch64.whl)
    # 通过SFTP上传到泰山派,然后安装:
    pip install rknn_toolkit_lite2-1.6.0-cp310-cp310-linux_aarch64.whl -i https://mirrors.aliyun.com/pypi/simple/
    

四、第三步:泰山派模型推理测试

将 PC 端转换好的mobilenetv3.rknn通过 SFTP 上传到泰山派~/目录,编写推理脚本test.py

4.1 推理脚本编写(test.py)

核心逻辑:加载 RKNN 模型、读取测试图片、预处理、推理、输出分类结果。

import cv2
import numpy as np
from rknnlite.api import RKNNLite
INPUT_SIZE = 224
RK3566_MODEL = 'tspi_moblienetv3_demo.rknn'
labels=["cat","cattle","dog","house","pig"]
def show_top5(result):
    output = result[0].reshape(-1)
    labels=["cat","cattle","dog","house","pig"]
    # Softmax
    output = np.exp(output) / np.sum(np.exp(output))
    # Get the indices of the top 5 largest values
    output_sorted_indices = np.argsort(output)[::-1][:5]
    top5_str = '-----TOP 5-----\n'
    for i, index in enumerate(output_sorted_indices):
        value = output[index]
        if value > 0:
            topi = '[{:>3d}] score:{:.6f} class:"{}"\n'.format(index, value, labels[index])
        else:
            topi = '-1: 0.0\n'
        top5_str += topi
    print(top5_str)


if __name__ == '__main__':



    rknn_lite = RKNNLite()
    # Load RKNN model
    print('--> Load RKNN model')
    ret = rknn_lite.load_rknn(RK3566_MODEL)
    if ret != 0:
        print('Load RKNN model failed')
        exit(ret)
    print('done')


    ori_img = cv2.imread('./demo_cat.jpg')
    img = cv2.cvtColor(ori_img, cv2.COLOR_BGR2RGB)
    img = np.expand_dims(img, 0)
    # Init runtime environment
    print('--> Init runtime environment')
    ret = rknn_lite.init_runtime()
    if ret != 0:
        print('Init runtime environment failed')
        exit(ret)
    print('done')

    # Inference
    print('--> Running model')
    outputs = rknn_lite.inference(inputs=[img])

    # Show the classification results
    show_top5(outputs)
    print('done')

    rknn_lite.release()

4.2 运行推理脚本

  1. 准备测试图片从网上下载一张动物图片(如狗的图片),命名为test_dog.jpg,通过 SFTP 上传到泰山派~/目录。

  2. 执行推理

    conda activate rknn_lite  # 激活推理环境
    python test.py
    
  3. 查看结果若推理成功,会输出类似以下内容:

    --> 加载RKNN模型
    加载模型完成
    --> 初始化NPU环境
    初始化NPU环境完成
    --> 预处理图片
    预处理图片完成
    --> 执行推理
    推理完成
    --> 解析结果
    预测结果:dog,置信度:0.9876
    

五、进阶:模型性能评估

若需评估模型在泰山派 NPU 上的推理速度、内存占用,可通过 RKNN Toolkit2 的eval_perfeval_memory接口实现(需 PC 与板卡通过 ADB 连接)。

5.1 板端启动 ADB 服务

# 安装ADB(若未安装)
sudo apt install adb -y
# 启动ADB服务
adb start-server
# 查看ADB设备(确保PC与板卡同局域网)
adb devices

5.2 PC 端执行性能评估

在 PC 的 RKNN Toolkit2 环境中,编写评估脚本eval_perf.py

from rknn.api import RKNN

# 1. 初始化RKNN
rknn = RKNN(verbose=True)

# 2. 加载RKNN模型
ret = rknn.load_rknn("mobilenetv3.rknn")
if ret != 0:
    exit(ret)

# 3. 连接泰山派(device_id为ADB设备ID,如192.168.1.100:5555)
ret = rknn.init_runtime(target="rk3566", device_id="192.168.1.100:5555", perf_debug=True, eval_mem=True)
if ret != 0:
    exit(ret)

# 4. 评估推理性能(耗时)
print("--> 评估推理性能")
rknn.eval_perf()

# 5. 评估内存占用
print("--> 评估内存占用")
rknn.eval_memory()

# 6. 释放资源
rknn.release()

运行脚本后,会输出模型的推理耗时(如单张图片推理时间)、NPU 内存占用(如权重内存、张量内存)等信息。

六、常见问题与解决方法

  1. 模型转换失败:检查 PyTorch 模型结构与权重是否匹配,ONNX 导出的 opset 版本是否为 11 或 12,Toolkit2 依赖是否安装完整。
  2. 板端 NPU 初始化失败:确认rknn_server已启动,驱动文件(librknnrt.so)路径正确,Debian10 镜像版本是否为官方最新。
  3. 推理结果错误:检查图片预处理是否与训练时一致(尺寸、归一化、通道顺序),标签顺序是否与数据集一致。
  4. 远程连接失败:确认泰山派 IP 正确,网线 / WiFi 连接正常,防火墙未拦截 SSH 端口(22 端口)。

七、总结

本教程完整覆盖了嘉立创泰山派 RKNN 模型部署的全流程:从 PC 端的模型训练、RKNN 转换,到板端的环境配置、NPU 驱动安装、推理测试。核心关键点在于:

  • 模型转换时关闭整型量化,避免精度损失;
  • 板端必须使用官方 Debian10 镜像,确保 NPU 驱动兼容性;
  • 图片预处理需与训练时严格一致,否则推理结果会偏差。

通过本教程,你可以快速掌握泰山派 NPU 的使用方法,并将其扩展到目标检测(如 YOLOv5)、语义分割等更复杂的 AI 任务。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐