YOLOv8 训练自己的分割数据集

news2024/11/30 10:46:29

之前写过一篇 使用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.coloradmin.cn/o/1253512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在3dMax中根据AutoCAD地形规划文件对地形进行建模?

在3dMax中根据Autocad地形规划文件对地形进行建模的方法 直入主题,要根据包含地形图的DWG (Autocad) 文件进行地形建模,方法步骤如下: 1.运行3dmax软件,点击“文件(File)->导入(Import&…

搜索 C. Tic-tac-toe

Problem - C - Codeforces 思路:搜索,判断合法性。从起始态用搜索进行模拟,这样可以避免后面判断合法性这一繁琐的步骤。用一个map进行映射当前态及对应的结果。剪枝:如果当前字符串已经被搜索过,则直接跳过去。 代码…

⑤【Sorted Set】Redis常用数据类型: ZSet [使用手册]

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 目录 ⑤Redis Zset 操作命令汇总1. zadd 添加或…

JavaScript基础—运算符、表达式和语句、分支语句、循环语句、综合案例-ATM存取款机

版本说明 当前版本号[20231125]。 版本修改说明20231125初版 目录 文章目录 版本说明目录JavaScript 基础 - 第2天运算符算术运算符赋值运算符自增/自减运算符比较运算符逻辑运算符运算符优先级 语句表达式和语句分支语句if 分支语句if双分支语句if 多分支语句三元运算符&am…

命令查询职责分离 (CQRS)

CQRS 的最初需求 多年来,传统的 CRUD(创建、读取、更新、删除)模式一直是系统架构的支柱。在 CRUD 中,读取和写入操作通常由相同的数据模型和相同的数据库模式处理。虽然这种方法简单直观,但随着系统规模的扩大和需求…

四、IDEA创建项目时,Maven Archetype模板工程说明

什么是Maven Archetype Archetype是一个Maven项目的模板工具包,它定义了一类项目的基本架构。Archetype为开发人员提供了创建Maven项目的模板,同时它也可以根据已有的Maven项目生成参数化的模板。 官方文档:https://maven.apache.org/archet…

Redis面试题:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)

目录 强一致性:延迟双删,读写锁。 弱一致性:使用MQ或者canal实现异步通知 面试官:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性) 候选人:嗯&#xff…

C++ 数据结构之-最小栈(MinStack)

最小栈 最小栈(Min Stack)是一个支持常数时间复杂度获取栈中最小元素的特殊栈数据结构。通常,标准的栈数据结构只支持在常数时间内执行入栈(push)和出栈(pop)操作,但无法在常数时间内…

痤疮分类-yolov5 学习过程

1、在github上下载yolov5-5.0的源码。 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

第一百七十九回 自定义SlideImageSwitch

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SlideSwitch组件"相关的内容,本章回中将介绍自定义SlideImageSwitch.闲话休提,让我们一起Talk Flutter吧。 1. 概…

JVM——几种常见的对象引用

目录 1. 软引用软引用的使用场景-缓存 2.弱引用3.虚引用和终结器引用 可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在, 普通对象就不会被回收。除了强引用之外,Ja…

bugku 渗透测试

场景1 查看源代码 场景2 用dirsearch扫描一下看看 ok看到登录的照应了第一个提示 进去看看 不出所料 随便试试admin/admin进去了 在基本设置里面看到falg 场景3 确实是没啥想法了 找到php在线运行 检查网络,我们发现这个php在线运行会写入文件 那我们是不是写…

WPS AI初体验

1、启动AI 2、输入需要创作的内容 3、创作的内容展示 当然,以下是一份经过润色后的年终总结目录: 一、引言 1. 总结的目的和意义 2. 总结的范畴和覆盖范围 3. 总结的编写原则和标准 二、公司概览 1. 公司简介 2. 公司历史与现状 3. 公司组织架构和团队介…

C编译过程

寻觅GCC 如果你已经安装了Clion&#xff0c;那么gcc就在根目录下。 如果没有&#xff0c;那么需要去minGW的官网下载安装。添加到环境变量中。 编写C代码 #include <stdio.h>#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) static int a 123;int main() {int i 0;c…

Android逆向实战 - MIUI调起三方应用系统拦截弹窗分析

近期&#xff0c;发现在部分Android手机调起其他应用时&#xff0c;会弹出一个系统弹窗拦截调起&#xff0c;需要用户二次确认。经过内部众测&#xff0c;发现绝大多数是小米手机&#xff0c;而且跟Android版本没有直接关系&#xff0c;猜测是MIUI某次升级引入的功能。这篇文章…

如何在 Vim 中剪切、复制和粘贴

目录 前言 如何在 Vim 编辑器中复制文本 如何在 Vim 编辑器中剪切文本 如何在 Vim 编辑器中粘贴文本 如何通过选择文本来剪切和复制文本 通过选择文本复制 在 Vim 中选择文本来剪切文本 前言 在本篇 Vim 快速技巧中&#xff0c;你将学习到剪切和复制粘贴的相关知识。 剪…

Linux C语言 22-多进程

Linux C语言 22-进程 本节关键字&#xff1a;进程、exec函数族 相关C库函数&#xff1a;fork、getpid、getppid、getuid、geteuid、getgid、getegid、execl、execlp、execv、execvp、execle、execvpe 什么是进程&#xff1f; 进程是程序的执行过程&#xff1b;进程是动态的&…

WordPress安装AWS插件实现文本转语音功能

适用于 WordPress 的 AWS 插件示例演示了内容创建者如何轻松地为所有书面内容添加文本转语音功能。随着语音搜索的不断增加&#xff0c;以音频格式提供更多网站内容变得至关重要。通过添加语音功能&#xff0c;网站访客可以通过在线音频播放器和播客应用程序等新渠道使用您的内…

【代码】平抑风电波动的电-氢混合储能容量优化配置(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;平抑风电波动的电-氢混合储能容量优化配置 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;针对电-氢混合系统协同平抑接入新型电力系统的 新能源波动问题&#xff0c;提出考虑碱性电解槽运行特性的电-氢 混合储能容量优化配置方案…

鸿蒙开发报错:agconnect sdk not initialized. please call initialize()【BUG已解决】

文章目录 项目场景:问题描述原因分析:解决方案:总结:项目场景: 鸿蒙开发报错: agconnect sdk not initialized. please call initialize() 问题描述 报错内容为: 10-25 11:41:01.152 6076-16676 E A0c0d0/JSApp: app Log: 数据查询失败: {“code”:1100001,“messag…