手把手教程 | YOLOv8-seg训练自己的分割数据集

本文提供了一步步指导,教你如何使用YOLOv8-seg训练自己的分割数据集。内容包括数据集标注、格式转换、训练配置以及训练结果的可视化。通过labelme进行标注,然后将json转换为txt并划分训练集、验证集和测试集。最后,详细介绍了skinning.yaml和yolov8-seg.yaml的配置以及训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🚀🚀🚀手把手教程:教会你如何使用自己的数据集开展分割任务

🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;
1)手把手教你如何训练YOLOv8-seg;
2)模型创新,提升分割性能;
3)独家自研模块助力分割;

1.数据集介绍

番薯破损分割任务,自己手动标注,数据集大小304张

1.数据集标注

使用labelme进行数据集标注,首先进行labelme安装

pip install labelme

2.数据集格式转换

json to txt以及 划分为train、val、test,适配yolov8-seg

2.1 json2txt.py

# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdm
 
 
def convert_label_json(json_dir, save_dir, classes):
    json_paths = os.listdir(json_dir)
    classes = classes.split(',')
 
    for json_path in tqdm(json_paths):
        # for json_path in json_paths:
        path = os.path.join(json_dir, json_path)
        with open(path, 'r') as load_f:
            json_dict = json.load(load_f)
        h, w = json_dict['imageHeight'], json_dict['imageWidth']
 
        # save txt path
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
        txt_file = open(txt_path, 'w')
 
        for shape_dict in json_dict['shapes']:
            label = shape_dict['label']
            label_index = classes.index(label)
            points = shape_dict['points']
 
            points_nor_list = []
 
            for point in points:
                points_nor_list.append(point[0] / w)
                points_nor_list.append(point[1] / h)
 
            points_nor_list = list(map(lambda x: str(x), points_nor_list))
            points_nor_str = ' '.join(points_nor_list)
 
            label_str = str(label_index) + ' ' + points_nor_str + '\n'
            txt_file.writelines(label_str)
 
 
if __name__ == "__main__":
    """
    python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dogs"
    """
    parser = argparse.ArgumentParser(description='json convert to txt params')
    parser.add_argument('--json-dir', type=str,default='F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/json', help='json path dir')
    parser.add_argument('--save-dir', type=str,default='F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/txt' ,help='txt save dir')
    parser.add_argument('--classes', type=str, default='skinning',help='classes')
    args = parser.parse_args()
    json_dir = args.json_dir
    save_dir = args.save_dir
    classes = args.classes
    convert_label_json(json_dir, save_dir, classes)

2.2 划分为train、val、test

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
import argparse
 
 
# 检查文件夹是否存在
def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)
 
def main(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')
 
    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')
 
    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')
 
    mkdir(images_dir);
    mkdir(labels_dir);
    mkdir(img_train_path);
    mkdir(img_test_path);
    mkdir(img_val_path);
    mkdir(label_train_path);
    mkdir(label_test_path);
    mkdir(label_val_path);
 
    # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
    train_percent = 0.85
    val_percent = 0.15
    test_percent = 0
 
    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)
 
    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val
 
    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)
 
    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]
 
        srcImage = os.path.join(image_dir, name + '.jpg')
        srcLabel = os.path.join(txt_dir, name + '.txt')
 
        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.jpg')
            dst_train_Label = os.path.join(label_train_path, name + '.txt')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.jpg')
            dst_val_Label = os.path.join(label_val_path, name + '.txt')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.jpg')
            dst_test_Label = os.path.join(label_test_path, name + '.txt')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)
 
 
if __name__ == '__main__':
    """
    python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data
    """
    parser = argparse.ArgumentParser(description='split datasets to train,val,test params')
    parser.add_argument('--image-dir', type=str,default='F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/images', help='image path dir')
    parser.add_argument('--txt-dir', type=str,default='F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/txt' , help='txt path dir')
    parser.add_argument('--save-dir', default='F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/split', type=str, help='save dir')
    args = parser.parse_args()
    image_dir = args.image_dir
    txt_dir = args.txt_dir
    save_dir = args.save_dir
 
    main(image_dir, txt_dir, save_dir)

3.如何训练yolov8-seg

3.1 skinning.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: F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/split  # dataset root dir
train: F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/split/images/train  # train images (relative to 'path') 4 images
val: F:/DL/Pytorch/yolov8/ultralytics-seg/data/skinning/split/images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)


nc: 1


# Classes
names:
  0: skinning
 

3.2 如何训练

from ultralytics.cfg import entrypoint
arg="yolo segment train model=yolov8-seg0.yaml data=ultralytics/cfg/datasets/skinning.yaml"

entrypoint(arg)

3.3 yolov8-seg.yaml

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

# Parameters
nc: 1  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n-seg.yaml' will call yolov8-seg.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]
  s: [0.33, 0.50, 1024]
  m: [0.67, 0.75, 768]
  l: [1.00, 1.00, 512]
  x: [1.00, 1.25, 512]

# YOLOv8.0n 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, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f, [512]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [256]]  # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Segment, [nc, 32, 256]]  # Segment(P3, P4, P5)

