YOLO11介绍

YOLO11 是 Ultralytics 体系的新一代 YOLO 目标检测/分割/姿态等任务模型迭代版本,延续了 YOLO 系列“一阶段、端到端、实时”的设计思路,通过改进网络结构、特征融合与训练/推理策略,在同等算力下提升精度与速度的权衡,并提供从 n/s/m/l/x 等不同规模以适配端侧到服务器的部署需求。

💡 提示

在 YOLO 相关模型命名里,n / s / m / l / x 这类字母通常表示模型规模(size) ,也就是网络的宽度/深度配置不同,带来参数量、计算量和精度/速度的权衡。

常见含义:

  • n = nano:最小、最快、精度相对低,适合端侧/低算力
  • s = small:小型
  • m = medium:中型
  • l = large:大型
  • x = xlarge / extra-large:最大、最慢、精度通常最

目标

我们将部署模型到泰山派3M-RK3576板子上,使用 rknn_model_zoo 的官方Demo进行演示。

环境准备

  • 主机环境:Ubuntu22.04(x86)
  • 开发板:泰山派3M-RK3576
  • 数据线:连接PC和开发板用于ADB传输文件。

安装miniforge3

为了防止在一个主机中不同的环境造成的 python 环境问题,我们使用 miniforge3 管理。

安装 miniforge3 :

# YOLO11-分割模型
wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh

# 运行安装脚本
bash Miniforge3-Linux-x86_64.sh

# 1.按下Enter回车继续运行
# 2.然后使用向下箭头,向下滚动查看协议
# 3.最后输入yes
# 4.提示Proceed with initialization?输入yes

可以去 https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/ 这个目录下查看目前最新的 .sh 文件名。

初始化 conda 环境变量:

source ~/miniforge3/bin/activate

成功之后,命令行前方会显示一个 (base)

创建rknn-toolkit2环境

创建并激活 Conda 环境:YOLO11-RKNN-Toolkit2(这里推荐使用 python 3.10 版本)

后面我们将ONNX模型转化为RKNN模型的时候需要用到。

# 创建环境
conda create -n YOLO11-RKNN-Toolkit2 python=3.10

# 遇到Proceed ([y]/n)?
# 输入y即可

激活 Conda 环境:

conda activate YOLO11-RKNN-Toolkit2

# 激活之后在命令行前面会出现:(YOLO11-RKNN-Toolkit2)

安装依赖环境:

# 安装rknn-toolkit2
pip install rknn-toolkit2 -i https://mirrors.aliyun.com/pypi/simple

# 安装指定版本onnx==1.18.0
pip install onnx==1.18.0 -i https://mirrors.aliyun.com/pypi/simple

安装完成之后,退出 YOLO11-RKNN-Toolkit2 环境:

conda deactivate

创建yolo11环境

创建并激活 Conda 环境:Tspi3-YOLO11(这里推荐使用 python 3.10 版本)

# 创建环境
conda create -n Tspi3-YOLO11 python=3.10

# 遇到Proceed ([y]/n)?
# 输入y即可

激活 Conda 环境:

conda activate Tspi3-YOLO11

# 激活之后在命令行前面会出现:(TaishanPi3-YOLO11)

安装依赖工具,为 YOLO11 做准备:

pip install ultralytics onnx onnxscript -i https://mirrors.aliyun.com/pypi/simple

测试:

(Tspi3-YOLO11) lipeng@host:~/workspace$ yolo -v
8.3.248

模型转换

接下来我么需要执行三个重要的步骤:

  1. 拉取pt文件。
  2. 使用rockchip优化过的yolo11项目导出onnx模型。
  3. 使用rknn-toolkit2将onnx模型转化为能硬件加速的RKNN模型。

拉取pt文件

所谓的 .pt 文件,就是训练好的 YOLO11 模型权重(参数),只有拿到这个文件,才能去识别目标。

否则即使有 YOLO11 的代码,也只是一个空架子,无法完成检测。

https://github.com/ultralytics/assets/releases/ 这个地址中,有着 ultralytics 官方给我们提供的 .pt 权重文件,我们只需要下载需要的:

wget https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-seg.pt

导出ONNX模型

我们接下来就要拉取 Rockchip 官方修改的 ultralytics_yolo11项目,针对 RKNPU 进行了专门的适配:

  • 修改输出结构, 移除后处理结构. (后处理结果对于量化不友好)
  • dfl 结构在 NPU 处理上性能不佳,移至模型外部的后处理阶段,此操作大部分情况下可提升推理性能。
  • 模型输出分支新增置信度的总和,用于后处理阶段加速阈值筛选。

详情:https://github.com/airockchip/ultralytics_yolo11/blob/main/RKOPT_README.zh-CN.md

继续使用 Tspi3-YOLO11 环境:

conda activate Tspi3-YOLO11

拉取 airockchip/ultralytics_yolo11 项目:

git clone https://github.com/airockchip/ultralytics_yolo11.git

拉取完成之后,进入目录:

cd ultralytics_yolo11

修改 ultralytics_yolo11/ultralytics/cfg/default.yaml 文件中的 model 为刚刚拉取的 .pt 文件绝对路径

要根据自己的 .pt 文件路径,进行填写。

# Train settings -------------------------------------------------------------------------------------------------------
-model: yolo11n.pt # (str, optional) path to model file, i.e. yolo11n.pt, yolo11n.yaml
+model: /home/lipeng/workspace/yolo11/yolo11n-seg.pt # (str, optional) path to model file, i.e. yolo11n.pt, yolo11n.yaml
 data: # (str, optional) path to data file, i.e. coco8.yaml
 epochs: 100 # (int) number of epochs to train for
 time: # (float, optional) number of hours to train for, overrides epochs if supplied

