使用yolov8训练实例分割任务
以下是 YOLOv8 训练实例分割任务的,包含「数据集准备→配置文件编写→训练代码→验证→推理→结果可视化」全流程,兼顾命令行和 Python 脚本两种方式,适配自定义数据集场景。
·
以下是 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)
七、关键注意事项
- 模型选择:
- 小数据集 / 低显存(如 1080Ti):选
yolov8n-seg.pt(8M 参数)、yolov8s-seg.pt(30M 参数); - 大数据集 / 高显存(A100/V100):选
yolov8m-seg.pt(59M)、yolov8l-seg.pt(99M);
- 小数据集 / 低显存(如 1080Ti):选
- 过拟合解决:
- 增加数据增强(
mixup=0.2、copy_paste=0.5); - 降低学习率(
lr0=0.001)、增加权重衰减(weight_decay=0.001); - 减少训练轮数或使用
pretrained=True加载预训练权重;
- 增加数据增强(
- 结果解读:
- 训练日志中
mAP50-95(Segment)是分割任务核心指标,越高越好; runs/segment/train目录下的results.png会显示 loss 曲线、mAP 曲线,可判断是否收敛;
- 训练日志中
- 部署适配:训练好的
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 中的类别数、路径,以及训练参数(batch、epochs 等)即可。

更多推荐
所有评论(0)