瑞芯微(EASY EAI)RV1126B rknn-toolkit-lite2使用方法

1. rknn-toolkit-lite2介绍

RKNN-Toolkit-Lite2 是瑞芯微(Rockchip)专为旗下RK系列芯片(如RV1126B、RK3576、RK3588等)打造的轻量级 AI 模型部署工具包,聚焦边缘 / 嵌入式设备的模型推理场景。它无需复杂的环境依赖,占用系统资源极少,核心功能是加载并运行经 RKNN 工具链转换后的AI模型,支持TensorFlow、PyTorch等主流框架导出模型的适配。该工具包提供C/C++、Python双语言API,接口简洁易用,还针对RK芯片的NPU硬件加速做了深度优化,能显著提升模型推理效率。适用于智能安防、物联网、消费电子等边缘AI场景,帮助开发者快速实现模型的端侧部署,大幅降低嵌入式AI开发门槛。

rknn-toolkit-lite2当前已经在EASY-EAI-Nano-TB完成适配,用户可以用它进行深度学习算法的纯python开发。而且同时支持已经进行了预编译的模型,短短几行代码即可完成算法的推理,大幅降低开发成本。同时很多不熟悉C/C++的算法开发人员有效降低开发门槛。本地文档是根据已经完成rknn模型转换的模型进行板卡上的推理,关于rknn模型转换请阅读请阅读《在EASY EAI Nano运行自定义的AI算法》

2. 环境搭建

2.1 安装git工具

复制代码
sudo apt update && sudo apt install git

2.2 安装miniforge3工具

为防止系统对多个不同版本的 Python 环境的需求,建议使用 miniforge3 管理 Python 环境。 检查是否安装miniforge3和 conda 版本信息,若已安装则可省略此小节步骤。

下载 miniforge3 安装包:

复制代码
cd /userdata 
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh 

若安装速度慢,可以进行网盘下载:通过网盘分享的文件:Miniforge3

安装miniforge3:

复制代码
chmod 777 Miniforge3-Linux-aarch64.sh 
bash Miniforge3-Linux-aarch64.sh 

2.3 创建Conda环境

进入Conda base环境:

复制代码
source ~/miniforge3/bin/activate

创建一个Python3.8版本(建议版本)名为RKNN-Toolkit-lite2的Conda环境:

复制代码
conda create -n RKNN-Toolkit-lite2 python=3.8

进入 RKNN-Toolkit Conda 环境:

复制代码
conda activate RKNN-Toolkit-lite2

退出Conda环境:

复制代码
conda deactivate

删除Conda环境:

复制代码
conda remove -n RKNN-Toolkit-lite2 --all

2.4 安装RKNN-Toolkit-Lite2和Opencv库

网盘下载:rknn_toolkit_lite2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

复制代码
pip install rknn_toolkit_lite2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
复制代码
pip install opencv-python

3. 在板卡测试demo

下载百度网盘rknn-toolkit-lite2*"测试程序inference_with_lite2.tar.bz2",*把文件传到EASY-EAI-Nano-TB板卡目录上。

执行以下指令进行解压:

复制代码
tar -xvf inference_with_lite2.tar.bz2

执行以下指令切换目录并执行测试程序:

复制代码
cd /userdata/inference_with_lite/ 
python test.py 

结果如下所示:

4. rknn-toolkit-lite2流程说明

4.1 使用流程图

RKNN Tookit Lite2使用流程如下:

4.2 例程

第三小节的例程如下所示:

复制代码
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from rknnlite.api import RKNNLite

# ==================== 配置项(根据你的实际情况修改) ====================
RKNN_MODEL_PATH = "10class_ResNet50_rv1126b.rknn"  # 你的RKNN模型路径
TEST_IMAGE_PATH = "./test-1.jpg"                   # 测试图片路径
INPUT_SHAPE = (224, 224)                          # 模型输入尺寸(必须和转换模型时一致)
INPUT_CHANNELS = 3                                 # 输入通道数
CLASSES = ("SUV", "bus", "family sedan", "fire engine", "heavy truck", "jeep", "minibus", "racing car", "taxi", "truck")

# ==================== 核心函数 ====================
def preprocess_image(image_path, input_shape):
    """
    图像预处理:读取→转RGB→缩放→扩展维度→转NCHW→类型转换
    返回4维NCHW格式的输入张量
    """
    # 1. 读取图像
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError(f"无法读取图片:{image_path},请检查路径是否正确!")
    print(f"原始图像shape: {img.shape}")  # 打印原始维度(H,W,C)

    # 2. BGR转RGB(OpenCV默认BGR,模型训练一般用RGB)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    print(f"RGB转换后shape: {img_rgb.shape}")

    # 3. 缩放到模型输入尺寸
    img_resized = cv2.resize(img_rgb, input_shape)
    print(f"缩放后shape: {img_resized.shape}")  # (224,224,3)

    # 4. 扩展为4维(关键!增加batch维度,N=1)
    img_4d_nhwc = np.expand_dims(img_resized, axis=0)
    print(f"扩展batch维度后shape (NHWC): {img_4d_nhwc.shape}")  # (1,224,224,3)

    # 5. 转换为NCHW格式(模型日志显示framework layout: NCHW)
    img_4d_nchw = np.transpose(img_4d_nhwc, (0, 3, 1, 2))
    print(f"转换为NCHW后shape: {img_4d_nchw.shape}")  # (1,3,224,224)

    # 6. 类型转换(RKNN Lite2推荐float32或uint8,根据模型量化类型调整)
    img_input = img_4d_nchw.astype(np.float32)
    print(f"最终输入shape: {img_input.shape}, 类型: {img_input.dtype}")
    
    return img_input

