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 npdef 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 YOLOif __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,hsave=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=cpuworkers=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 beta1weight_decay=0.0005, # (float) 优化器权重衰减 5e-4warmup_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.001flipud=0.0, # (float) 图像上下翻转(概率)fliplr=0.5, # (float) 图像左右翻转(概率)mosaic=1.0, # (float) 图像马赛克(概率)mixup=0.0, # (float) 图像混合(概率)copy_paste=0.0, # (float) 分割复制-粘贴(概率))
开始训练时会打印出模型的参数量,计算量,结构信息。

训练结束后会打印出各种指标,包括 P,R,mAP,Speed等。

4. 评估模型
评估模型时有个同学问的最多的问题就是测试集的精度怎么看,
这里因为我们没有划分测试集,所以没法看测试集的指标,但是如果你划分了测试集,
直接使用我给的脚本,将 split 设置为 test ,这样就会打印出测试集的指标。
from ultralytics import YOLOif __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,hdevice='', # 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpuworkers=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 YOLOif __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,hconf=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, # 类别无关的NMSretina_masks=False, # 使用高分辨率的分割掩码boxes=True, # 在分割预测中显示边界框)


6. 分割怎么改进
有同学问分割怎么改进,其实和检测任务一样的,唯一区别就是下面红框中的区别,
是用我给的改进和脚本很容易上手改进分割任务~

