YOLO-v11

最终决定使用YOLO-v11搭建红树林检测系统.

  • 工作目录: luge-wsl24/home/ray/ultralytics/share/code.
  • github仓库: https://github.com/JamesRay0713/mds

环境准备

  1. 配置Ubuntu: 可参考, 配置ssh转发、代理、conda、poetry、docker、Nvidia-container-toolkit等.
  2. 拉取github仓库到工作目录ws=$HOME/ultralytics/share/code.
  3. 配置python环境用于系统的开发与测试: cd $ws; poetry install
  4. 拉取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.
  • 转换格式: 若已有数据格式为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

开始训练

  1. /ultralytics/ultralytics/models/yolo/detect/train.py添加comet日志功能:
    logger = 'Comet'
    import comet_ml; comet_ml.login()
  2. 修改训练配置信息: /ultralytics/ultralytics/cfg/datasets/mangrove_after_coco8.yaml
  3. 根据训练参数手册定制并执行训练命令:
    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"
  4. 训练过程查看实时图表:
    • 先打开新终端执行 tensorboard --logdir /ultralytics/runs/detect/$name (所有训练结果均存放在这个目录);
    • 然后确保vscode的port 6006和训练主机的port 6006形成了映射;
    • 最后浏览器打开: http://localhost:6006/

导出模型

best_path='/ultralytics/runs/detect/train01-from-yolo11l/weights/best.pt'
yolo export model=$best_path format=onnx

推理

推理前的配置

参数设置的官方参考.
本项目前往$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
  1. 图片越大, 切图功能结束后, 恢复期耗时也越多.
  2. 多核运行.
对比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
  • 新增模型配置文件:涉及到选择模型,先选一个有预训练模型的: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 # 将不再使用这俩参数
  • 推理性能测试
    性能对比

Static Badge Static Badge Static Badge Static Badge
Copyright © 2023-2024 Raymond H., All Rights Reserved.