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 :
# 下载 miniforge3 安装脚本
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?输入yes2
3
4
5
6
7
8
9
10
可以去 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即可2
3
4
5
激活 Conda 环境:
conda activate YOLO11-RKNN-Toolkit2
# 激活之后在命令行前面会出现:(YOLO11-RKNN-Toolkit2)2
3
安装依赖环境:
# 安装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/simple2
3
4
5
安装完成之后,退出 YOLO11-RKNN-Toolkit2 环境:
conda deactivate创建yolo11环境
创建并激活 Conda 环境:Tspi3-YOLO11(这里推荐使用 python 3.10 版本)
# 创建环境
conda create -n Tspi3-YOLO11 python=3.10
# 遇到Proceed ([y]/n)?
# 输入y即可2
3
4
5
激活 Conda 环境:
conda activate Tspi3-YOLO11
# 激活之后在命令行前面会出现:(TaishanPi3-YOLO11)2
3
安装依赖工具,为 YOLO11 做准备:
pip install ultralytics onnx onnxscript -i https://mirrors.aliyun.com/pypi/simple测试:
(Tspi3-YOLO11) lipeng@host:~/workspace$ yolo -v
8.3.2482
模型转换
接下来我么需要执行三个重要的步骤:
- 拉取pt文件。
- 使用rockchip优化过的yolo11项目导出onnx模型。
- 使用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.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文件路径,进行填写。
(Tspi3-YOLO11) lipeng@host:~/workspace/ultralytics_yolo11$ git diff
diff --git a/ultralytics/cfg/default.yaml b/ultralytics/cfg/default.yaml
index 97f7239e0..fa1f915bb 100644
--- a/ultralytics/cfg/default.yaml
+++ b/ultralytics/cfg/default.yaml
@@ -5,7 +5,7 @@ task: detect # (str) YOLO task, i.e. detect, segment, classify, pose, obb
mode: train # (str) YOLO mode, i.e. train, val, predict, export, track, benchmark
# Train settings -------------------------------------------------------------------------------------------------------
-model: yolo11n.pt # (str, optional) path to model file, i.e. yolo11n.pt, yolo11n.yaml
+model: /home/lipeng/workspace/yolo11n.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 supplied2
3
4
5
6
7
8
9
10
11
12
13
14
设置导出路径为当前目录:
export PYTHONPATH=./使用脚本开始导出 ONNX模型:
python ./ultralytics/engine/exporter.pyONNX转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/yolo11/python 目录下:
cd rknn_model_zoo/examples/yolo11/python运行 rknn_model_zoo/examples/yolo11/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/yolo11n.onnx rk3576 i82
3
4
5
6
platform选择的平台有rk3562,rk3566,rk3568,rk3576,rk3588,rv1126b,rv1109,rv1126,rk1808可选择
dtype:
- 选择
i8或fp适用于rk3562,rk3566,rk3568,rk3576,rk3588,rv1126b这些平台- 选择
u8或fp适用于rv1109,rv1126,rk1808这些平台
执行成功之后,会在 rknn_model_zoo/examples/yolo11/model 目录下生成一个 .rknn 模型文件。
Demo编译
说明
在 rockchip官方的开源项目 中使用的是C++编写的Demo,可以通过运行
rknn_model_zoo/build-linux.shrknn_model_zoo/build-android.sh
这两个脚本(将交叉编译路径替换为实际路径)直接编译示例代码。
在部署目录中生成一个install/demo_Linux_aarch64 或 install/demo_Android_aarch64 文件夹,包含 imgenc、llm、demo 和 lib 文件夹。
退出环境
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-gnu2
编译
进入项目目录:
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相关的YOLO11命令即可。:
./build-linux.sh -t rk3576 -a aarch64 -d yolo112
3
4
5
6
7
8
9
10
11
注意
<demo name>这个参数要和rknn_model_zoo/examples中的目标文件夹名称保持一致,因为依靠此参数选择编译的Demo。
最终生成 install/ 文件目录如下:
install/
`-- rk3576_linux_aarch64
`-- rknn_yolo11_demo
|-- lib
| |-- librga.so
| `-- librknnrt.so
|-- model
| |-- bus.jpg
| |-- coco_80_labels_list.txt
| `-- yolo11.rknn
|-- rknn_yolo11_demo
`-- rknn_yolo11_demo_zero_copy
4 directories, 7 files2
3
4
5
6
7
8
9
10
11
12
13
14
板端Demo演示
转移文件
接下来我们需要将 rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolo11_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 rknn_model_zoo/install/rk3576_linux_aarch64/rknn_yolo11_demo /home/lckfb/板端运行
详细请阅读:https://github.com/airockchip/rknn_model_zoo/blob/main/examples/yolo11/README.md
我们进入泰山派开发板的终端,然后进入 rknn_yolo11_demo/ 目录:
# 进入目录
cd rknn_yolo11_demo/2
设置动态库路径:(为当前目录下的 ./lib 目录下 )
# 设置动态库路径 (非常重要,否则会报错误)
export LD_LIBRARY_PATH=./lib2
赋予demo可执行权限
sudo chmod +x rknn_yolo11_demo运行Demo:
# 命令格式:./rknn_yolo11_demo <RKNN模型路径> <传入的图片路径>
sudo ./rknn_yolo11_demo model/yolo11.rknn model/bus.jpg2
最终会在
rknn_yolo11_demo同级目录中运生成一个out.png图片,保存有最终识别之后的成果。