相关文章:
YOLOv8 训练自己的分割数据集
之前写过一篇 使用YOLOv8训练自己的【目标检测】数据集-【收集数据集】-【标注数据集】-【划分数据集】-【配置训练环境】-【训练模型】-【评估模型】-【导出模型】,里面带大家整个流程走过一遍了, 这篇文章我们来介绍如何使用 YOLOv8 训练分割数据集&a…...
Python实现DDos攻击实例详解
文章目录 SYN 泛洪攻击Scapy3k 基本用法代码实现DDos 实现思路argparse 模块socket 模块代码实现Client 端程序测试后记关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…...
微信小程序实现【点击 滑动 评分 评星(5星)】功能
wxml文件: <view class"wxpl_xing"><view class"manyidu">{{scoreContent}}</view><view><block wx:for{{scoreArray}} wx:for-item"item"><view classstarLen bindtapchangeScore data-sy"{{…...
堡垒机的用途
堡垒机的用途 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时…...
超全超实用行业解决方案合集,覆盖十大行业数据应用需求
现代企业面对复杂的业务需求,对数据分析的需求日益增加。 从实时销售到市场趋势,从客户行为到产品优化,每个环节都依赖于数据支持。然而,传统的数据分析平台常分散在不同系统和团队中,形成数据孤岛,降低了…...
一盏茶的时间,入门 Node.js
一、.什么是 Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型,使其在处理并发请求时表现出色。 二、安装 Node.js 首先,让我们从 Node.…...
关于Java多线程的一些随笔
Synchronized与ReentrantLock有哪些相同点和不同点? 在Java中,synchronized关键字和ReentrantLock类都用于管理线程间的同步,但它们在实现方式、功能和灵活性方面存在一些差异。以下是它们的相同点和不同点: 相同点 互斥性&…...
Answering difficult questions in other way
I’m not (too) sure Q:Do you think computers make life easier? A:I’m not (too) sure, to be honest, but I reckon they do make life easier because… I can’t say for sure, but … Q:Do you think computers make lif…...
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成
RabbitMQ教程:Linux下安装、基本命令与Spring Boot集成 1. RabbitMQ简介 RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级消息传递协议(AMQP)在分布式系统中传递消息。它支持多种编程语言,包括Java、Pytho…...
王者荣耀小游戏
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…...
JAVA小游戏“简易版王者荣耀”
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…...
Nginx高级
Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM、浪潮、DELL、HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘:SAS(SCSI) HDD(机械…...
深度学习中小知识点系列(三) 解读Mosaic 数据增强
前言 Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接。Mosaic有如下优点: (1)丰富数据集:随机使用4张图片,随机缩放,再随…...
telnet-MISC-bugku-解题步骤
——CTF解题专栏—— 题目信息: 题目:这是一张单纯的图片 作者:未知 提示:无 解题附件: 解题思路: (⊙﹏⊙)这是个什么文件pcap文件分析_pcap文件打开-CSDN博客查了一下,但没看懂,…...
大数据Doris(二十九):数据导入(Insert Into)
文章目录 数据导入(Insert Into) 一、创建导入...
jmeter测试dubbo接口
本文讲解jmeter测试dubbo接口的实现方式,文章以一个dubbo的接口为例子进行讲解,该dubbo接口实现的功能为: 一:首先我们看服务端代码 代码架构为: 1:新建一个maven工程,pom文件为: 1…...
分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测
分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测 目录 分类预测 | Matlab实现基于DBN-SVM深度置信网络-支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.利用DBN进行特征提取,将提取后的特征放入SVM进行分类…...
android系统新特性——用户界面以及系统界面改进
用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言,它是一套完整的设计系统,包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述,让开发者设计出更符合目标的软件,…...
电量计驱动代码
外部电量计驱动代码,直接上代码了,懒,不做细节分析。。。。。 /** Fuelgauge battery driver** This package is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Soft…...
如何将音频添加到视频并替换视频中的音轨
随着视频流媒体网站的流行和便携式设备的发展,你可能越来越倾向于自己制作视频并在互联网上分享。有时,你可能还需要编辑视频并为其添加背景音乐,因为音乐总是对视频的感知起着神奇的作用。 那如何给视频添加音频呢?或者如何用新…...
NokiaLCD库:扩展PCF8833 LCD显示宽度至128像素
1. 项目概述 NokiaLCD 是一个面向嵌入式平台的轻量级图形驱动库,专为兼容 Philips PCF8833 显示控制器的单色/灰度 Nokia 系列 LCD 模块设计。该库最初由 Olimex 和 SparkFun 等硬件厂商在配套开发板(如 OLIMEXINO-328、SparkFun LCD Shield)…...
3个技巧让旧iPhone重获新生:Legacy iOS Kit降级实战指南
3个技巧让旧iPhone重获新生:Legacy iOS Kit降级实战指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...
ArcGIS Pro新手必看:用‘按掩膜提取’和‘裁剪’工具搞定栅格与矢量数据范围限定(附详细步骤图)
ArcGIS Pro数据范围限定实战:从工具选择到避坑指南 刚接触ArcGIS Pro的研究人员常常会遇到这样的困惑:手头收集了研究区域的各种数据,却不知道如何精确限定到自己的研究范围。面对"裁剪"和"按掩膜提取"两个看似相似的工具…...
SEO优化推广的具体流程是什么
SEO优化推广的具体流程是什么 在当今互联网时代,SEO优化推广已成为网站流量获取的关键手段。具体的SEO优化推广流程是什么呢?本文将详细介绍SEO优化推广的具体流程,帮助你更好地了解和实践这一重要的数字营销技能。 一、前期准备 在开始SE…...
解锁毕业论文新姿势:书匠策AI,你的学术写作超级助手!
在学术的浩瀚海洋中,毕业论文无疑是每位学子扬帆远航前必须跨越的一道重要关卡。它不仅是对你多年学习成果的总结,更是通往未来学术或职业道路的一块重要敲门砖。然而,面对堆积如山的资料、错综复杂的逻辑结构,以及那令人头疼的格…...
seo优化代理如何增加网站的流量和转化率
了解SEO优化代理的基本概念 在数字营销的现代环境中,SEO优化代理(Search Engine Optimization代理)扮演着至关重要的角色。SEO优化代理是一种专门提供网站搜索引擎优化服务的公司或团队,致力于提升网站在搜索引擎结果中的排名&am…...
从零学NLP:自然语言处理完整学习路线
从零学NLP:自然语言处理完整学习路线 标签:#自然语言处理、#人工智能、#大模型、#大模型实战、#transformer、#机器学习、#深度学习 自然语言处理行业价值、核心应用场景 2026年,自然语言处理(NLP)已是AI最普适的技术&…...
cwalk:嵌入式C/C++轻量级路径处理库实战指南
1. cwalk:嵌入式系统中轻量级跨平台路径处理库的工程实践解析在嵌入式固件开发中,路径操作看似与裸机环境无关,实则在多个关键场景中不可或缺:Bootloader中从FAT32/SD卡加载固件镜像时需解析/firmware/v2.3.1/app.bin;…...
双向链表添加节点实现分析
链表节点结构class Node {private Object obj;private Node pre;private Node next;public Node(Object obj, Node pre, Node next) {this.obj obj;this.pre pre;this.next next;} }节点包含三个字段:存储数据的obj,指向前驱节点的pre,指向…...
【SpringAIAlibaba新手村系列】(12)RAG 检索增强生成技术
第十二章 RAG 检索增强生成技术 版本标注 Spring AI: 1.1.2Spring AI Alibaba: 1.1.2.0 章节定位 本章的 RetrievalAugmentationAdvisor VectorStore 仍然是经典 RAG 入门方案。但 Spring AI Alibaba 1.1.2.x 官方代码已经进一步演进到 RAG Workflow 思路,典型流程…...
