YOLO-v11
最终决定使用YOLO-v11
搭建红树林检测系统.
- 工作目录:
luge-wsl24
的/home/ray/ultralytics/share/code
. - github仓库:
https://github.com/JamesRay0713/mds
环境准备
- 配置Ubuntu: 可参考, 配置ssh转发、代理、conda、poetry、docker、Nvidia-container-toolkit等.
- 拉取github仓库到工作目录
ws=$HOME/ultralytics/share/code
. - 配置python环境用于系统的开发与测试:
cd $ws; poetry install
- 拉取
YOLOv11
官方docker镜像用于模型的训练与推理:sudo docker pull ultralytics/ultralytics:latest
sudo docker run -itd --name yolo11 --ipc=host --gpus all -v /home/ray/ultralytics/share:/ultralytics/share ultralytics/ultralytics:latest /bin/bash$HOME/ultralytics/share
是共享目录.
训练
数据准备
- 以后的标注工作,
- 图像是640* 640的, 输出数据格式改用
YOLO
. - 图像是大大小小的, 输出格式用COCO.
- 图像是640* 640的, 输出数据格式改用
- 转换格式: 若已有数据格式为
COCO
, 先将其复制到/home/james/ultralytics/share/datasets
中, 然后执行:python
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="/ultralytics/share/datasets/mangrove_coco/annotations", save_dir="/datasets/train01-624imgs", cls91to80=False)
convert_coco(labels_dir="/ultralytics/share/datasets/train2_25imgs_reinforce_performance/annotations", save_dir="/datasets/train03-temp", cls91to80=False) - 要保证你的这批数据的
存放位置
和组织形式
如下:/datasets/train01-624imgs
|-- images
| |-- train
| | |-- pic01.png
| | `-- ...
| `-- val # 同train. 另外train和val也可合并.
`-- labels
|-- train
| |-- pic01.txt
| `-- ...
`-- val # 同train. 另外train和val也可合并. - 最后确保png的数量等于txt
for img in /datasets/train02-150imgs/images/*.png; do
txt="/datasets/train02-150imgs/labels/$(basename "${img%.png}.txt")"
[ ! -f "$txt" ] && echo "$img"
done
开始训练
- 给
/ultralytics/ultralytics/models/yolo/detect/train.py
添加comet日志功能:logger = 'Comet'
import comet_ml; comet_ml.login() - 修改训练配置信息:
/ultralytics/ultralytics/cfg/datasets/mangrove_after_coco8.yaml
- 根据训练参数手册定制并执行训练命令:
cd /ultralytics
train_name="train04-from-train01" # "train01-from-yolo11l"
rm -r /ultralytics/runs/detect/$train_name* || true
yolo detect train \
model="/ultralytics/runs/detect/train01-from-yolo11l/weights/best.pt" \
data="/ultralytics/ultralytics/cfg/datasets/mangrove_after_coco8.yaml" \
epochs=120 \
patience=20 \
batch=0.8 \
imgsz=640 \
save_period=20 \
device=0 \
name="$train_name"\
single_cls=False \
cos_lr=True \
fraction=0.8 \
lr0=0.01 \
cls=0.5 \
hsv_h=0.02 \
hsv_s=0.7 \
hsv_v=0.4 \
degrees=20 \
scale=0.5 \
flipud=0.3 \
mixup=0.2 \
erasing=0.4 \
| tee "share/logs/train04-from-train01-241010.log" - 训练过程查看实时图表:
- 先打开新终端执行
tensorboard --logdir /ultralytics/runs/detect/$name
(所有训练结果均存放在这个目录); - 然后确保vscode的
port 6006
和训练主机的port 6006
形成了映射; - 最后浏览器打开:
http://localhost:6006/
- 先打开新终端执行
导出模型
|
推理
推理前的配置
参数设置的官方参考.
本项目前往$ws/infer/infer_in_dkr.py#perform_infer
函数进行设置, 其中重点关注模型pt文件
的更新.
执行推理
可在容器中使用yolo predict
命令来推理.
而我编写了推理脚本, 使用方法为:
- 在
$HOME/.zshrc
构造快捷指令, 参见$ws/utils/zshrc_with_custom_func.sh # infer()
. - 执行
infer -i "imgs_path" [-v "vec_path"]
即可.
评估SAHI加持的推理
先说结论: 在
切图-推理-修正坐标-重绘(非必须)
的流程中, 从执行效率和配置的自由度来讲, SAHI不如用PyQt
自造轮子.
对超大分辨率图像进行目标检测的任务中, 使用SAHI库 + YOLOv11
整合了切割、推理、修正像素坐标、重绘大图4个模块.
✅ 优点: 不用重复造轮子
❎ 缺点: yolo infer
的更多配置参数无法用到; 且batch_size
目前只能为1.
SAHI的切图模块
底层来自PIL.Image
支持, 并用Image.MAX_IMAGE_PIXELS = None
解除限制.
文件名 | 文件大小 | 内存峰值 | 切图数量 | 切割耗时 |
---|---|---|---|---|
PixPin |
4M | 10M | 6 | 0.05 s |
A1区1号 |
2G | - | 4453 | 14.22 s |
D区8号 |
2.9G | 55G | 16113 | 44.18 s |
D区7号 |
4G | 67G | 15375 | 55.18 s |
- 图片越大, 切图功能结束后,
恢复期
耗时也越多.- 多核运行.
对比pyqt5-Qimage的切图模块
文件名 | 文件大小 | 内存峰值 | 切图数量 | 切割耗时 |
---|---|---|---|---|
PixPin | 4M | - | 6 | 0.68 s |
A1区1号.tif | 2G | - | 4453 | 14.85 s |
D区8号.tif | 2.9G | 23G | 16113 | 43.94 s |
D区7号.tif | 4G | 43G | 15375 | 50.12 s |
惠东核查01号 | 8.9G | 52G | 34161 | 137.06 s |
不存在
恢复期
; 单核运行, 速度更快.
评估超参数–IOU, 子图重叠率, 重叠过滤像素阈值, 置信度
⚠️ 先说结论: 推理的超参数设置为, 切片的重叠率
0.2
, IOU0.1
, confidence0.4
前提: 模型是yolov11-train04-from-train01
, 输入是/home/james/ultralytics/share/imgs_to_be_infer/A1区1号.tif
IOU | 识别bbox数 | 子图重叠率 | 子图数量 | 过滤重叠阈值 | 置信度 |
---|---|---|---|---|---|
0.7 | - | 0.0 | 3630 | - | 0.3 |
0.5 | 6052 | 0.0 | 3630 | - | 0.3 |
0.3 | 5798 | 0.0 | 3630 | - | 0.3 |
0.2 | 5726 | 0.0 | 3630 | - | 0.3 |
0.1 | 5681 ✅ | 0.0 | 3630 | - | 0.3 |
0.1 | 8858 | 0.2 | 5658 | - | 0.3 |
0.1 | 6258 | 0.2 | 5658 | 30px | 0.3 |
0.1 | 3083 | 0.2 | 5658 | 30px | 0.8 |
0.1 | 4388 | 0.2 | 5658 | 100px | 0.4 |
基于paddleYOLO的coding (摒弃)
资料:PaddleYOLO项目;官方文档
源码更改记录表
- ./configs:
A
:- configs/datasets/mangrove_coco.yml,
- configs/datasets/mangrove_voc.yml,
- configs/yolov5/yolov5_s_80e_ssod_finetune_coco_mangrove.yml
M
:- configs/yolov5/base/yolov5_cspdarknet.yml
- ./dataset:
A
: dataset/mangrove/
- ./tools
环境准备:docker+paddle
注:容器里的
/paddle/
用于挂载和主机通信。另外一定要加--gpus=all
参数。8040端口用于paddle的可视化工具。
数据准备
资料:见
- 进入工作目录
/paddle/PaddleYOLO/
, 把自定义的voc类型训练数据复制进dataset/mangrove/
- 新增Dataset配置文件及其对应的数据目录
- 改为规范的voc组织结构:
bash dataset/mangrove/data_to_voc.sh
, 并配置configs/datasets/mangrove_voc.yml
注意,bug点:
name: VOCDataSet
要换成!VOCDataSet
- 增加规范的coco组织结构:
bash dataset/mangrove/data_voc_to_coco.sh
, 并配置configs/datasets/mangrove_coco.yml
- 改为规范的voc组织结构:
- 新增模型配置文件:涉及到选择模型,先选一个有预训练模型的:
configs/yolov5/yolov5_s_80e_ssod_finetune_coco_mangrove.yml
- 准备新锚框:
- 因为该项目属于密集的小目标监测,所有的锚框像素范围需要很小才行。
- 计算新锚框:
python tools/anchor_cluster.py -v false -c configs/yolov5/yolov5_s_80e_ssod_finetune_coco_mangrove.yml
- 更新到配置文件的锚框部分:
configs/yolov5/_base_/yolov5_cspdarknet.yml
配置模型
注:默认学习率是适配多GPU训练(8x GPU),若使用单GPU训练,须对应调整学习率(例如,除以8)。更多使用问题,请参考FAQ
细细设置6个配置文件(1主5副)
基于paddleDetection中的SOD
直接调用其训练、验证、推理工具
系统环境:4090显卡-24G显存。
训练
- 工具路径:
PaddleDetection/tools/train.py
推理
- 推理命令:
python /paddle/PaddleDetection/deploy/python/infer.py \
--model_dir=/paddle/PaddleDetection/deploy_inference_model/ppyoloe_crn_l_80e_sliced_visdrone_640_025 \
--image_dir=$test_img_dir_container \
--output_dir=/paddle/output/ \
--device=GPU \
--save_results --save_images False
--batch_size 32
## 更多的一些重要参数节选
--save_results # 把所有预测框存到`output_dir`下的`bbox.json`中
--save_images True # 默认会把带框的推理图存储下来
--cpu_threads 1
--run_mode paddle #/trt_fp32/trt_fp16/trt_int8
--threshold 0.5
--batch_size 1 # 有大量图需要推理时,可增大batch提高并行能力。能增多大取决于显存。但似乎总推理时间并没有减少。
--slice_infer --overlap_ratio 0.0 0.0 # 将不再使用这俩参数 - 推理性能测试
见性能对比