在瑞芯微RK3588上部署YOLOv8目标检测模型

1. RKNN Toolkit2环境

Rockchip RKNN Toolkit2分为以下三部分:

  1. RKNN Toolkit2: 基于python,在主机上运行模型转换、模型推导
  2. RKNN Toolkit-lite2: 基于python,在设备上运行模型推导
  3. RKNPU2: 基于C/C++,在设备上运行模型推导

1.1 安装主机开发环境

设备端文件系统用ubuntu20.04/22.04或debian11,主机系统推荐使用ubuntu20.04,可以确保glibc版本兼容。
如果设备端文件系统版本较低,主机系统相应降低aarch64架构的gilbc/dl/rt等C库的版本,或者将系统版本降低到与设备系统版本一致。

1. 安装编译工具

sudo apt install -y build-essential cmake gdb
sudo apt install -y gcc-10 g++-10

2. 安装交叉编译工具链

sudo apt install -y gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu

3. 安装工具

sudo apt install git adb ssh rsync

4. 下载RKNN Toolkit2

git clone https://github.com/airockchip/rknn-toolkit2.git

以下流程基于tag v2.2.0

建议同时下载以下几个库

# 常用模型部署的demo,后面的代码这要参考RKNN Toolkit2的examples和这个库
git clone https://github.com/airockchip/rknn_model_zoo.git
# Rockchip的yolov8模型导出工具
git clone https://github.com/airockchip/ultralytics_yolov8.git
# RGA是Rockchip的2D加速硬件,librga是RGA的调用接口,用来完成色彩空间转换/resize/padding/osd等图像预处理和后处理相关的功能
# 验证阶段可以用opencv完成这些功能,实际部署时应该调用RGA硬件加速
git clone https://github.com/airockchip/librga.git

5. 安装python环境

# 添加python的apt源
sudo apt update -y
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update -y

# 安装python3.11
sudo apt install -y python3.11
# 设置python3.11为当前python3
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
# 安装pip3
sudo apt install -y python3-pip

6. 安装RKNN Toolkit2

# 安装依赖包
pip3 install -r rknn-toolkit2/rknn-toolkit2/packages/requirements_cp311-2.2.0.txt
# 安装RKNN Toolkit2
pip3 install rknn-toolkit2/rknn-toolkit2/packages/rknn_toolkit2-2.0.0b0+9bab5682-cp311-cp311-linux_x86_64.whl
# 重新安装opencv和numpy,不然运行时会报错
pip3 install opencv-python-headless
pip3 install numpy==1.26.4

如果下载速度比较慢,在pip3 install命令最后添加参数-i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后运行python3加载rknn检查是否安装成功

admin@rknn-toolkit:/work$ python3 
Python 3.11.10 (main, Sep  7 2024, 18:35:42) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rknn.api import RKNN
>>> rknn = RKNN()
I rknn-toolkit2 version: 2.0.0b0+9bab5682
>>> exit()

1.2 设备端开发环境

设备端的文件系统一般已经安装好基本的开发环境,如果没有安装,可以按上述步骤1, 3, 5执行即可。

1. 安装RKNN Toolkit-lite2

检查设备端python版本

~$ python3 --version
Python 3.9.2

拷贝rknn-toolkit2/rknn-toolkit-lite2/packages/rknn_toolkit_lite2-2.2.0-cp39-cp39-linux_aarch64.whl到设备上,用pip安装

pip3 install rknn_toolkit_lite2-2.2.0-cp39-cp39-linux_aarch64.whl

安装完成后运行python3加载rknnlite检查是否安装成功

~$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rknnlite.api import RKNNLite
>>> rknn = RKNNLite()
W rknn-toolkit-lite2 version: 2.2.0
>>> 

2. 模型裁减与导出

模型裁减与导出参考文章YOLOv8目标检测算法移植

也可以使用Rockchip开源的YOLOv8库. 基本思路完全一样:删除不适合用NPU加速的检测头(保留检测头的第一层卷积,删除dfl及之后的检测层).

不同的地方有:

  1. Rockip的导出功能将每个尺度的置信度输出从一个输出改为两个输出: 类型置信度和类型索引。后处理需要对每个grid搜索最大置信度作为类别置信度,并将最大置信度的数组下标作为类别索引。在CPU上运行时,短循环会频繁打断CPU pipeline,运行效率不高。把这个操作放到NPU上运行应该有一定的性能提升。
  2. 输出结果的排列顺序不同: Rockchip保持原有的NCHW(batch, channel, height, width)排列方式,C++后处理计算缓存偏移时略微有点别扭。

3. 模型转换和模型推理

模型转换只能在主机上通过RKNN Toolkit2完成,如下图的前四个步骤所示。

创建RKNN对象
加载模型文件
build: 量化
保存rknn模型文件
释放RKNN对象

上图中加载的模型可以是pytorch/tensorflow/caffe/onnx等非rknn模型文件。加载非rknn模型文件并进行build(量化)只能在主机上通过RKNN Toolkit2实现。但是模型推理在主机上和设备上都可以执行

创建RKNN对象
加载模型文件
build: 量化
加载测试图片
推理
后处理
释放RKNN对象

也可以直接加载量化之后的rknn模型文件,在主机上通过RKNN Toolkit2加载,也可以在设备上通过RKNN Toolkit-lite2加载。

创建RKNN对象
加载RKNN模型文件
加载测试图片
推理
后处理
释放RKNN对象

基于python的模型转换和模型推理过程并不复杂,详细的代码流程参考RKNN Toolkit2的文档和examples。

模型推理之前对图像的预处理功能比较固定。YOLO模型的前处理是色彩空间转换、缩放和padding三个步骤,可以通过opencv或者2D加速器完成。

NPU支持的算子比较全,模型转换过程不太容易出现算子不被支持的情况。更常见的问题是参数或中间计算结果出现outlier,导致算法精度下降。

模型推理之后的后处理过程与模型输出和模型要完成的任务息息相关,不同模型和同一模型的不同导出方式,都会导致模型后处理差异较大。模型后处理的实现比较琐碎,出于调试和部署两方面的需要,一般要实现python和C++两个版本,两个版本对量化的处理不完全相同。但是只要对模型的网络结构特别是网络输出有比较好的理解,后处理的实现难度并不大。Rockchip的examples中有各种模型的python和C++后处理代码供参考,也可以参考YOLO算法移植系列文章中的对后处理的说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值