设置导出路径为当前目录:

export PYTHONPATH=./

使用脚本开始导出 ONNX模型:

python ./ultralytics/engine/exporter.py

ONNX转RKNN

退出 Tspi3-YOLO11 环境:

conda deactivate

进入YOLO11-RKNN-Toolkit2 环境

conda activate YOLO11-RKNN-Toolkit2

接下来我们将使用 rknn_model_zoo 中的 转换脚本 将 ONNX 转换为 RKNN 模型,拉取项目:

git clone https://github.com/airockchip/rknn_model_zoo.git

进入 rknn_model_zoo/examples/yolov8_seg/python 目录下:

特别注意

因为 YOLO11 没有专门的分割案例,我们直接使用 YOLOv8 的案例即可,

cd rknn_model_zoo/examples/yolov8_seg/python

运行 rknn_model_zoo/examples/yolov8_seg/python/convert.py 脚本转化RKNN模型:

# 语法:python3 convert.py onnx_model_path [platform] [dtype] [output_rknn_path]
## platform:[rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b, rv1109, rv1126, rk1808]
## dtype:[i8, fp] for [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b]
## dtype:[u8, fp] for [rv1109, rv1126, rk1808]

python convert.py /home/lipeng/workspace/yolo11/yolo11n-seg.onnx rk3576 i8
  • platform 选择的平台有 rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b, rv1109, rv1126, rk1808 可选择
  • dtype
  1. 选择 i8fp 适用于 rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b 这些平台
  2. 选择 u8fp 适用于 rv1109, rv1126, rk1808 这些平台

执行成功之后,会在 rknn_model_zoo/examples/yolov8_seg/model 目录下生成一个 .rknn 模型文件。

Demo编译

说明

rockchip官方的开源项目 中使用的是C++编写的Demo,可以通过运行

  1. rknn_model_zoo/build-linux.sh
  2. rknn_model_zoo/build-android.sh

这两个脚本(将交叉编译路径替换为实际路径)直接编译示例代码。

部署目录中生成一个install/demo_Linux_aarch64install/demo_Android_aarch64 文件夹,包含 imgencllmdemolib 文件夹。

退出环境

conda deactivate

看到命令行前面出现 (base) 字样就可以了。

安装交叉编译器

我们需要在PC主机上面编译Demo生成文件,在泰山派3M-RK3576的板子上面运行,所以我们直接使用 apt 安装 aarch64-linux-gnu

sudo apt update && \
sudo apt install -y cmake make gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

编译

进入项目目录:

cd rknn_model_zoo/

给予 build-linux.sh 运行权限:

sudo chmod +x ./build-linux.sh

运行编译脚本:

./build-linux.sh -t <target> -a <arch> -d <build_demo_name> [-b <build_type>] [-m] [-r] [-j]
    -t : target (rk356x/rk3576/rk3588/rv1106/rv1126b/rv1126/rk1808)
    -a : arch (aarch64/armhf)
    -d : demo name
    -b : build_type(Debug/Release)
    -m : enable address sanitizer, build_type need set to Debug
    -r : disable rga, use cpu resize image
    -j : disable libjpeg to avoid conflicts between libjpeg and opencv

# 我们运行RK3576相关的命令即可。:
./build-linux.sh -t rk3576 -a aarch64 -d yolov8_seg

注意 <demo name> 这个参数要和 rknn_model_zoo/examples 中的目标文件夹名称保持一致,因为依靠此参数选择编译的Demo。

最终生成 install/ 文件目录如下:

(base) lipeng@host:~/workspace/yolo11/rknn_model_zoo$ tree install
install
`-- rk3576_linux_aarch64
    `-- rknn_yolov8_seg_demo
        |-- lib
        |   |-- librga.so
        |   `-- librknnrt.so
        |-- model
        |   |-- bus.jpg
        |   |-- coco_80_labels_list.txt
        |   `-- yolov8_seg.rknn
        `-- rknn_yolov8_seg_demo

4 directories, 6 files

板端Demo演示

转移文件

接下来我们需要将 rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov8_seg_demo 目录转移到到板子上面:

推荐使用 adb 工具,进行转移,泰山派3m默认开启ADB,或者使用TF卡,ssh或者U盘都可以。

参考:https://wiki.lckfb.com/zh-hans/tspi-3-rk3576/system-usage/debian12-usage/adb-usage.html

adb push yolo11/rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolov8_seg_demo /home/lckfb/

板端运行

详细请阅读:https://github.com/airockchip/rknn_model_zoo/blob/main/examples/yolo11/README.md

我们进入泰山派开发板的终端,然后进入 rknn_yolov8_seg_demo/ 目录:

# 进入目录
cd rknn_yolov8_seg_demo/

设置动态库路径:(为当前目录下的 ./lib 目录下 )

# 设置动态库路径 (非常重要,否则会报错误)
export LD_LIBRARY_PATH=./lib

赋予demo可执行权限

sudo chmod +x rknn_yolov8_seg_demo

运行Demo:

# 命令格式:./rknn_yolov8_seg_demo <RKNN模型路径> <传入的图片路径>
sudo ./rknn_yolov8_seg_demo model/yolov8_seg.rknn model/bus.jpg

最终会生成一个 out.png 图片,保存有最终识别之后的成果。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