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')
预测结果还是可以的
谢谢