4.训练结果可视化

Mask map0.5 原始为0.625

MaskF1_curve

 MaskP_curve

MaskPR_curve

MaskR_curve

 预测结果:

<think>好的,我现在需要回答用户关于如何使用YOLOv8进行分割模型训练的问题。首先,用户提到他们之前用过YOLOv8的目标检测功能,现在想转向实例分割。我需要确保回答结构清晰,并且按照用户提供的系统级指令来组织内容。 首先,我应该回顾用户提供的引用内容。引用1提到了YOLOv8的图像分割训练流程,引用2则是关于训练自定义数据集的详细步骤。用户的问题集中在分割模型的训练教程和配置方法上,所以我需要结合这两个引用,并补充分割特有的步骤。 接下来,我需要整理YOLOv8分割训练的流程。通常,训练分割模型需要数据准备、标注格式转换、配置文件设置、训练命令和结果验证这几个步骤。数据准备方面,用户需要确保数据集包含分割的标注,比如COCO格式的JSON文件或YOLO格式的txt文件。这里可能需要解释YOLO格式的标注结构,每个图像对应的txt文件包含类别ID和归一化的多边形坐标。 然后,配置文件的设置是关键。用户需要修改data.yaml,指定训练、验证、测试的路径以及类别名称。同时,选择合适的分割模型,如yolov8n-seg.yaml。训练命令部分,用户可能已经熟悉检测任务的命令,但分割任务需要指定task=segment,并正确引用模型配置文件。 在训练后的验证阶段,用户可能需要使用val模式,并指定分割任务,确保模型正确输出掩膜。此外,导出模型到ONNX或TensorRT等格式可能也是用户关心的点,需要提到相关参数如imgsz和format。 用户可能遇到的问题包括标注格式错误、路径配置不正确,或者训练参数设置不当。需要提醒他们检查这些方面,并参考官方文档。此外,示例代码或命令的展示需要符合用户提供的格式要求,比如使用代码块,并确保LaTeX语法正确,但在这个问题中可能涉及较少数学公式,所以重点在代码和配置文件的正确性。 最后,生成相关问题时要围绕分割训练的可能扩展问题,比如提升精度、处理不规则区域、优化方法、评估指标和标注工具等。这些问题能帮助用户进一步探索相关主题。 现在需要确保回答符合所有系统指令,特别是使用中文,结构清晰,分步骤说明,正确引用,以及生成相关问题。需要避免使用Markdown格式,但根据用户示例,可能需要使用代码块。同时,检查是否有遗漏的步骤,比如数据集划分、环境配置等,但用户可能已经具备目标检测的经验,所以可以适当简化基础步骤,聚焦在分割特有的部分。</think>### YOLOv8分割模型训练教程及配置方法 #### 1. **数据准备与标注格式** - **数据集要求**:需包含图像和对应的分割标注文件,标注格式支持COCO JSON或YOLO格式的TXT文件。 - **YOLO分割格式**:每个图像的标注文件为`.txt`,每行格式为:`类别ID x1 y1 x2 y2 ... xn yn`,其中坐标需归一化(值在0-1之间)[^1]。 - 示例标注文件内容: ``` 0 0.25 0.34 0.40 0.45 ... 0.72 0.89 ``` #### 2. **配置文件设置** - **创建`data.yaml`**:定义数据集路径和类别信息。 ```yaml path: ./datasets/custom_seg train: images/train val: images/val test: images/test names: 0: object_A 1: object_B ``` - **选择分割模型**:使用YOLOv8分割训练模型(如`yolov8n-seg.pt`)或自定义模型结构(如`yolov8n-seg.yaml`)[^2]。 #### 3. **训练命令与参数** - **基础训练命令**: ```bash yolo task=segment mode=train model=yolov8n-seg.yaml data=data.yaml epochs=100 imgsz=640 batch=16 ``` - `task=segment`:指定任务为分割- `imgsz`:输入图像尺寸(需与数据预处理一致)。 - `batch`:根据GPU显存调整批次大小。 - **关键参数说明**: - `pretrained=True`:是否加载预训练权重。 - `optimizer`:可设置为`AdamW`或`SGD`。 - `lr0`:初始学习率(如`0.01`)。 #### 4. **验证与推理** - **验证模型性能**: ```bash yolo task=segment mode=val model=runs/segment/train/weights/best.pt data=data.yaml ``` - **使用模型推理**: ```bash yolo task=segment mode=predict model=best.pt source=test_images/ ``` #### 5. **导出模型** - 导出为ONNX/TensorRT格式: ```bash yolo task=segment mode=export model=best.pt format=onnx imgsz=640 ``` #### 常见问题与优化 - **标注对齐问题**:确保标注坐标归一化且顺序正确。 - **训练不收敛**:尝试降低学习率(如`lr0=0.001`)或增加数据增强(如`augment=True`)。 - **不规则区域处理**:通过增加`imgsz`或使用更深的模型(如`yolov8m-seg`)提升细节捕捉能力[^1]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会AI的学姐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值