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 信息如下:
