admin 管理员组文章数量: 1184232
目录
最近更新 2025年12月6日
2025年12月2日
1.模型准备
1.1 下载官方工具链
注意:PyTorch 模型(.pt/.pth)需要先转换为ONNX模型(.onnx)才可转换为RKNN模型
1.2 RK3568联网
2025年12月4日
1.3 Linux端配置与模型转换
1.3.1 Linux联网
1.3.2 传输模型和工具链到linux
1.3.3 RKNN-Toolkot2版本选择与依赖安装
1.3.4 模型转换前置配置
2025年12月6日
1.3.4 模型转换前置配置 (续)
1.3.5 模型转换
2. RK3568 NPU推理速度测试
2.1 前置准备
2.2模型推理测试
2.3 目前已知可能发生的问题的解决方法
2.3.1 安装在rk3568上的 rknn_Toolkits2 版本与模型转换时的版本不同
最近更新 2025年12月4日
本文章仅作为开发日志,并不具备较高的学习意义与参考价值
最近更新 2025年12月6日
2025年12月2日
1.模型准备
1.1 下载官方工具链
调用RK3568的NPU需要使用专有的 RKNN 模型,可通过瑞芯微官方工具链RKNN Toolkit2转换主流深度学习框架的模型(Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet和PyTorch)得到。
注意:PyTorch 模型(.pt/.pth)需要先转换为ONNX模型(.onnx)才可转换为RKNN模型
瑞芯微官方工具链Github链接 airockchip/rknn-toolkit2
本篇文章以ONNX模型转RKNN模型为例进行介绍
1.2 RK3568联网
我们需要使用ADB工具与开发板建立连接,方便传输文件与向rk3568发送命令。具体ADB工具安装方法,请看下面这篇博客,本文不再讲述
ADB详细(从下载安装到灵活运用)
https://shuaici.blog.csdn/article/details/142358129?fromshare=blogdetail&sharetype=blogdetail&sharerId=142358129&sharerefer=PC&sharesource=2403_87375314&sharefrom=from_link
安装好ADB工具后,使用OTG线将RK3568连接到Windows
在windows终端输入如下指令查看是否连接到开发板
adb devices
如图所示代表开发板成功连接到电脑,可以使用终端控制开发板
adb shell //进入RK3568系统
使用如下的指令连接wifi
connmanctl //进入WiFi操作终端
enable wifi //使能WiFi
agent on //开启代理
scan wifi //开启WiFi扫描,可以多次扫描
services //列出扫描到的WiFi列表
以下是我的执行效果
连接WiFi
connect XXXX // XXXX为Wifi名称后面的编码
终端报错 Not registered,是因为没有启动connman的用户代理(agent),在 connmanctl 中必须先启用 agent,才能连接需要密码的 WiFi 网络
agent on //开启用户代理
之后重新连接网络,输入密码并回车,不出意外便可连接到网络(关机重启后可自动联网)
至此,rk3568完成联网,可以进行rk3568的单板开发。
为了开发方便,接下来使用MobaXterm进行接下的工作(使用终端开发也可以)
2025年12月4日
1.3 Linux端配置与模型转换
1.3.1 Linux联网
因为我的linux配置存在一些问题,每次重启后需要手动联网,项目比较赶,目前使用应急联网方案(linux网络配置正常可跳过)(闲下来再彻底解决ヾ(≧▽≦*)o)
ip addr //查看网络状态 若存在 wlan0 且后有IP地址则网络大概率正常
若与我一样显示esn33 DOWN,可通过以下命令临时恢复网络
sudo ip link set ens33 up //激活ens33网络接口,使其处于物理连接就绪状态
sudo dhclient ens33 //让ens33接口通过DHCP协议自动获取网络参数
ip addr //显示网络信息,不出意外便可看到IP地址
1.3.2 传输模型和工具链到linux
复制IP地址,通过FileZilla连接linux,实现Windows与linux的文件互传
FileZilla如何下载请看这篇博客
//linux端输入如下指令搭建FTP服务器
sudo apt-get update //刷新本地包数据库
sudo apt-get install vsftpd //安装FTP
sudo apt-get install vim //已安装vim可跳过
sudo vi /etc/vsftpd.conf //打开配置文件
找到如下两行,确保前面没有“#”
修改完成后保存退出
sudo /etc/init.d/vsftpd restart //重启FTP
ip addr //获取IP地址,通过FileZilla连接到windows
将ONNX模型文件与工具链传输到linux
1.3.3 RKNN-Toolkot2版本选择与依赖安装
注意检查自己的linux系统环境与模型是否符合要求
可通过linux命令行查看ONNX模型使用的PyTorch版本
pip install onnx
python3 -c "import onnx; model = onnx.load('name.onnx'); print('Producer Name:', model.producer_name); print('PyTorch版本:', model.producer_version)"
//将name换成你模型的名字
/*正常会输出
版本:', model.producer_version)"
Producer Name: pytorch
PyTorch版本: x.x.x
*/
我的ONNX模型是使用PyTorch 2.5.1转换而成的,虽然高于RKNN-Toolkit2所支持的最高PyTorch 2.4.0版本,但是RKNN-Toolkit2 的兼容性核心是ONNX 模型的算子集(Opset)和算子类型,不是PyTorch的版本,可以先尝试进行转换(如果时间紧急的话),但是可能会存在精度下降问题
1.3.4 模型转换前置配置
这里我尝试直接转换
安装RKNN_Toolkit2时间可能较长,需要下载所需要的依赖,请耐心等待(可以换成国内源加速)
python3.8 -m venv rknn_toolkit2_2.3.2_P38 //创建python3.8虚拟环境
source rknn_toolkit2_2.3.2_P38/bin/activate //激活虚拟环境
pip install /home/alientek/tools/rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl //填写工具链所在的绝对路径
pip install numpy opencv-python //安装依赖
python -c "from rknn.api import RKNN; print('RKNN-Toolkit2 Success')" //输出“RKNN-Toolkit2 Success”则安装成功
全程没有报错即安装成功
2025年12月6日
博主自己的出错保留供回顾部分,可跳过以下部分,直接看1.3.4模型转换前置配置(续)
阅读官方文档与实际检查文件时发现,使用RKNPU需要安装RKNPU运行时库,但是官方提供的RKNPU运行时库对于linux仅有ARM 64位(aarch64)与ARM 32位(armhf,armhf-uclibc)的版本,没有x86版本。这代表我们无法在虚拟机上转换模型,必须在RK3568上进行RKNN模型的转换(其实在12月4日的更新中官方文档已经明确标明仅支持x64的linux,但是博主没看到(┬┬﹏┬┬))RKNN-Toolkit2(x64 版)本身就包含了 x64 架构的 API
定义明确:
x86 = 32 位 x86 架构,是Intel 早期 32 位处理器的架构名称,对应32 位计算,
处理器一次最多能处理32 位(4 字节)数据
软件需要编译为 “x86/32 位版本” 才能运行
x64 = 64位x86架构(x86_64/amd64),x64 是x86 架构的 64 位扩展(最初由 AMD 开发,所以也叫 amd64;Intel 后来兼容该架构,叫 Intel 64),是现在 PC 的主流架构
处理器一次最多能处理64 位(8 字节)数据
软件需要编译为 “x64/64 位版本” 运行,但64 位系统能向下兼容 32 位 x86 软件(通过兼容层)
ARM64与x64:
- ARM64(AArch64):采用精简指令集 (RISC),指令长度固定,每条指令执行单一操作,对内存对齐要求严格
- x64(x86_64/amd64):基于复杂指令集 (CISC),指令长度可变,支持更灵活的内存访问
所以,程序不兼容的根本原因是arm64与x64的区别,不是x86与x64
将开发板联网,通过MobaXterm连接到开发板(终端操作也可以,但是MobaXterm更加直观方便)
将如下文件先发送到rk3568开发板
rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
librknnrt.so(注意:是根目录下rknpu2\runtime\Linux\librknn_api\aarch64中的文件)
python3.8 -m venv rknn_toolkit2_2.3.2_P38 //创建python3.8虚拟环境
source rknn_toolkit2_2.3.2_P38/bin/activate //激活虚拟环境
pip install /home/tools/rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl //填写工具链所在的绝对路径
//若报错提示缺少工具,可执行以下代码
deactivate //退出虚拟环境
apt-get update //更新软件源
apt-get install -y xxx //自动确认安装xxx,跳过交互式询问(-y)
source rknn_toolkit2_2.3.2_P38/bin/activate //重新激活虚拟环境
//继续安装流程
pip install numpy opencv-python //安装依赖
python -c "from rknn.api import RKNN; print('RKNN-Toolkit2 Success')" //输出“RKNN-Toolkit2 Success”则安装成功
1.3.4 模型转换前置配置 (续)
确保rknn_Toolkits2与依赖全部成功安装
将以下的代码复制,建立一个脚本文件,将模型名字换位你的模型名称,确保其余参数与你的模型相匹配(可通过Netron查看模型参数),将脚本与模型放置在同一路径下
注意:
我的模型是图像检测模型,不同的模型对应的脚本可能不同,具体请根据自己的模型写对应的脚本!
该脚本仅进行最基础的模型转换,并且缺少部分参数,是以模型精度为代价来减少可能发生的错误,旨在快速跑通工作流。
from rknn.api import RKNN
import os
# 配置参数
TARGET_PLATFORM = 'rk3568' # 根据你的设备修改
QUANTIZE_ON = False # 保持关闭直到基础转换成功
def convert_onnx_to_rknn():
# 1. 创建RKNN对象
rknn = RKNN(verbose=True)
try:
# 2. 配置模型(简化配置)
print('--> Config model')
rknn.config(
target_platform=TARGET_PLATFORM,
optimization_level=3,
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
)
# 3. 加载ONNX模型(不指定inputs/input_size_list)
print('--> Loading ONNX model')
ret = rknn.load_onnx(
model='best.onnx',
# 注意:v1.4.0对动态轴敏感,不指定裁剪参数
) #这里换为你自己的模型文件
if ret != 0:
print(f'Load ONNX failed! Error code: {ret}')
exit(ret)
# 4. 构建RKNN模型
print('--> Building RKNN model')
ret = rknn.build(do_quantization=QUANTIZE_ON)
if ret != 0:
print(f'Build RKNN failed! Error code: {ret}')
exit(ret)
# 5. 导出RKNN模型
print('--> Export RKNN model')
rknn_file = 'best.rknn'
ret = rknn.export_rknn(rknn_file)
if ret != 0:
print(f'Export RKNN failed! Error code: {ret}')
exit(ret)
print(f'Conversion successful! Output: {os.path.abspath(rknn_file)}')
finally:
rknn.release()
if __name__ == '__main__':
# 验证ONNX版本
import onnx
print(f"ONNX version: {onnx.__version__}")
# 验证模型有效性
try:
onnx_model = onnx.load('best.onnx')
onnx.checker.check_model(onnx_model)
print("ONNX model validation passed!")
except Exception as e:
print(f"ONNX validation failed: {e}")
exit(1)
convert_onnx_to_rknn()
1.3.5 模型转换
执行以下代码,进行模型转换
source rknn_toolkit2_2.3.2_P38/bin/activate //进入python3.8虚拟环境
cd xxxx //进入模型文件与模型转换脚本在的目录
python xxx //执行脚本xxx,转换模型
模型成功转换ヾ(≧▽≦*)o
2. RK3568 NPU推理速度测试
2.1 前置准备
将转换好的RKNN模型与正点原子提供的rk3568的预编译包与适用于rk3568的arm64版本的rknn_Toolkot2传输到开发板
预编译包可以在正点原子提供的RK3568开发板A盘资料中找到
(具体路径:【正点原子】RK3568开发板资料(A盘)-基础资料\01、程序源码\01、程序源码\01、AI例程\03、软件及驱动)正点原子提供的rknn_Toolkit2是2.0.0版本的,我们转换RKNN模型使用的是2.3.2的rknn_Toolkits2,不同的版本会导致模型推理失败,所以我们使用瑞芯微官方提供的针对rk3568的预编译包
(具体路径:rknn-toolkit2-2.3.2\rknn-toolkit2-2.3.2\rknn-toolkit-lite2\packages)
(因为我的模型是图像检测模型,所以再传输一张测试图片)
rknn_speed_test.py文件内容如下
注意:
我的模型是图像检测模型,不同的模型对应的脚本可能不同,具体请根据自己的模型写对应的脚本!
import cv2
import numpy as np
import time
from rknnlite.api import RKNNLite
def test_npu_speed():
# 1. 初始化 RKNN Lite
rknn_lite = RKNNLite()
# 2. 加载 RKNN 模型
print("加载模型...")
ret = rknn_lite.load_rknn('best.rknn')
if ret != 0:
print("加载模型失败!")
return
# 3. 初始化运行环境
print("初始化运行环境...")
ret = rknn_lite.init_runtime()
if ret != 0:
print("初始化失败!")
return
# 4. 准备测试图片
print("准备测试图片...")
img = cv2.imread('best.jpg')
if img is None:
print("无法读取图片!")
return
# 调整为模型输入尺寸(根据你的模型调整)
img = cv2.resize(img, (640, 640))
# 预处理(与模型转换时的配置一致)
img = img.astype(np.float32) / 255.0
img = np.expand_dims(img, axis=0) # 添加 batch 维度
# 5. 预热(排除首次推理的初始化开销)
print("预热 5 次...")
for _ in range(5):
rknn_lite.inference(inputs=[img])
# 6. 测试推理速度
print("测试 100 次推理速度...")
test_runs = 100
total_time = 0.0
for i in range(test_runs):
start_time = time.time()
rknn_lite.inference(inputs=[img])
end_time = time.time()
infer_time = (end_time - start_time) * 1000 # 转换为毫秒
total_time += infer_time
# 每 10 次打印一次进度
if (i + 1) % 10 == 0:
print(f" 第 {i+1}/{test_runs} 次:{infer_time:.2f} ms")
# 7. 计算平均速度
avg_time = total_time / test_runs
fps = 1000 / avg_time
print("\n" + "="*50)
print(f" 测试结果:")
print(f" 总测试次数:{test_runs}")
print(f" 平均推理时间:{avg_time:.2f} ms")
print(f" 推理帧率(FPS):{fps:.2f}")
print("="*50)
# 8. 释放资源
rknn_lite.release()
print("测试完成,资源已释放!")
if __name__ == '__main__':
test_npu_speed()
安装rknn_Toolkits2
pip3 install rknn_toolkit_lite2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl //安装预编译包
2.2模型推理测试
执行以下代码
python3 rknn_speed_test.py //启动脚本进行测试
若没有问题便可以正常推理
2.3 目前已知可能发生的问题的解决方法
2.3.1 安装在rk3568上的 rknn_Toolkits2 版本与模型转换时的版本不同
在运行脚本时会有如下的报错
解决方法:安装相同版本的rknn_Toolkits2,更新rknn_Toolkits2的librknnrt.so文件为你新安装的文件
具体操作如下:
find / -name "librknnrt.so" 2>/dev/null // 查找所有 librknnrt.so 文件
strings /xx/xx/librknnrt.so | grep -i version //查看librknnrt.so文件的版本,确保使用的版本与你预期版本相同
cp /xx/xx/librknnrt.so /zz/zz/ //复制正确版本的库到rknn_Toolkits2的安装路径
ldconfig //刷新库缓存
strings /usr/lib/librknnrt.so | grep -i "librknnrt version" //验证新库版本
python3 xx.py //重新测试脚本
版权声明:本文标题:开发日志-正点原子RK3568使用NPU推理模型 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1765368535a3373931.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论