YOLOv8环境配置和RK3588模型转换NPU部署
前言
本文详细记录了笔者在2024年11月配置的YOLOv8训练和测试环境,分别完成Windows PC YOLO模型训练机、Ubuntu PC RKNN模型开发机、RK3588 RKNPU边缘部署设备,三个平台的RKNN模型开发流程配置,使用瑞芯微提供RKNN Toolkit 2工具V2.3.0最新版,将yolov8模型转成onnx再转成rknn模型,最后交叉编译构建示例,实现在开发板使用C API调用NPU推理yolov8目标检测模型。本教程仅用于跑通官方的配置流程和示例程序,只为转换自己训练的模型进行部署,不涉及C/C++实际应用编程,建议先通篇阅读一次内容之后再上手实操。
(本文会尽量将步骤描述详细,虽然啰嗦但争取一篇搞定瑞芯微的NPU。如有错漏,大佬们请轻点喷,欢迎留言指正,Respect!)
1. 硬件配置
笔者使用到的硬件设备主要配置参数张贴如下,以供参考:
设备类型 | 配置参数 | 系统架构 | 系统版本 | 用途说明 |
---|---|---|---|---|
PC电脑 | i5-12490F、 RTX 2070 Super | x86_64 | Windows10 | 数据集标注、模型训练 |
RKNN开发机 | Intel N100 (或者用虚拟机) | x86_64 | Ubuntu-22.04 | 模型导出、转换、性能分析、仿真测试 |
RKNPU开发板 | Orangepi 5 、RK3588S | ARM64 | Ubuntu-22.04 | 推理、API接口调用、应用程序开发 |
叠个甲:其实RKNN开发机的搭建,也可以在PC电脑Windows上使用虚拟机安装Ubuntu(虚拟机安装教程请自行参考其他文章),只是我手头刚好有个闲置的x86迷你主机装好了Ubuntu-22.04,所以我选择把YOLO模型训练和导出部分放在Windows进行,训练完后再把模型文件拷贝进RKNN开发机里转换即可,这样比较方便我的工作环境而已,仅供参考。
2. 软件版本
注意:为了方便展示环境配置过程细节,我都使用了默认路径,你也可自定义路径,但路径中不应含有中文、空格和特殊字符等!
软件 | PC电脑 | RKNN开发机 | RKNPU开发板 |
---|---|---|---|
NVIDIA Driver | 561.09 | \ | \ |
CUDA | 12.4 | \ | \ |
cuDNN | 8.9.7 | \ | \ |
Python | 3.9 | 3.8 | 3.10 |
Pytorch | 2.5.1+cu124 | 2.4.0 | \ |
Pycharm | Community-2024.2.4 | Community-2024.2.4 | \ |
Miniconda3 | 24.9.2 | 24.9.2 | \ |
Ultralytics | 8.2.82(RK_Optimized) | 8.3.28 | \ |
RKNN Model Zoo | \ | v2.3.0 | \ |
RKNN Toolkit2 | \ | v2.3.0 | \ |
RKNPU2 | \ | \ | v2.3.0 |
3. 【PC电脑】基础开发环境配置
说明:该部分内容是为了在Windows10 PC电脑中安装Python和YOLOv8需要的开发工具。
3.1 查看NVIDIA显卡驱动支持
这一步主要是看显卡的驱动版本,以及查看该驱动所能支持的最高CUDA版本,注意这里不是指已安装的CUDA版本。
方法一:使用终端命令查看
- 使用快捷键
[Win]+[R]
打开运行窗口,输入CMD
打开终端命令行窗口。
- 输入命令
nvidia-smi
查看驱动版本信息
方法二:使用NVIDIA控制面板
- 打开【NVIDIA控制面板】程序(不懂怎么找NV控制面板的点这里)
- 点击左下角【系统信息】可以看到当前显卡驱动版本
在右边的一栏中显示了显卡的驱动版本,记住这串数字,等下去官网找更新的驱动版本。
点击【组件】查看当前驱动版本支持的最高的CUDA版本,比如这里意思是最高支持安装12.6的版本
(可选)更新显卡驱动
如果显卡驱动较旧,想要支持更高的CUDA安装版本,可以使用浏览器进入NVIDIA官网,输入显卡型号,以搜索最新的显卡驱动程序
推荐安装Game Ready的驱动更适合,怕最新驱动不稳定的话也可以往前找稍微近期的版本。
驱动下载完成后运行驱动安装程序,默认C盘路径、默认配置选项、一直点下一步安装即可。
3.2 安装CUDA和cuDNN
前面第1步已经查到显卡驱动显示当前可安装的最高CUDA版是12.6,意思是我下面选择安装的CUDA版本最高不能超过12.6!!!
先别急,这里简单普及一下知识点:
-
英伟达的CUDA是基于其GPU的并行计算平台,提供了并行编程的API,使GPU可以科学计算、深度学习、图形渲染等方面进行加速计算。而cuDNN可以理解为英伟达针对深度学习的GPU加速库,并进一步优化GPU的计算性能,当CUDA和cuDNN结合起来,即可实现更高效、更快速的深度学习模型训练和推理工作。因此CUDA和cuDNN的安装版本是需要相互匹配对应的。
-
Pytorch是一个基于Python并依赖Numpy等库的深度学习框架,支持跨平台(Linux、Mac、Windows),主要提供CPU和CUDA两种计算平台的支持,它能够调用英伟达CUDA进行GPU的加速计算,而我们最终需要跑起来的YOLO系列算法就是基于Pytorch框架下实现的,因此YOLOv8也需要对应的合适版本的Pytorch并配置好才能运行。
总而言之,我们得先去Pytorch官网查看最新的Pytorch对于CUDA版本的支持情况,才知道现在应该安装哪个版本的CUDA。
从Pytorch官网的信息中可以看到目前支持到CUDA 12.4版本,并且要求Python安装到3.9及以上版本,且需要有numpy库。提供conda和pip两种常见的便捷安装方式。
第一步:下载安装CUDA 12.4
OK,接下来我们先用浏览器打开英伟达CUDA Toolkit Archive官网找到CUDA 12.4的版本下载安装。
下载完成后,在cuda_12.4.1_551.78_windows.exe
文件上,右键【以管理员身份运行】进行安装。
① 这里打开的是临时解压文件暂存路径,默认即可,安装完之后会自动清理缓存,点击【OK】
② 在安装选项这里,更改选择为【自定义】然后【下一步】
③ 勾选全部组件,然后【下一步】
④ 安装默认路径自动安装在C盘(一个是方面后面找文件路径,另一个是避免以后有奇奇怪怪的报错)
⑤ 然后一直点【下一步】然后等待自动安装完成点【关闭】即可
安装完成后,打开cmd终端命令行输入nvcc -V
验证是否安装成功
在系统搜索栏输入“高级系统设置”并打开
查看【高级】【环境变量】
检查“系统变量”中是否有如下两条。(同时记住这个CUDA安装路径,后面用到)
第二步:下载cuDNN替换文件
使用浏览器打开英伟达官网cuDNN下载页面,注意选择对应到CUDA 12.x版本的cuDNN
点击展开后,选择适配于Windows的ZIP文件然后下载
这里可能会弹出提示让你用邮箱登录,按照提示要求,自行注册英伟达官网账号后登录即可下载。
将下载的ZIP压缩包解压后,得到如下几个文件夹,将它们全部复制到刚刚CUDA安装路径下
(默认路径一般为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4
这样的格式,只是最后的版本号可能有不同)
这里弹出提示有同名文件,点击【替换目标中的文件】进行文件覆盖更新
打开【高级系统设置】【高级】【环境变量】,在“系统变量”中找到“Path”这一条双击进去
将如下两个路径添加进Path中:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\libnvvp
(不同CUDA版本默认路径名称会略有不同,以上仅供参考,请以你们实际安装路径为准)
3.3 安装Python以及Pycharm开发平台
① 使用浏览器进入Python官网下载Python3.9版本安装包
页面往下翻找到Python3.9.x这些版本,选择64bit的版本下载
(够用就行,不太建议装太高的版本)
对安装包右键以【管理员身份运行】默认安装到C盘默认路径即可
② 进入Pycharm官网下载社区版的开发工具安装包,双击默认安装即可
到这里为止,我们主要的系统主环境的必要软件已经安装完了,建议【重启电脑】以更新PC系统环境。
3.4 安装Anaconda或Miniconda环境管理工具
问:conda是什么?既然已经安装了Python,为什么还要安装conda?
答:Anaconda和Miniconda都是用来安装和管理Python虚拟开发环境的,它用来对我们系统配置环境进行隔离保护,比如当我们需要开发或验证N多个不同的项目时,遇到针对python或者一些依赖库有特殊版本的指定要求时,总不可能对我们电脑里已安装的Python和依赖库反复卸了装、装了卸吧,而利用conda工具就可以创建并管理多个虚拟环境,使用时只需要激活某个虚拟环境,针对实验项目的需要进行安装、更新、卸载各种依赖库即可,而不同虚拟环境之间、虚拟环境与系统环境之间互不干扰冲突,同时还可以导出环境配置文件在其他开发机上完美地复现,Miniconda可以理解为Anaconda的保留常用功能的最小化版本。
这里我们就选择安装Miniconda就好,只包含了最关键和最常用的功能,可以在Miniconda官网下载,也可以通过国内清华镜像源下载。
方法一:通过国内清华镜像源下载
这里提供很多版本,可以下载带有latest最新版,也可以下载带有py39预装了Python3.9默认环境的版本,注意这里不是决定最终开发环境的Python,这里只是给到一个初始Python环境,实际创建虚拟环境时你还可以自行按需指定Python版本,预装Python3.9只是为了在创建生成虚拟环境时节省下载时间和网络流量,快速创建新的环境。
方法二:通过Miniconda官网下载安装包
安装完成后,在Win10搜索栏能找到对应的Anaconda Prompt终端命令行程序即可(尾部也可能带Miniconda标识)
后续我们创建并管理虚拟环境都是在这个Prompt终端命令行中完成,注意不是Windows那个CMD终端或PowerShell哟!
在conda工具里面,可以通过pip和conda来安装所需要的包。
打开conda Prompt,默认是进入到base环境,也就是系统级的配置环境,输入conda --version
命令查看当前安装的conda版本
简单列举一些常用的conda操作命令如下:
1、列出所有可用的虚拟环境名称以及路径
# 方法一
conda info --envs
# 方法二
conda env list
2、创建一个虚拟环境
# 这里myenv就是创建的虚拟环境的自定义名称
conda create -n myenv
# 也可以在后面指定Python的版本
conda create -n myenv python=3.9
3、激活一个环境
# myenv要改为虚拟环境的名称
conda activate myenv
4、安装一个第三方库
conda install numpy
5、退出当前环境
conda deactivate
6、移除清除某一个环境
conda remove -n myenv --all
(可选)配置conda使用国内的清华镜像源(下载提速用)
# 查看Conda默认的源
conda config --show channels
# 这里使用清华源为例,也可以使用其他第三方源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --set custom_channels.auto https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
conda config --set show_channel_urls yes
4. 【PC电脑】YOLOv8 环境配置和测试
说明:该部分内容是为了配置YOLOv8开发环境,调用英伟达GPU完成YOLOv8模型训练和测试,并导出经过RK优化调整的.onnx格式模型,为后续转换为.rknn模型做好准备。
4.1 创建conda虚拟环境
打开Anaconda Prompt终端,默认进入base环境
# 创建一个名为“rkopt_yolov8”的虚拟环境,并指定了Python版本为3.9
conda create -n rkopt_yolov8 python=3.9
# 激活虚拟环境
conda activate rkopt_yolov8
4.2 配置Pycharm的开发环境
打开软件,点击【New Project】先创建一个工程项目,自定义名字并修改项目存放路径,编译器类型选择【Base conda】即可。
Tips:如果您需要将pycharm软件设置成中文,可按照如下步骤进行配置,然后重启软件。
在设置的【Python Interpreter】中,点击上图中下拉框的【Show All…】
按照下面步骤找到刚才用coanda创建的rkopt_yolov8虚拟环境
4.3 安装YOLOv8和依赖库
特别注意,这里安装YOLO并不能直接pip install ultralytics
,我们这里使用瑞芯微官方提供的仓库airockchip/ultralytics_yolov8,该仓库基于ultralytics/ultralytics官方原仓库做了修改,可以让我们基于从原仓库训练出来的.pt模型直接导出(format=‘rknn’)适配RKNPU的.onnx模型,使得RKNPU获得更高的推理效率。
除了最后导出模型时,需要参考RK提供的操作指引RKOPT_README进行,其他工作流程均按照原YOLO仓库的操作指引即可。更多模型结构优化的细节,请自行查阅RKNN模型库中的关于YOLOv8对象检测这一节的示例说明。
下面我们直接拉取https://github.com/airockchip/ultralytics_yolov8仓库到我们的项目中
点击PyCharm左下角的终端命令行输入(因为前面配置了编译器,这里就会自动激活进rkopt_yolov8虚拟环境)
# 拉取ultralytics_yolov8仓库的main分支
git clone https://github.com/airockchip/ultralytics_yolov8.git
# 如果显示git不可用,请看最后一章的Win10安装git方法
在ultralytics_yolov8目录下新建一个名为requirements.txt
的文本,内容直接照如下拷贝即可:
# Ultralytics requirements
# Usage: pip install -r requirements.txt
# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.22.2 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0
# Logging -------------------------------------
# tensorboard>=2.13.0
# dvclive>=2.12.0
# clearml
# comet
# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0
# Export --------------------------------------
# coremltools>=7.0.b1 # CoreML export
onnx>=1.12.0 # ONNX export
onnxsim>=0.4.1 # ONNX simplifier
# nvidia-pyindex # TensorRT export
# nvidia-tensorrt # TensorRT export
# scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TF exports (-cpu, -aarch64, -macos)
# tflite-support
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev>=2023.0 # OpenVINO export
# Extras --------------------------------------
psutil # system utilization
py-cpuinfo # display CPU info
# thop>=0.1.1 # FLOPs computation
# ipython # interactive notebook
# albumentations>=1.0.3 # training augmentations
# pycocotools>=2.0.6 # COCO mAP
# roboflow
【解释说明】这个requirements.txt是RK官方要求满足的依赖库清单,但是在仓库main分支中却没有见到(不知为啥),但其实在rk_opt_v1.6分支里面就有,我们把他手动补充到ultralytics_yolov8目录下再自动安装依赖即可。其中一个位置我还作了修改:取消了onnx和onnxsim两行注释,原因是在后面导出RKNN模型的时候报错提示:说妹找到onnx…所以干脆在这里就装上onnx即可。
继续在终端输入命令进行依赖库安装,注意下面这几句命令真的超级关键!
cd ultralytics_yolov8
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -e .
4.4 简单测试yolo命令推理效果
目前YOLO可在不依赖Python环境的情况下,终端使用yolo单行命令实现全部功能,详见:https://docs.ultralytics.com/usage/cli/
①先去官网下载官方的预训练模型(yolov8n.pt)和测试图片(bus.jpg),同样将下载的文件放到ultralytics_yolov8目录下。
https://github.com/ultralytics/assets/releases/download/v8.3.0/yolov8n.pt
https://ultralytics.com/images/bus.jpg
② 使用yolo单行命令执行简单推理测试(注意前面下载的文件路径)
# 第一个参数是指任务[detect, segment, classify]
# 第二个参数是模式[train, val, predict, export, track)]
# model 参数指向模型文件所在路径
# source 参数指向预测媒体对象文件所在路径
yolo detect predict model=yolov8n.pt source=bus.jpg
从输出的信息可以看到,YOLO调用了CPU执行推理,共耗时50ms左右。
根据官方的示例教程说明,可以添加一个指定推理设备的参数device
,也可以直接推理.mp4
视频文件
- 当你只有CPU能跑时,不用指定都是默认为
device=cpu
- 当你既有CPU也有GPU时,就默认会优先设置为
device=0
,如需用CPU则需要手动设置device=cpu
- 你要是有多个显卡同时挂载,甚至能设置为
device=0,1,2,3
那我们就尝试改成显卡跑一跑,那结果肯定就不出意外地出意外啦,报错啦!
从上面报错的信息可以看到,CUDA并没有成功被torch调用,也没有可用的GPU设备!那我CUDA装了个寂寞?
其实仔细一看第一行torch-2.5.1+cpu
就知道自动装的Pytorch版本只适用于CPU,需要重新安装适用于CUDA的Pytorch才能调用GPU!
4.5 安装Pytorch的GPU版本
输入pip list
可以看到有torch
、torchvision
两个依赖包
输入pip uninstall torch
卸载CPU版本的torch
输入pip uninstall torchvision
卸载CPU版本的torchvision
使用浏览器进入到Pytorch官网https://pytorch.org/,因为前面给显卡装了12.4版本的CUDA和cudnn,所以这里也必须选择CUDA12.4
终端输入上面自动生成的命令pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
安装完后再次pip list
,可以确认这次安装的是GPU版本了
也可以创建一个python脚本程序,打印查看详细的torch版本信息以及torch调用CUDA情况
import torch
print(torch.__version__) # pytorch版本
print(torch.cuda.is_available()) # GPU可用性
print(torch.cuda.device_count()) # GPU个数
print(torch.backends.cudnn.version()) # 查看对应CUDA的版本号
print(torch.version.cuda) # 查看对应CUDA的版本号
quit() # 退出Python
再次使用yolo命令推理,可以看到已经默认调用了显卡推理。终于舒服了!NVIDIA YES!
cd ultralytics_yolov8
yolo detect predict model=yolov8n.pt source=bus.jpg
除了使用yolo命令,当然也可以使用Python脚本程序执行各项任务,在官网可获取示例:https://docs.ultralytics.com/usage/python/
以下是yolov8n模型的python目标检测推理示例:
# 将前面下载的yolov8n.pt模型文件和bus.jpg测试照片拷贝到项目同级文件夹下
import cv2
from ultralytics import YOLO
model = YOLO("yolov8n.pt") # 加载模型
image = cv2.imread("bus.jpg") # 加载照片
results = model.predict(source=image) # 执行推理任务
for result in results:
result.show() # 显示结果
4.6 训练自己的模型
可以使用YOLO的官方流程指引,用最原始的.pt预训练模型,自己准备的数据集图片进行训练。
可以参考我的这篇文章《X-AnyLabeling自动标注数据集并训练自己的YOLO11目标检测模型》
Tips:建议在训练.pt模型前,将默认的激活函数 SiLU
改为 ReLU
,训练的效果几乎不变,模型可能精度略微下降,但是模型的文件更小,在NPU上推理的速度大幅提升。具体操作方法和说明可以参考这篇文章。
(注意:数据集标注、模型训练的内容较多,需要参考官方教程或其他文章,结合各自需求训练即可,这一步我们暂时先跳过。)
4.7 导出RKNN模型
在ultralytics_yolov8目录下,拷贝一份yolov8n.pt
命名为my_yolov8n.pt
假装当作是用我们的数据集训练出来的模型。
① 在终端使用yolo命令导出rknn模型
cd ultralytics_yolov8
yolo export model=my_yolov8n.pt format=rknn
② 使用python脚本导出rknn模型
例如在ultralytics_yolov8目录下新建一个.py脚本
from ultralytics import YOLO
model = YOLO("my_yolov8n.pt")
model.export(format='rknn')
(注意:导出的模型名为my_yolov8n.onnx
,不要怀疑这个.onnx后缀,它是一种中间格式,只要导出时设置了format='rknn'
且没有报错并成功生成文件,那就说明环境配置对了,同时这个特殊的.onnx也是无法在当前配置环境下使用yolo命令执行推理的。)
也可以直接使用 RKNN Model Zoo 仓库中yolov8目录下README文档中提供的经过airockchip/ultralytics_yolov8 仓库优化的预训练模型
./yolov8n.onnx
./yolov8s.onnx
./yolov8m.onnx
Tips:airockchip/ultralytics_yolov8 仓库目前已支持:检测、分割、姿态、旋转框检测模型的导出,更多说明请查阅 RKNN Model Zoo
5. 【RKNN开发机】RKNN Toolkit2 环境配置
5.1 安装基础开发工具
5.1.1 安装Miniconda3
使用浏览器进入清华镜像源网站(https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/)下载对应的x84_linux安装包
然后进入下载的文件所在目录下执行./Miniconda3-py39_24.9.2-0-Linux-x86_64.sh
开始安装一路按[Enter]
键,输入yes
接受使用条款,不想看可以按[Q]
键退出条款阅读,
安装的路径可以自定义,或者直接按[Enter]
键使用默认安装路径
询问是否设置“打开终端自动进入conda默认base环境”,这里选择输入yes
,同时这里也提示了取消该设置的命令
安装完成后重启系统或者执行source ~/.bashrc
直接进入conda默认base环境,使用conda --version
命令查看conda版本
配置conda使用国内的清华镜像源(下载提速用)
# 查看Conda默认的源
conda config --show channels
# 这里使用清华源为例,也可以使用其他第三方源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --set custom_channels.auto https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
conda config --set show_channel_urls yes
5.1.2 安装PyCharm
使用浏览器进入官网下载页面(https://www.jetbrains.com/pycharm/download/?section=linux),选择社区版的Linux安装包
直接右键对下载的包进行解压,或在终端输入命令tar -xzf pycharm-conmunity-2024.3.tar.gz
(注意文件名中的版本号会有不同)
然后进入到其中的bin文件夹目录下,输入命令sh ./pycharm.sh
直接启动软件
在初次启动的欢迎界面,点击左下角设置,创建桌面条目。这样就可以在启动界面看到软件图标。
5.2 安装RKNN Toolkit2工具包
5.2.1 下载RKNN相关库文件
# 新建一个工作目录
mkdir Project
# 进入到该目录下
cd Project
# (可选)安装git工具
sudo apt install git
# 下载 RKNN-Toolkit2 仓库
git clone https://github.com/airockchip/rknn-toolkit2.git --depth 1
# 下载 RKNN Model Zoo 仓库
git clone https://github.com/airockchip/rknn_model_zoo.git --depth 1
# 注意:
# 1.参数 --depth 1 表示只克隆最近一次 commit
# 2.如果遇到 git clone 失败的情况,也可以直接在 github 中下载压缩包到本地,然后解压至该目录
文件目录结构如下:
Project
├── rknn-toolkit2
└── rknn_model_zoo
5.2.2 创建conda虚拟工作环境
# 创建名为“toolkit2”的python3.8环境
conda create -n toolkit2 python=3.8
# 查看所有环境及位置
conda env list
# 激活toolkit2环境
conda activate toolkit2
5.2.3 安装RKNN-Toolkit2
(注意:请在以上conda激活的toolkit2环境下进行安装RKNN-Toolkit2)
方法一(推荐):通过pip源的方式安装(清华镜像源)
pip install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple
# (可选)如果之前已经安装了,需要进行版本更新升级
pip install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade
方法二:通过本地wheel包安装
# 进入 rknn-toolkit2 目录
cd Projects/rknn-toolkit2/rknn-toolkit2
# 请根据不同的 python 版本及处理器架构,选择不同的 requirements 文件,例如:
# python3.8 x86_64 对应 requirements_cp38.txt
# python3.8 ARM64 对应 arm64_requirements_cp38.txt
pip install -r packages/requirements_cpxx.txt
# pip install -r packages/arm64_requirements_cpxx.txt
# 安装 RKNN-Toolkit2
# 请根据不同的 python 版本及处理器架构,选择不同的 wheel 安装包文件:
# 其中 x.x.x 是 RKNN-Toolkit2 版本号,cpxx 是 python 版本号,<arch> 是处理器架构类型 (x86_64 对应x86_64/aarch64 对应 ARM64)
# 具体可以前往以下网页进行确认新版本的资源文件名称
# https://github.com/airockchip/rknn-toolkit2/tree/master/rknn-toolkit2/packages
pip install packages/rknn_toolkit2--x.x.x-cpxx-cpxx-manylinux_2_17_<arch>.manylinux2014_<arch>.whl
验证是否安装成功,可以输入python
进入python交互模式,尝试导入rknn,如未报错,即说明安装成功。
from rknn.api import RKNN
exit() # 退出
5.3 安装编译工具
5.3.1 安装CMake
# 更新包列表
sudo apt update
# 安装 cmake
sudo apt install cmake
5.3.2 安装编译器
① 确认RKNPU开发板的系统类型、系统架构
(注意这部分需要adb连接开发板,连接方法看6.1节。但如果事先已经知晓了开发板的安装系统,可以直接跳过第1步)
# 确认开发板系统类型
adb shell getprop ro.build.version.release
# 如输出位数字则为 Android 系统,数字为 Android 系统版本号
# 否则为Linux系统,输出内容为/bin/sh: getprop: not_found
# 确认系统架构
# 如果是Android系统
# adb shell getprop ro.product.cpu.abi
# 输出 arm64-v8a 表示 ARM 64 位架构、第八版本的 ABI。
# 如果是Linux系统
adb shell uname -a
# 该命令的参考输出信息如下,其中 aarch64 表示 ARM 64 位架构。
# Linux Rockchip 5.10.160 #183 SMP Tue Oct 24 18:52:11 CST 2023 aarch64 GNU/Linux
笔者使用的是OrangePi 5 开发板,板端安装的64位Ubuntu22.04系统,因此下面步骤仅针对Linux 系统的开发板。
② 下载安装 GCC 交叉编译器
开发板为64位系统:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-lin
ux-gnu/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
开发板为32位系统:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linuxgnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
③ 将GCC软件包解压到 Project 文件目录下,以64位的软件包举例,目录结构如下:
Project
├── rknn-toolkit2
├── rknn_model_zoo
└── gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
记住此时GCC 编译器的路径是/Project/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
该路径在后面第7.5节编译RKNN C Demo时会用到
6. 【RKNPU开发板】RKNPU2 环境配置
6.1 使用adb连接开发板
(这部分内容仅针对香橙派5开发板进行记录、说明步骤,其他开发板请参考具体产品的用户手册)
1、准备一条品质良好的Type-C数据线,并确保以下USB Type-A接口未被占用。
2、将一端连接到 Ubuntu PC(即RKNN开发机),另一端连接到开发板的下图左边这个Type-C数据口,注意不是右边的Type-C供电口。
3、开发板进入终端输入以下命令,将Type-C口设置为device
模式用途
# 方法一:
sudo set_device.sh
# 方法二
# 如果系统中不存在set_device.sh脚本,则使用以下命令:
sudo bash -c "echo device > /sys/kernel/debug/usb/fc000000.usb/mode"
sudo systemctl restart usbdevice
后台进程确认adbd是否已启动
ps -ax | grep "adbd"
# 输出示例:
# 808 ? Sl 0:00 /usr/bin/adbd
# 3707 ttyFIQ0 S+ 0:00 grep --color=auto adbd
4、回到Ubuntu PC上,使用终端安装adb工具
sudo apt-get update
sudo apt-get install -y adb
连接开发板Type-C口后,查看是否有识别到adb设备
adb devices
# 正常的输出示例:
# List of devices attached
# e0f9f71bc343c305 device
# 如果显示如下,则说明前面第3步设置开发板的Type-C未配置好或命令无效,请尝试第3步的方法二重新配置开发板
# List of devices attached
# e0f9f71bc343c305 no permissions (user in plugdev group......
使用adb登录到开发板linux系统
adb shell
# root@orangepi5:/# <--- 看到这个提示符后说明已成功登录开发板的终端
# 使用快捷键[Ctrl]+[D]退出
使用adb工具进行Linux设备之间的相互传输文件
# 在Ubuntu PC输入的命令,其中前面FilePath_A部分是指文件原来路径,后面FilePath_B部分是传输目的地路径
# 将文件从Ubuntu PC 发送到开发板
adb push FilePath_A FilePath_B
# 将文件从开发板回传到Ubuntu PC
adb pull FilePath_A FilePath_B
sudo adb pull FilePath_A FilePath_B # 当需要权限的时候使用sudo,可能需要输入开发板密码
成功连接到开发板,后续的大部分工作都可以在Ubuntu PC上使用adb命令连接开发板,进行远程登录开发板终端使用命令。
6.2 确认RKNPU2驱动版本
在Ubuntu PC开发机的终端输入命令
# 进入开发板终端
adb shell
# 查询 RKNPU2 驱动版本
dmesg | grep -i rknpu
如图,香橙派提供的系统固件已包含瑞芯微NPU驱动,RKNPU2驱动版本为 0.9.6,官网建议RKNPU2 驱动版本 >= 0.9.2。
6.3 检查RKNPU2环境是否已安装
RKNN-Toolkit2 的连板调试功能要求板端已安装 RKNPU2 环境,并且板端启动 rknn_server 服务。
rknn_server 是一个运行在开发板上的后台代理服务,用于接收Ubuntu PC 通过 USB传输过来的协议,然后执行板端 runtime 库中对应的接口,并返回结果给Ubuntu PC。要保证 RKNN-Toolkit2 和 RKNN Server 、Runtime 库的版本一致且版本 >= 1.5.0。如果板端没有安装 RKNN Server 和 Runtime 库或版本不一致,都需要重新安装/更新 RKNPU2 。
在Ubuntu PC开发机的终端输入以下命令进行检查:
# 进入开发板终端
adb shell
# 启动 rknn_server
restart_rknn.sh
# start rknn server, version: x.x.x # 表示启动服务成功
# 查询rknn_server版本
strings /usr/bin/rknn_server | grep -i "rknn_server version"
# rknn_server version: x.x.x # 笔者这里未显示输出,大概是厂家预装的NPU驱动版本比较旧的问题
# 查询librknnrt.so库版本
strings /usr/lib/librknnrt.so | grep -i "librknnrt version"
# librknnrt version: x.x.x
由于第三方开发板厂家发布的系统固件,对于预装的RKNPU驱动可能存在固件版本滞后等问题,一般都建议按照下一节更新RKNPU2,已匹配我们刚才下载安装的v2.3.0最新版RKNN-Toolkit2 ,从而达到更好的推理性能。
6.4 安装/更新RKNPU2环境
根据官方手册的操作指示,进入rknn-toolkit/rknpu2目录,使用adb工具将rknn_server和librknnrt.so推送到板端,然后重新启动rknn_server。
(注意:不同版本和系统对应的文件存放路径有不同,请自行进入文件目录里面确认,下面仅以64位Linux为例展示。)
cd rknn-toolkit2/rknpu2
# 推送 rknn_server 到板端
adb push runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin
# 推送 librknnrt.so 到板端
adb push runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib
# 进入板端
adb shell
# 赋予可执行权限
chmod +x /usr/bin/rknn_server
chmod +x /usr/bin/start_rknn.sh
chmod +x /usr/bin/restart_rknn.sh
# 重启 rknn_server 服务
restart_rknn.sh
# 再次检查 rknn_server 版本
strings /usr/bin/rknn_server | grep -i "rknn_server version"
# 再次检查 librknnrt.so 版本
strings /usr/lib/librknnrt.so | grep -i "librknnrt version"
7. 【RKNN部署】YOLOv8 模型 RKNPU 部署示例
7.1 将pt模型导出onnx中间格式
(注意:这一步在Windows PC电脑上进行)
YOLOv8模型导出方法步骤请参考4.7节完成。
将导出的模型文件my_yolov8n.onnx
拷贝到RKNN开发机的项目中,文件保存路径如下:
/Project/rknn_model_zoo/examples/yolov8/model/my_yolov8n.onnx
可以使用WinSCP工具把文件从Windows系统发送到Linux系统,需要将设备都连接到同一个局域网内,WinSCP安装方法参考8.3节。
7.2 模型onnx格式转换成rknn格式
(注意:这一步在RKNN开发机Ubuntu PC电脑上进行)
# 激活toolkit2虚拟环境
conda activate toolkit2
# 进入RKNN model zoo 项目仓库yolov8模型转换python示例,注意检查你的实际项目路径
cd /Project/rknn_model_zoo/examples/yolov8/python
# 执行模型onnx to rknn 转换
# 第1个参数:加载的.onnx模型路径
# 第2个参数:计算芯片平台系列型号,例如目前支持rk3562/rk3566/rk3568/rk3576/rk3588/rk1808/rv1109/rv1126
# 第3个参数(选填):量化类型i8/u8/fp,其中i8/u8是执行量化,fp是不量化,默认是i8(即int8量化)
# 第4个参数(选填):导出的.rknn模型路径,默认输出的文件路径为../model/yolov8.rknn
python convert.py ../model/my_yolov8n.onnx rk3588
# or
python convert.py ../model/my_yolov8n.onnx rk3588 i8 ../model/my_yolov8n.rknn
7.3 开发机Python_Demo连板推理
(注意:后面步骤均在RKNN开发机Ubuntu PC电脑上进行,且确保已按照6.1节的步骤以ADB方式连接到RK3588开发板)
修改RKNN Model Zoo 模型库中官方提供的Python Demo推理脚本yolov8.py,文件路径如下:
/Project/rknn_model_zoo/examples/yolov8/python/yolov8.py
如果是使用自己训练的模型,需要手动在脚本里面修改以下几个参数:
- OBJ_THRESH:置信度阈值,用于筛选出较高置信度的框。阈值越大,出来的框准确度较高,框的数量越少;阈值越小,框的数量越多,但误检的框也更多。
- NMS_THRESH:非极大值抑制,用于抑制重叠率高的框。阈值越高,允许更多重叠率高的框;阈值越小,抑制更多重叠率高的框,过低的阈值也可能会导致漏检。
- IMG_SIZE:图片输入模型推理时强制resize的尺寸,必须和训练时设置的一致,且与推理前加载的新图片尺寸无关。
- CLASSES:对象类别名称,一般与训练时的数据集中检测对象标注的类别名称一致。
- coco_id_list:和对象类别名称classes绑定的ID编号。
笔者这里使用的是官方的yolov8n模型,没有用其他数据集二次训练,所以后面三个参数在yolov8.py实例脚本中默认给出了一致的内容,如上图的一共90个检测类,如果对推理结果的检出框的效果不满意,可以试着修改前两个阈值进行调整,自行排查原因。
# 终端输入命令,在python文件夹下执行连板推理Python Demo
cd /Project/rknn_model_zoo/examples/yolov8/python
# 显示推理结果图片
python yolov8.py --model_path ../model/my_yolov8n.rknn --target rk3588 --img_show
# 保存推理结果图片
python yolov8.py --model_path ../model/my_yolov8n.rknn --target rk3588 --img_save
# 推理转换前的onnx模型,运行在此RKNN开发机的CPU,仅用于推理效果的对比
python yolov8.py --model_path ../model/my_yolov8n.onnx --img_show
可以看到模型经过int8量化后,检测框的位置基本一致,置信度也仅下降0.02左右(左边是.onnx模型,右边是.rknn模型)
7.4 RKNN模型精度评估(可选)
使用COCO 2017数据集对RKNN模型进行精度评估
# 进入 rknn_model_zoo/datasets/COCO 目录
cd /Project/rknn_model_zoo/datasets/COCO
# 运行 download_eval_dataset.py 脚本,下载 COCO 数据集
python download_eval_dataset.py
进行数据集精度评估时,需要指定 --coco_map_test
参数,并指定评估数据集路径 --img_folder
# 请先安装 pycocotools ,使用清华镜像源下载速度快
pip install pycocotools -i https://pypi.tuna.tsinghua.edu.cn/simple
# 进入 rknn_model_zoo/examples/yolov8/python 目录
cd ../../examples/yolov8/python
# 运行 yolov8.py 脚本
python yolov8.py \
--model_path ../model/yolov8.rknn \
--target rk3588 \
--img_folder ../../../datasets/COCO/val2017 \
--coco_map_test
(RKNN模型性能评估和内存评估等功能未测试,暂时先跳过)
7.5 板端C_Demo调用NPU推理
将C/C++ 源代码编译成可执行文件,编译之前先修改Project/rknn_model_zoo
目录下的build-linux.sh
脚本
即在脚本的开头#!/bin/bash
之后插入一行,指定编译器的路径 GCC_COMPILER 为本地的 GCC 编译器绝对路径,例如:
# 参考第5.3.2节安装的GCC编译器路径
# 必须要用系统绝对路径,而不是相对路径,不然会报错显示找不到,这里坑死我了
GCC_COMPILER=<your_path>/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
# 例如:
GCC_COMPILER=/home/galitao/RKNN/Project/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
执行build_linux.sh
脚本,编译示例程序
# 进入 rknn_model_zoo 目录
cd Project/rknn_model_zoo
# 运行 build-linux.sh 脚本
# 用法:./build-linux.sh -t <target> -a <arch> -d <build_demo_name> [-b <build_type>] [-m]
# -t : target (rk356x/rk3588) # 平台类型,rk3568/rk3566 都统一为rk356x
# -a : arch (aarch64/armhf) # 板端系统架构
# -d : demo name # 对应 examples 目录下子文件夹的名称,如yolov8、mobilenet
# -b : build_type(Debug/Release) # 默认是Release
# -m : enable address sanitizer, build_type need set to Debug
sudo bash ./build-linux.sh -t rk3588 -a aarch64 -d yolov8
编译完事后,会在Project/rknn_model_zoo
目录下生成install
文件夹,里面存放的文件如下:
install
└── rk3588_linux_aarch64 # rk3588平台
└── rknn_yolov8_demo
├── lib # 依赖库
│ ├── librga.so
│ └── librknnrt.so
├── model # 模型推理材料
│ ├── bus.jpg # 测试照片
│ ├── coco_80_labels_list.txt # 检测类别
│ └── my_yolov8n.rknn # 模型文件
├── rknn_yolov8_demo # 可执行文件
└── rknn_yolov8_demo_zero_copy # 零拷贝调用API的可执行文件
将rknn_yolov8_demo
整个文件夹,用ADB推送到开发板上
# 推送到开发板上,自己新建或找个路径存放即可
adb push install/rk3588_linux_aarch64/rknn_yolov8_demo /rknn/rk3588_yolov8_c_demo/
到板端运行C demo模型推理的可执行文件
# 使用adb远程登录到开发板终端
adb shell
# 进入新建的目录下
cd /rknn/rk3588_yolov8_c_demo/
# 设置依赖库环境
export LD_LIBRARY_PATH=./lib
# 运行可执行文件
./rknn_yolov8_demo model/my_yolov8n.rknn model/bus.jpg
dir # 查看当前目录下的文件如下,生成了一张out.png图片
# lib model out.png rknn_yolov8_demo rknn_yolov8_demo_zero_copy
# 使用快捷键【Ctrl】+【D】退出adb远程登录
回到Ubuntu PC终端上用adb拉取刚刚在开发板上生成的结果图片
# 拉取out.png图片到rknn_model_zoo目录下
adb pull /rknn/rk3588_yolov8_c_demo/out.png .
板端C_demo检测结果和连板仿真Python_demo检测结果一致(左边是Python_demo推理结果,右边是C_demo推理结果)
8. 其他工具
8.1 Windows安装wget
介绍:wget是一个Linux命令行工具,用于从Web服务器上下载文件,官方提供了wget for Windows的工具包。
常见报错:Windows未安装好时,在CMD使用wget命令一般会提示:'wget' 不是内部或外部命令,也不是可运行的程序
①从官网下载64位exe文件:GNU Wget 1.21.3 for Windows (eternallybored.org)
②将下载的wget.exe
文件复制到C:\Windows\System32
路径下即可
③验证是否安装成功,使用cmd终端输入命令wget
会提示缺少链接参数,或使用wget --version
查看安装版本。
8.2 Windows安装git
浏览器进入Git官网下载页面,选择下载Windows的安装包。
启动安装包,默认选项一路点下一步即可,提示添加Path的时记得勾选,安装完之后进去系统环境变量查看是否有该项。
在cmd终端输入git -v
检查安装的版本
8.3 Windows安装WinSCP(与Linux系统文件互传)
在WinSCP官网Download页面下载安装包,即可免费使用,文件可以拖拽式传输,十分方便。
初次使用提示登录站点,默认使用SFTP协议,22端口,输入局域网内的Linux系统设备的IP地址、用户名、密码即可。
如果遇到IP地址、用户名、密码都对,但显示对方拒绝连接,可能是Linux平台未安装或未开启SSH服务,请开启SSH服务后重试。
下面以 Ubuntu 22.04 LTS为例安装并启动SSH服务:
# 更新软件包
sudo apt-get update
# 安装 OpenSSH 服务器(一般安装完会自动开启ssh服务)
sudo apt-get install openssh-server
# 手动开启 SSH 服务
sudo /etc/init.d/ssh start
# 检查 SSH 服务状态
sudo systemctl status ssh
参考资料:
PyCharm+Miniconda3安装配置教程
YOLOv8 CUDA12.1安装+环境配置教程
2024最新的YOLOv8安装配置全流程
Conda 环境的本质
Miniconda 安装及使用
ubuntu22.04 怎么开启SSH服务