YOLOv8 训练自己的分割数据集

之前写过一篇 使用YOLOv8训练自己的【目标检测】数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】,里面带大家整个流程走过一遍了,

这篇文章我们来介绍如何使用 YOLOv8 训练分割数据集

这里我会讲解分割数据集的格式,就不带大家标注了,因为标注分割数据集真的太麻烦了。。


文章目录

    • 1. 数据格式
    • 2. 配置环境
    • 3. 训练模型
    • 4. 评估模型
    • 5. 推理模型
    • 6. 分割怎么改进


1. 数据格式

我们先看下官方给我们提供的分割数据集示例,下载地址在这里:https://ultralytics.com/assets/coco8-seg.zip

打开后是这样子的

在这里插入图片描述

我们先读下 README.md

Ultralytics COCO8-seg 数据集

Ultralytics COCO8-seg 是一个小型但多才多艺的实例分割数据集,由 COCO train 2017 集的前 8 张图像组成,其中 4 张用于训练,4 张用于验证。
该数据集非常适用于测试和调试分割模型,或者尝试新的检测方法。

有了 8 张图像,它足够小,易于管理,同时又足够多样,可以用于测试训练流程是否存在错误,并在训练更大数据集之前作为健全性检查。

此数据集旨在与 Ultralytics YOLOv8 一起使用。

数据集的结构就是下面这样的,图片没有什么可说的,主要说下标签文件,

coco8-seg
	├─images
	│  ├─train
	│  └─val
	└─labels
	    ├─train
	    └─val

随便点开一个我们就会发现,相较于规范的检测任务,分割任务的标签显得比较的复杂,

在这里插入图片描述

我这里给大家写了一个小脚本,可以将对应的标签和图片输入进去,得到可视化结果,

请添加图片描述
看到这里大家可能也猜出来标签的含义了,每行的第一个数字表示类别的标识符,后续的数字表示一个由 x x x y y y 坐标组成的序列,代表一个分割的多边形或轮廓,这个多边形由这些坐标点依次连接而成。

22 0.00746875 0.0539294 0.117891 0.0921412 0.231297 0.110118 ......

第一个数字 22 22 22 是类别标识符。
后续的数字是 x x x y y y 坐标的交替序列,表示分割多边形的各个顶点。


可视化代码:

# by https://blog.csdn.net/weixin_43694096
import cv2
import numpy as np

def restore_masks_to_image(mask_data, image_path, output_path):
    # 读取图像
    img = cv2.imread(image_path)
    
    # 将掩码数据还原到图像上
    for mask in mask_data:
        values = list(map(float, mask.split()))
        class_id = int(values[0])
        mask_values = values[1:]

        # 将掩码数据转换为NumPy数组
        mask_array = np.array(mask_values, dtype=np.float32).reshape((int(len(mask_values) / 2), 2))

        # 将相对于图像大小的百分比转换为具体坐标值
        mask_array[:, 0] *= img.shape[1]  # 宽度
        mask_array[:, 1] *= img.shape[0]  # 高度

        # 将坐标值转换为整数
        mask_array = mask_array.astype(np.int32)

        # 在图像上绘制掩码
        cv2.polylines(img, [mask_array], isClosed=True, color=(0, 255, 0), thickness=2)

        # 在图像上绘制每个坐标点
        for point in mask_array:
            cv2.circle(img, tuple(point), 3, (255, 0, 0), -1)  # -1 表示填充圆

    # 保存带有掩码和坐标点的图像
    cv2.imwrite(output_path, img)


