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模型转换
接下来我么需要执行三个重要的步骤:
- 拉取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-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.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/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:
- 选择
i8或fp适用于rk3562,rk3566,rk3568,rk3576,rk3588,rv1126b这些平台- 选择
u8或fp适用于rv1109,rv1126,rk1808这些平台
执行成功之后,会在rknn_model_zoo/examples/yolov8_seg/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-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图片,保存有最终识别之后的成果。