以下是 YOLOv8 训练实例分割任务的完整可运行代码示例,包含「数据集准备→配置文件编写→训练代码→验证→推理→结果可视化」全流程,兼顾命令行和 Python 脚本两种方式,适配自定义数据集场景。

一、环境准备(必做)

首先确保安装最新版 ultralytics(YOLOv8 官方库),建议在虚拟环境中安装:

# 安装/升级ultralytics
pip install -U ultralytics

# 验证安装(输出版本则成功)
python -c "from ultralytics import YOLO; print('YOLOv8版本:', YOLO.__version__)"

二、数据集准备(核心前提)

1. 数据集目录结构(COCO 格式)

自定义分割数据集需遵循以下结构(coco128-seg 是官方示例,可替换为自己的数据集):

my_seg_dataset/  # 数据集根目录
├── images/      # 图片目录
│   ├── train/   # 训练集图片(如 001.jpg、002.png)
│   └── val/     # 验证集图片
└── labels/      # 分割标签目录(与图片一一对应,后缀.txt)
    ├── train/   # 训练集标签(001.txt、002.txt)
    └── val/     # 验证集标签
2. 分割标签格式说明

标签文件 .txt 每行格式为:class_id + 归一化的多边形顶点坐标(坐标范围 0-1),示例:

# 001.txt(表示类别0的目标,由6个顶点组成的多边形分割框)
0 0.12 0.15 0.23 0.18 0.25 0.30 0.18 0.35 0.10 0.32 0.08 0.20
1 0.45 0.50 0.55 0.52 0.58 0.60 0.48 0.65 0.42 0.62 0.40 0.55  # 类别1的目标

若用 LabelMe 标注,可通过 ultralytics 自带工具转换格式:

运行

# LabelMe标注文件(.json)转YOLO分割标签
from ultralytics.data.converter import convert_labelme2yolo
convert_labelme2yolo(labelme_json_dir="labelme标注文件目录", save_dir="my_seg_dataset/labels")

三、数据集配置文件(dataset.yaml)

        在数据集根目录同级创建 dataset.yaml,指定路径、类别数、类别名:

# dataset.yaml 内容
path: ./my_seg_dataset  # 数据集根目录(绝对路径/相对路径均可)
train: images/train     # 训练集图片路径(相对于path)
val: images/val         # 验证集图片路径(相对于path)

# 分割任务核心配置
nc: 2                   # 类别数(根据自己的数据集修改,如2类:cat、dog)
names: ['cat', 'dog']   # 类别名,与标签中的class_id一一对应(0=cat,1=dog)

四、训练代码示例(两种方式)

方式 1:命令行训练(简洁,推荐快速验证)

直接在终端执行以下命令,指定核心参数:

# 基础训练命令(YOLOv8n-seg轻量模型,适配小显存GPU)
yolo segment train \
  data=dataset.yaml \          # 数据集配置文件
  model=yolov8n-seg.pt \       # 预训练分割模型(n/s/m/l/x-seg,越大精度越高)
  epochs=100 \                 # 训练轮数(建议至少50轮,根据收敛情况调整)
  imgsz=640 \                  # 输入图片尺寸(正方形,如640/800/1280)
  batch=16 \                   # 批次大小(A100可设32/64,1080Ti建议8/16)
  device=0 \                   # GPU编号(多GPU用0,1;CPU用cpu)
  lr0=0.01 \                   # 初始学习率(默认0.01,小数据集可降为0.001)
  weight_decay=0.0005 \        # 权重衰减(防止过拟合)
  save=True \                  # 保存训练权重(默认保存在runs/segment/train/)
  patience=50 \                # 早停耐心值(50轮无提升则停止训练)
  pretrained=True \            # 使用预训练权重(必开,加速收敛)
  augment=True                 # 开启数据增强(提升泛化能力)
方式 2:Python 脚本训练(灵活,适配定制化需求)

编写 train_seg.py 脚本,支持更精细的参数控制和流程定制:

from ultralytics import YOLO
import os

# 1. 初始化YOLO分割模型(加载预训练权重)
model = YOLO("yolov8s-seg.pt")  # 选择模型:yolov8n/s/m/l/x-seg.pt

# 2. 定义训练参数(与命令行一一对应)
train_args = {
    "data": "dataset.yaml",       # 数据集配置文件路径
    "epochs": 100,                # 训练轮数
    "imgsz": 640,                 # 输入尺寸
    "batch": 16,                  # 批次大小
    "device": 0,                  # GPU编号
    "lr0": 0.01,                  # 初始学习率
    "lrf": 0.01,                  # 最终学习率(lr0*lrf)
    "weight_decay": 0.0005,       # 权重衰减
    "patience": 50,               # 早停耐心值
    "save_period": 10,            # 每10轮保存一次权重(默认只保存best和last)
    "augment": True,              # 开启数据增强
    "mixup": 0.1,                 # mixup增强概率(0-1,小数据集慎用)
    "copy_paste": 0.3,            # 分割任务专属:复制粘贴增强
    "val": True,                  # 训练中同步验证(建议开启)
    "plots": True,                # 生成训练可视化图表(loss、mAP等)
    "project": "runs/segment",    # 结果保存根目录
    "name": "my_train",           # 训练任务名(结果存到runs/segment/my_train)
    "exist_ok": True              # 覆盖已有同名任务目录
}