if __name__ == "__main__":
    mask_data = [
        "22 0.00746875 0.0539294 0.117891 0.0921412 0.231297 0.110118 0.2895 0.0674118 0.331281 0.0472 0.3865 0.0696706 0.423813 0.0943765 0.446188 0.105624 0.467078 0.1528 0.517813 0.182024 0.577516 0.253929 0.658094 0.379765 0.690922 0.532588 0.687937 0.6 0.650625 0.555059 0.658094 0.644941 0.668547 0.755059 0.676 0.838212 0.658094 0.894376 0.613328 0.925835 0.589453 0.914612 0.590938 0.856188 0.552141 0.791012 0.523781 0.725835 0.528266 0.633718 0.498422 0.577529 0.444703 0.505624 0.407391 0.505624 0.395453 0.541576 0.417844 0.591012 0.450672 0.642706 0.456641 0.642706 0.461109 0.725835 0.458125 0.786518 0.450672 0.853929 0.444703 0.898871 0.401422 0.869671 0.411875 0.815741 0.423813 0.734824 0.425297 0.694376 0.361125 0.608988 0.316359 0.588753 0.280547 0.703365 0.271594 0.757294 0.261141 0.829224 0.268609 0.869671 0.277562 0.901129 0.250703 0.937082 0.222344 0.939318 0.231297 0.901129 0.222344 0.844941 0.238766 0.7236 0.246219 0.642706 0.271594 0.510118 0.182062 0.507859 0.0999844 0.525835 0.0208906 0.494376 0.0015 0.0516941"
    ]

    image_path = "000000000034.jpg"
    output_path = "000000000034_out.jpg"

    restore_masks_to_image(mask_data, image_path, output_path)


2. 配置环境

代码地址:https://github.com/ultralytics/ultralytics

首先我们要下载源码,如果你会使用 git 工具,请直接拉取最新的代码。

git clone https://github.com/ultralytics/ultralytics.git

基础不好的同学,请使用我上传的文件,或手动下载代码。

这里我想强调下环境的配置,如果你是新手,请使用如下的指令安装,切记不要使用 pip install ultralytics 这条指令!

这样可以避免你遇到我教程外的错误。

cd ultralytics
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 训练模型

下载好后,我们到这个路径下,ultralytics/ultralytics/cfg/datasets ,在这里我们可以看到 coco8-seg.yaml ,这个文件就是我们导入数据集的关键文件,

我这里使用官方提供的文件,所以不需要太多的更改,如果大家使用自己的数据集,那需要对应的改下里面的内容,

在这里插入图片描述

在这里插入图片描述

这个文件重要的地方有几处,

  • path 代表的根目录的路径
  • train 代表的是训练集图片位置
  • val 代表验证集图片位置
  • test 代表测试集图片位置
  • names 代表数据类别
  • download 代表下载地址,这个我们可以忽略掉

这部分要说的就是这么多,和检测任务没有区别。


训练过程和检测差别也不大,就是模型和数据集yaml的区别,接下来我们要新建一个 train-seg.py 文件,内容直接复制我的,所有的参数我写到下面了,大家对应的看就好了,

最重要的就是 yolov8-seg.yaml 路径和 coco8-seg.yaml 的路径,这里推荐大家写绝对路径,避免出错,

改好了这两个位置直接运行这个文件就开始训练了。

from ultralytics import YOLO