def softmax(x):
    """softmax归一化,将输出转为概率"""
    x = x - np.max(x)  # 防止数值溢出
    return np.exp(x) / np.sum(np.exp(x))

def predict(rknn_lite, input_tensor):
    """模型推理,显式指定输入格式"""
    try:
        # 显式指定data_format为NCHW(关键!告诉RKNN Runtime输入格式)
        outputs = rknn_lite.inference(
            inputs=[input_tensor],
            data_format='nchw'  # 强制指定输入格式,避免自动识别错误
        )
        return outputs
    except Exception as e:
        print(f"推理失败:{str(e)}")
        return None

# ==================== 主程序 ====================
if __name__ == "__main__":
    # 1. 初始化RKNN Lite
    rknn_lite = RKNNLite()
    print("--> 加载RKNN模型")
    ret = rknn_lite.load_rknn(RKNN_MODEL_PATH)
    if ret != 0:
        print(f"加载模型失败,错误码:{ret}")
        exit(ret)
    print("模型加载完成")

    # 2. 初始化运行时环境(核心修改:移除target参数,自动识别硬件)
    print("--> 初始化运行时")
    ret = rknn_lite.init_runtime()  # 去掉target,让系统自动识别RV1126B
    if ret != 0:
        print(f"运行时初始化失败,错误码:{ret}")
        exit(ret)
    print("运行时初始化完成")

    # 3. 图像预处理(强制生成4维输入)
    print("--> 图像预处理")
    try:
        input_tensor = preprocess_image(TEST_IMAGE_PATH, INPUT_SHAPE)
    except ValueError as e:
        print(e)
        exit(1)

    # 4. 模型推理
    print("--> 执行推理")
    outputs = predict(rknn_lite, input_tensor)
    if outputs is None or len(outputs) == 0:
        print("推理无输出!")
        rknn_lite.release()
        exit(1)

    # 5. 解析结果
    print("\n--> 推理结果解析")
    output = outputs[0][0]  # 取第一个输出的第一个batch
    prob = softmax(output)
    max_idx = np.argmax(prob)
    print(f"预测类别:{CLASSES[max_idx]}")
    print(f"置信度:{prob[max_idx]:.4f}")

    # 6. 释放资源
    rknn_lite.release()
    print("\n所有操作完成!")

5. API详细说明

5.1 RKNNLite2初始化及对象释放

在使用RKNN Toolkit Lite2时,都需要先调用RKNNLite()方法初始化一个RKNNLite对象,并在用完后调用该对象的release()方法将资源释放掉。

初始化RKNNLite对象时,可以设置verbose和verbose_file参数,以打印详细的日志信息。其中verbose参数指定是否要在屏幕上打印详细日志信息;如果设置了verbose_file参数,且verbose参数值为True,日志信息还将写到这个参数指定的文件中。

举例如下:

复制代码
# 将详细的日志信息输出到屏幕,并写到inference.log文件中 
rknn_lite = RKNNLite(verbose=True, verbose_file='./inference.log') # 只在屏幕打印详细的日志信息 
rknn_lite = RKNNLite(verbose=True) 
... 
rknn_lite.release() 

5.2 加载RKNN模型

举例如下:

复制代码
# 从当前目录加载 ResNet50模型
ret = rknn_lite.load_rknn('10class_ResNet50_pre.rknn')

5.3 初始化运行时环境

在模型推理之前,必须先初始化运行时环境,确定模型在哪一个芯片平台上运行。

举例如下:

复制代码
	# init runtime environment
	print('--> Init runtime environment')
	ret = rknn_lite.init_runtime(target=None)
	if ret != 0:
		print('Init runtime environment failed')
		exit(ret)
	print('done')

5.4 模型推理

举例如下:

以分类模型为例,如 resnet50,代码如下(完整代码参考第三小节):

复制代码
	# Inference
	print('--> Running model')
	outputs = rknn_lite.inference(inputs=[resize_img])

	print("outputs[0]:", outputs[0])
	print("outputs[0].shape:", outputs[0].shape)
	show_outputs(softmax(np.array(outputs[0][0])))

5.5 查询 SDK 版本

举例说明:

复制代码
# 获取 SDK 版本信息 
...... 
sdk_version = rknn_lite.get_sdk_version() 
......

返回的 SDK 信息如下:

相关推荐
张3232 小时前
Ansible实施任务控制
linux·ansible
白菜欣2 小时前
Linux权限
linux·运维·c++
Zlssszls2 小时前
数字孪生技术架构深度解析:从数据采集到智能决策的全栈技术体系
人工智能·机器人·具身
数智工坊2 小时前
多任务级联CNN:MTCNN人脸检测与关键点对齐全解析
人工智能·神经网络·cnn
做个文艺程序员2 小时前
ChatGPT Codex 实战指南:从安装到使用
人工智能·chatgpt
卵男(章鱼)2 小时前
系统终端命令对比大全(Linux发行/macOS/Windows)
linux·运维·服务器·windows·macos
2603_954708312 小时前
多能互补微电网:六大发展趋势,助力新型电力系统多能协同升级
人工智能·物联网·架构·系统架构·能源
数智工坊2 小时前
金字塔场景解析网络PSPNet:打通全局上下文,屠榜语义分割三大基准
网络·人工智能·深度学习·cnn
Agent产品评测局2 小时前
老旧电力系统没有API接口,Agent能不能在不改造系统的情况下分析巡检数据? —— 2026企业级智能体非侵入式落地实测与架构深度解析
人工智能·ai·chatgpt·架构