# 3. 启动训练
results = model.train(**train_args)

# 4. 训练完成后打印核心指标(mAP50-95(Segment)是分割任务关键指标)
print("训练完成!核心指标:")
print(f"mAP50 (分割): {results.results_dict['metrics/mAP50(Segment)']:.4f}")
print(f"mAP50-95 (分割): {results.results_dict['metrics/mAP50-95(Segment)']:.4f}")

运行脚本:

python train_seg.py

五、验证训练结果(代码示例)

训练完成后,用最优权重 best.pt 验证模型性能:

from ultralytics import YOLO

# 加载训练好的权重
model = YOLO("runs/segment/my_train/weights/best.pt")

# 执行验证
val_results = model.val(
    data="dataset.yaml",  # 数据集配置文件
    imgsz=640,            # 与训练一致的尺寸
    batch=16,
    device=0,
    save_json=True,       # 保存验证结果为JSON(用于COCO评估)
    conf=0.25,            # 置信度阈值
    iou=0.6               # NMS的IOU阈值
)

# 打印验证指标
print("验证集分割mAP50:", val_results.box.map50)  # 边界框mAP50
print("验证集分割mAP50-95:", val_results.seg.map)  # 分割mAP50-95

六、推理(预测)代码示例

用训练好的模型对图片 / 视频 / 文件夹做分割推理:

from ultralytics import YOLO
import cv2

# 加载权重
model = YOLO("runs/segment/my_train/weights/best.pt")

# 1. 单张图片推理
img_path = "test.jpg"
results = model.predict(
    source=img_path,    # 推理源(图片/视频/文件夹/摄像头)
    imgsz=640,
    conf=0.25,          # 置信度阈值(过滤低置信度目标)
    iou=0.6,            # NMS IOU阈值
    save=True,          # 保存推理结果(默认存到runs/segment/predict)
    show=False,         # 不弹出可视化窗口(服务器环境建议关闭)
    save_txt=True,      # 保存分割标签(可选)
    save_crop=True      # 保存分割裁剪后的目标(可选)
)

# 2. 解析推理结果(自定义可视化)
for r in results:
    # 获取分割掩码(mask):shape=(num_masks, H, W)
    masks = r.masks.data.cpu().numpy()  # 转为numpy数组
    # 获取边界框:xyxy格式
    boxes = r.boxes.xyxy.cpu().numpy()
    # 获取类别ID和置信度
    cls = r.boxes.cls.cpu().numpy()
    conf = r.boxes.conf.cpu().numpy()

    # 可视化:在原图上绘制分割掩码
    img = cv2.imread(img_path)
    for i, mask in enumerate(masks):
        # 将掩码缩放到原图尺寸
        mask = cv2.resize(mask, (img.shape[1], img.shape[0]))
        # 给不同类别分配颜色
        color = (0, 255, 0) if cls[i] == 0 else (255, 0, 0)
        # 绘制掩码
        img[mask > 0.5] = img[mask > 0.5] * 0.5 + np.array(color) * 0.5
    # 保存自定义可视化结果
    cv2.imwrite("custom_seg_result.jpg", img)

七、关键注意事项

  1. 模型选择
    • 小数据集 / 低显存(如 1080Ti):选 yolov8n-seg.pt(8M 参数)、yolov8s-seg.pt(30M 参数);
    • 大数据集 / 高显存(A100/V100):选 yolov8m-seg.pt(59M)、yolov8l-seg.pt(99M);
  2. 过拟合解决
    • 增加数据增强(mixup=0.2copy_paste=0.5);
    • 降低学习率(lr0=0.001)、增加权重衰减(weight_decay=0.001);
    • 减少训练轮数或使用 pretrained=True 加载预训练权重;
  3. 结果解读
    • 训练日志中 mAP50-95(Segment) 是分割任务核心指标,越高越好;
    • runs/segment/train 目录下的 results.png 会显示 loss 曲线、mAP 曲线,可判断是否收敛;
  4. 部署适配:训练好的 best.pt 可导出为 ONNX/TensorRT 格式,用于部署:
    model.export(format="onnx", imgsz=640)  # 导出ONNX格式
    

八、官方示例数据集快速测试

若没有自定义数据集,可直接用官方 coco128-seg 数据集测试:

from ultralytics import YOLO

model = YOLO("yolov8n-seg.pt")
# 自动下载coco128-seg并训练10轮
model.train(data="coco128-seg.yaml", epochs=10, imgsz=640, batch=8)

以上代码可直接复制运行,仅需根据自己的数据集修改 dataset.yaml 中的类别数、路径,以及训练参数(batchepochs 等)即可。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