if __name__ == '__main__':
    # 加载模型
    model = YOLO(r'yolov8-seg.yaml')  # 不使用预训练权重训练
    # model = YOLO(r'yolov8-seg.yaml').load("yolov8n-seg.pt")  # 使用预训练权重训练
    # 训练参数 ----------------------------------------------------------------------------------------------
    model.train(
        data=r'coco8-seg.yaml',
        epochs=300,  # (int) 训练的周期数
        patience=50,  # (int) 等待无明显改善以进行早期停止的周期数
        batch=32,  # (int) 每批次的图像数量(-1 为自动批处理)
        imgsz=640,  # (int) 输入图像的大小,整数或w,h
        save=True,  # (bool) 保存训练检查点和预测结果
        save_period=-1,  # (int) 每x周期保存检查点(如果小于1则禁用)
        cache=False,  # (bool) True/ram、磁盘或False。使用缓存加载数据
        device='',  # (int | str | list, optional) 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
        workers=8,  # (int) 数据加载的工作线程数(每个DDP进程)
        project='runs/train',  # (str, optional) 项目名称
        name='exp',  # (str, optional) 实验名称,结果保存在'project/name'目录下
        exist_ok=False,  # (bool) 是否覆盖现有实验
        pretrained=True,  # (bool | str) 是否使用预训练模型(bool),或从中加载权重的模型(str)
        optimizer='SGD',  # (str) 要使用的优化器,选择=[SGD,Adam,Adamax,AdamW,NAdam,RAdam,RMSProp,auto]
        verbose=True,  # (bool) 是否打印详细输出
        seed=0,  # (int) 用于可重复性的随机种子
        deterministic=True,  # (bool) 是否启用确定性模式
        single_cls=False,  # (bool) 将多类数据训练为单类
        rect=False,  # (bool) 如果mode='train',则进行矩形训练,如果mode='val',则进行矩形验证
        cos_lr=False,  # (bool) 使用余弦学习率调度器
        close_mosaic=0,  # (int) 在最后几个周期禁用马赛克增强
        resume=False,  # (bool) 从上一个检查点恢复训练
        amp=True,  # (bool) 自动混合精度(AMP)训练,选择=[True, False],True运行AMP检查
        fraction=1.0,  # (float) 要训练的数据集分数(默认为1.0,训练集中的所有图像)
        profile=False,  # (bool) 在训练期间为记录器启用ONNX和TensorRT速度
        freeze= None,  # (int | list, 可选) 在训练期间冻结前 n 层,或冻结层索引列表。
        # 分割
        overlap_mask=True,  # (bool) 训练期间是否应重叠掩码(仅适用于分割训练)
        mask_ratio=4,  # (int) 掩码降采样比例(仅适用于分割训练)
        # 分类
        dropout=0.0,  # (float) 使用丢弃正则化(仅适用于分类训练)
        # 超参数 ----------------------------------------------------------------------------------------------
        lr0=0.01,  # (float) 初始学习率(例如,SGD=1E-2,Adam=1E-3)
        lrf=0.01,  # (float) 最终学习率(lr0 * lrf)
        momentum=0.937,  # (float) SGD动量/Adam beta1
        weight_decay=0.0005,  # (float) 优化器权重衰减 5e-4
        warmup_epochs=3.0,  # (float) 预热周期(分数可用)
        warmup_momentum=0.8,  # (float) 预热初始动量
        warmup_bias_lr=0.1,  # (float) 预热初始偏置学习率
        box=7.5,  # (float) 盒损失增益
        cls=0.5,  # (float) 类别损失增益(与像素比例)
        dfl=1.5,  # (float) dfl损失增益
        pose=12.0,  # (float) 姿势损失增益
        kobj=1.0,  # (float) 关键点对象损失增益
        label_smoothing=0.0,  # (float) 标签平滑(分数)
        nbs=64,  # (int) 名义批量大小
        hsv_h=0.015,  # (float) 图像HSV-Hue增强(分数)
        hsv_s=0.7,  # (float) 图像HSV-Saturation增强(分数)
        hsv_v=0.4,  # (float) 图像HSV-Value增强(分数)
        degrees=0.0,  # (float) 图像旋转(+/- deg)
        translate=0.1,  # (float) 图像平移(+/- 分数)
        scale=0.5,  # (float) 图像缩放(+/- 增益)
        shear=0.0,  # (float) 图像剪切(+/- deg)
        perspective=0.0,  # (float) 图像透视(+/- 分数),范围为0-0.001
        flipud=0.0,  # (float) 图像上下翻转(概率)
        fliplr=0.5,  # (float) 图像左右翻转(概率)
        mosaic=1.0,  # (float) 图像马赛克(概率)
        mixup=0.0,  # (float) 图像混合(概率)
        copy_paste=0.0,  # (float) 分割复制-粘贴(概率)
    )


开始训练时会打印出模型的参数量,计算量,结构信息。

在这里插入图片描述

训练结束后会打印出各种指标,包括 PRmAPSpeed等。

在这里插入图片描述


4. 评估模型

评估模型时有个同学问的最多的问题就是测试集的精度怎么看,

这里因为我们没有划分测试集,所以没法看测试集的指标,但是如果你划分了测试集,

直接使用我给的脚本,将 split 设置为 test ,这样就会打印出测试集的指标。

from ultralytics import YOLO

if __name__ == '__main__':
    # 加载模型
    model = YOLO(r'yolov8n.pt')  
    # 验证模型
    model.val(
        val=True,  # (bool) 在训练期间进行验证/测试
        data=r'coco128.yaml',
        split='val',  # (str) 用于验证的数据集拆分,例如'val'、'test'或'train'
        batch=1,  # (int) 每批的图像数量(-1 为自动批处理)
        imgsz=640,  # 输入图像的大小,可以是整数或w,h
        device='',  # 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
        workers=8,  # 数据加载的工作线程数(每个DDP进程)
        save_json=False,  # 保存结果到JSON文件
        save_hybrid=False,  # 保存标签的混合版本(标签 + 额外的预测)
        conf=0.001,  # 检测的目标置信度阈值(默认为0.25用于预测,0.001用于验证)
        iou=0.6,  # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
        project='runs/val',  # 项目名称(可选)
        name='exp',  # 实验名称,结果保存在'project/name'目录下(可选)
        max_det=300,  # 每张图像的最大检测数
        half=False,  # 使用半精度 (FP16)
        dnn=False,  # 使用OpenCV DNN进行ONNX推断
        plots=True,  # 在训练/验证期间保存图像
    )



