YOLO11 图像分割


1. 任务确认

《YOLO11 使用入门》 简单入门之后,
又在《YOLO11 目标检测》 新建一个简单的 的 目标检测器
那么现在来新建一个简单的人车的图像分割器


2. 数据制作


2.1. 建立数据集文件夹

使用lableme的 多边形 标注,并输入对应的类别名称,保存在和源图同一路径

在工程中新建文件夹 resources/images/seg/json,将所有数据原图均放置于此
在这里插入图片描述
同样简单的5个照片

首先需要建立一个数据配置文件 resources/config/data/yolo11-seg.yaml
里面包含 数据集地址等信息 和 分割类别名称

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../ultralytics-yolo11/resources/images/seg/datasets/images
train: train
val: val
test: test

# Classes
names:
  0: person
  1: car

2.2. 标注

使用 开源的数据标注工具 Labelme

$ pip3 install labelme

/resources/images/seg/json启动 Labelme

$ labelme

在这里插入图片描述
使用工具,选择标记 多边形,按图片标记 人 person 和 车 car

保存为 json 格式,并在同一地址,后续方便转换处理
在这里插入图片描述


2.3. 转化

使用工具脚本 /tool/tool_json2label_seg.py,转换所需的标签
与源图同名,每一行代表一个目标内容,按顺序依次是 类别序号 和 多边形的多个x,y坐标在这里插入图片描述


2.4 分配

对所有标志数据转换后,使用工具脚本/tool/tool_seg2datasets.py进行数据集制作
对所有的图片和标签对应的打乱顺序并划分为训练集和验证集
在这里插入图片描述


3. 配置训练

配置目标检测模型参数 ,参考官方例程的,对应哪个大小模型就选哪个就行了

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11-seg instance segmentation model. For Usage examples see https://docs.ultralytics.com/tasks/segment

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n-seg.yaml' will call yolo11-seg.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 355 layers, 2876848 parameters, 2876832 gradients, 10.5 GFLOPs
  # s: [0.50, 0.50, 1024] # summary: 355 layers, 10113248 parameters, 10113232 gradients, 35.8 GFLOPs
  # m: [0.50, 1.00, 512] # summary: 445 layers, 22420896 parameters, 22420880 gradients, 123.9 GFLOPs
  # l: [1.00, 1.00, 512] # summary: 667 layers, 27678368 parameters, 27678352 gradients, 143.0 GFLOPs
  # x: [1.00, 1.50, 512] # summary: 667 layers, 62142656 parameters, 62142640 gradients, 320.2 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Segment, [nc, 32, 256]] # Detect(P3, P4, P5)

新建一个目标检测训练文件train_seg.py

from ultralytics import YOLO, settings

settings.update({"runs_dir": "./",
                 "weights_dir": "./weights/det"})


def main():

    # 加载YOLO模型的配置文件,并加载预训练权重文件
    model = YOLO("resources/config/model/yolo11-seg.yaml").load("weights/seg/yolo11n-seg.pt")

    # 使用yolo11-seg.yaml数据集进行训练
    results = model.train(data="resources/config/data/yolo11-seg.yaml",  # 数据配置文件
                          epochs=1000,  # 训练轮数
                          patience=100,  # 早停耐心值
                          batch=16,  # 批次大小
                          imgsz=640,  # 输入图像尺寸
                          workers=4,  # 数据加载的工作线程数
                          optimizer='AdamW',  # 优化器
                          lr0=1e-3,  # 学习率
                          hsv_h=0.9,  # 色调增强
                          hsv_s=0.9,  # 饱和度增强
                          hsv_v=0.9,  # 亮度增强
                          degrees=0.2, # 角度增强
                          mosaic=1.0,  # 马赛克增强
                          scale=0.5,  # 随机缩放
                          shear=0.2,  # 随机剪切
                          augment=True,  # 使用数据增强
                          agnostic_nms=True,  # 使用类别无关的非极大值抑制
                          pretrained=True,  # 使用预训练权重进行训练
                          cos_lr=True,  # 使用余弦学习率调度
                          resume=True)  # 从上次保存的断点继续训练

    input("任意键退出")

if __name__ == "__main__":
    main()

运行后可以看到新增训练过程的文件
在这里插入图片描述


4. 模型推理

现在来应用一下训练的模型,新建一个predict_seg.py
选取最优的模型推理一下图片,并保留起来

from ultralytics import YOLO

# Load a pretrained YOLO model (recommended for training)
model = YOLO("segment/train/weights/best.pt")

results = model.predict(source='resources/images/seg/datasets/images/val',
                        imgsz=640,
                        project='segment/predict',
                        name='exp',
                        save=True,
                        conf=0.4,
                        iou=0.7,
                        device='cpu')

预测结果还是可以的

在这里插入图片描述


谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氢键H-H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值