5. 推理模型

推理使用我给的如下脚本就可以实现了。

import sys
sys.path.append("/root/ultralytics")
from ultralytics import YOLO

if __name__ == '__main__':
    # 加载模型
    model = YOLO(r'/root/ultralytics/ultralytics/yolov8n-seg.pt')  # YOLOv8n模型
    model.predict(
        source=r'/root/ultralytics/ultralytics/assets',
        save=True,  # 保存预测结果
        imgsz=640,  # 输入图像的大小,可以是整数或w,h
        conf=0.25,  # 用于检测的目标置信度阈值(默认为0.25,用于预测,0.001用于验证)
        iou=0.45,  # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
        show=False,  # 如果可能的话,显示结果
        project='runs/predict',  # 项目名称(可选)
        name='exp',  # 实验名称,结果保存在'project/name'目录下(可选)
        save_txt=False,  # 保存结果为 .txt 文件
        save_conf=True,  # 保存结果和置信度分数
        save_crop=False,  # 保存裁剪后的图像和结果
        show_labels=True,  # 在图中显示目标标签
        show_conf=True,  # 在图中显示目标置信度分数
        vid_stride=1,  # 视频帧率步长
        line_width=3,  # 边界框线条粗细(像素)
        visualize=False,  # 可视化模型特征
        augment=False,  # 对预测源应用图像增强
        agnostic_nms=False,  # 类别无关的NMS
        retina_masks=False,  # 使用高分辨率的分割掩码
        boxes=True,  # 在分割预测中显示边界框
    )


在这里插入图片描述
在这里插入图片描述


6. 分割怎么改进

有同学问分割怎么改进,其实和检测任务一样的,唯一区别就是下面红框中的区别,

是用我给的改进和脚本很容易上手改进分割任务~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/188964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

旋转框检测项目相关python库知识总结(mmrotate、ppyolo_r、yolov5_obb)

旋转框常用于检测带有角度信息的矩形框,即矩形框的宽和高不再与图像坐标轴平行。相较于水平矩形框,旋转矩形框一般包括更少的背景信息。旋转框检测常用于遥感等场景中,本博文简单的介绍了可应用于旋转框数据训练的开源库,数据结构…

佳易王各行业收银管理系统软件,企业ERP管理软件,企业或个体定制开发软件以及软件教程资源下载总目录,持续更新,可关注收藏查阅

系统简介 1、佳易王软件功能实用、操作简单、软件绿色免安装,解压即可使用,软件已经内置数据库,不需再安装其他数据库文件。 2、佳易王软件,已经形成系列,上百款管理系统软件涵盖多个行业。 3、已为多个企业个体定制…

【c++】——类和对象(下) ——内存管理

作者:chlorine 专栏:c专栏 目录 💻 C/C内存分布 💻C语言中动态内存管理方式:malloc/calloc/realloc/free ​编辑 💻C内存管理方式 👉new/delete操作内置类型 👉new和delete操作自定义类型 &#x1f…

makefile 学习(5)完整的makefile模板

参考自: (1)深度学习部署笔记(二): g, makefile语法,makefile自己的CUDA编程模板(2)https://zhuanlan.zhihu.com/p/396448133(3) 一个挺好的工程模板,(https://github.com/shouxieai/cpp-proj-template) 1. c 编译流…

Linux加强篇004-Vim编辑器与Shell命令脚本

目录 前言 1. Vim文本编辑器 1.1 编写简单文档 1.2 配置主机名称 1.3 配置网卡信息 1.4 配置软件仓库 2. 编写Shell脚本 2.1 编写简单的脚本 2.2 接收用户的参数 2.3 判断用户的参数 3. 流程控制语句 3.1 if条件测试语句 3.2 for条件循环语句 3.3 while条件循环语…

深入浅出 Linux 中的 ARM IOMMU SMMU II

SMMU 驱动中的系统 I/O 设备探测 要使系统 I/O 设备的 DMA 内存访问能通过 IOMMU,需要将系统 I/O 设备和 IOMMU 设备绑定起来,也就是执行 SMMU 驱动中的系统 I/O 设备探测。总线发现系统 I/O 设备并和对应的驱动程序绑定,与 IOMMU 设备驱动程…

死锁是什么?死锁是如何产生的?如何破除死锁?

1. 死锁是什么 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 2. 死锁的三种典型情况 一个线程, 一把锁, 是不可重入锁, 该线程针对这个锁连续加锁两次, 就会出现死锁. 两个线程…

Java多态:多态多态,多么变态

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、重写1、重写的规则2、重写与重载的区别 二、多态1、多态的概念2、多态的实现3、向上转移和向下转型Ⅰ、向上转型Ⅱ、向下转…

蓝桥杯官网算法赛(蓝桥小课堂)

问题描述 蓝桥小课堂开课啦! 海伦公式(Herons formula),也称为海伦-秦九韶公式,是用于计算三角形面积的一种公式,它可以通过三条边的长度来确定三角形的面积,而无需知道三角形的高度。 海伦公…

BART 并行成像压缩感知重建:联合重建

本文使用 variavle-density possion-disc 采样的多通道膝盖数据进行并行重建和压缩感知重建。 0 数据欠采样sampling pattern 1 计算ESPIRiT maps % A visualization of k-space dataknee = readcfl(data/knee); ksp_rss = bart(rss 8, knee);ksp_rss = squeeze(ksp_rss); figu…

11 月 25 日 ROS 学习笔记——3D 建模与仿真

文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…

求集合的笛卡尔乘积

求集合的笛卡尔乘积 一:【实验目的】二:【实验内容】三:【实验原理】四:代码实现: 一:【实验目的】 通过编实现给定集合A和B的笛卡尔积CAA,DAB,EBA,FAAB,GA(A*B). 二:【实验内容】…

迈巴赫S480升级电动后门 手势控制开关 更加方便

安装了电动后门的迈巴赫S480,从原来的触摸门把手和门内拉手开关门,增加了钥匙控制、前排显示屏控制、后门按键开关控制、后排娱乐屏控制等多种开关门方式,将一个待客之礼体现出多种不一样的尊贵感受。 中控显示屏由驾驶者控制,可以…

1.4 8位加法器

1.半加器 2.全加器 半加器: 完整模拟1位加法 1.A,B 接受端,接受1或0 , 2个电信号 2.异或门 做为结果: 1^10, 0^00, 1^01, 0^11 与编程中的: 异或一致 3.与门 做为进位: 1&11,1&00,0&10, 0&01 与编程中的: 与一致 4.半加器实现1位的加法运算,比如:A端: …

图书馆管理系统源码(Java)

Book包->内含Book类与BookList类 Book类 用于初始化图书并对其进行操作 BookList类 用于存放多本图书 Book类 package Book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrow;//写一个…

6.11左叶子之和(LC404-E)

用java定义树: public class TreeNode {int val;TreeNode left;TreeNode right; //一个空构造方法TreeNode(),用于初始化节点的默认值。TreeNode() {} //一个构造方法TreeNode(int val),用于初始化节点的值,并设置默认的左右子节…

【Unity3D】MAX聚合广告SDK——Pangle广告接入

Pangle, App Monetization Simplified 注册 登录 创建应用 创建广告单元 将其应用ID和广告ID关联到MAX广告。 下载Pangle Unity Plugin包,新建一个空工程(很重要) Unity版本2019.4.0f1 gradle plugin 4.2.0 gradle版本6.7.1 build_tools 34.…

el-uploader同一文件无法上传问题

在上传成功和失败的回调方法中,吊用一下clearFiles方法。 this.$refs.upload.clearFiles();

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello,大家好!上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识,这篇文章主要给大家分享Nod…

c语言中指针详解

内存与地址 1.地址的概念 众所周知数据需要在内存中读取,那么我们当我们需要找这个内存时该怎么办?其实在计算机中每个内存单元都有一个编号,有了这个编号CPU可以快速找到内存空间,在这里我们将这个编号叫做地址,在c…