目录
搭建环境说明
不同版本模型性能对比
不同版本对比
参数解释
不同模型说明
YOLOv8n-seg
YOLOv8s-seg
YOLOv8m-seg
YOLOv8l-seg
YOLOv8x-seg
训练
训练示意代码
训练用数据集与 .yaml 配置方法
.yaml配置
数据集路径
标签数据说明
训练参数说明
训练过程示意及输出文件说明
训练成功示意
输出文件说明
F1-置信度曲线 (BoxF1_curve.png)
精确度-置信度曲线 (BoxP_curve.png)
精确度-召回率曲线 (BoxPR_curve.png)
召回率-置信度曲线 (BoxR_curve.png)
混淆矩阵 (confusion_matrix.png)
标准化混淆矩阵 (confusion_matrix_normalized.png)
标签分布 (labels.jpg)
标签相关图 (labels_correlogram.jpg)
掩膜F1-置信度曲线 (MaskF1_curve.png)
精确度-召回率曲线 (Precision-Recall Curve) (MaskPR_curve.png)
召回率-置信度曲线 (Recall-Confidence Curve) (MaskR_curve.png)
训练和验证指标图 (results.png)
损失和性能指标图
验证
验证示意代码
验证结果
验证参数
预测
预测代码
输出参数解释
检测框(boxes)
分割掩码(masks)
总结
如果不知道如何搭建的小伙伴可以参考这个博文:
超级详细的!多种方式YOLOV8安装及测试
操作系统:win10 x64
编程语言:python3.9
开发环境:Anaconda
示例项目下载地址:
yolov8-seg模型源码,实例分割,带数据集,测试可执行demo
模型 | 尺寸 (像素) | mAPbox 50-95 | mAPmask 50-95 | CPU ONNX 速度 (ms) | A100 TensorRT 速度 (ms) | 参数 (M) | FLOPs (B) |
---|---|---|---|---|---|---|---|
YOLOv8n-seg | 640 | 36.7 | 30.5 | 96.1 | 1.21 | 3.4 | 12.6 |
YOLOv8s-seg | 640 | 44.6 | 36.8 | 155.7 | 1.47 | 11.8 | 42.6 |
YOLOv8m-seg | 640 | 49.9 | 40.8 | 317.0 | 2.18 | 27.3 | 110.2 |
YOLOv8l-seg | 640 | 52.3 | 42.6 | 572.4 | 2.79 | 46.0 | 220.5 |
YOLOv8x-seg | 640 | 53.4 | 43.4 | 712.1 | 4.02 | 71.8 | 344.1 |
模型: 这是模型的名称,YOLOv8n-seg, YOLOv8s-seg, 等等。YOLOv8是一个流行的目标检测和分割模型,不同的后缀(如n, s, m, l, x)表示不同的模型大小和复杂度。
尺寸 (像素): 这代表输入图像的分辨率。在这个表格中,所有模型都使用640像素的分辨率。
mAPbox 50-95: 这是衡量模型在目标检测任务中性能的指标,即平均精度(mean Average Precision)。数值越高,性能越好。
mAPmask 50-95: 这是衡量模型在实例分割任务中性能的指标。和mAPbox类似,数值越高代表性能越好。
CPU ONNX 速度 (ms): 这是模型在CPU上使用ONNX格式运行时的速度,以毫秒为单位。数值越低,速度越快。
A100 TensorRT 速度 (ms): 这是模型在NVIDIA A100 GPU上使用TensorRT优化后的运行速度,同样以毫秒为单位。
参数 (M): 这是模型的参数数量,以百万(M)为单位。参数数量通常与模型的复杂度和计算需求成正比。
FLOPs (B): 这是模型的浮点运算数,以十亿(Billion)为单位。这个指标反映了模型运行一次所需要的计算量。
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n-seg.yaml').load('yolov8n-seg.pt') # 从YAML构建并转移权重
if __name__ == '__main__':
# 训练模型
results = model.train(data='coco128-seg.yaml', epochs=10, imgsz=512)
metrics = model.val()
这段代码使用了 Ultralytics 的 YOLO 库来实现一个 YOLOv8n-seg 模型的加载、训练和验证过程。首先,它从 ultralytics
库中导入 YOLO
类,这是一种用于目标检测任务的流行深度学习模型。接着,代码通过指定的 YAML 配置文件(yolov8n-seg.yaml
)构建了一个 YOLOv8n-seg 模型实例,并加载了预训练的权重(yolov8n-seg.pt
)。
在主程序部分,模型被配置为使用一个名为 coco128-seg.yaml
的数据集进行训练,这是 COCO 数据集的一个子集专门用于目标检测和分割任务。训练过程被设置为进行 10 个周期(epochs),并且输入图像的大小被设置为 512x512 像素。
最后,代码执行模型的验证过程,评估模型在独立的验证数据集上的性能。这通常涉及到计算诸如准确度、损失等关键性能指标。
path: C:/Users/admin/Desktop/CSDN/YOLOV8_DEF/ultralytics-seg/coco128-seg
train: images/train2017
val: images/test2017
test: images/test2017
# Classes
names:
0: person
1: bicycle
2: car
3: motorcycle
......
77: teddy bear
78: hair drier
79: toothbrush
# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128-seg.zip
coco128-seg.yaml
文件是一个配置文件,用于设置目标检测和分割任务中使用的数据集。在这种情况下,它配置了一个名为 coco128-seg
的数据集,这是一个基于著名的 COCO (Common Objects in Context) 数据集的子集。以下是对该文件内容的详细描述:
路径设置
path
: 指定数据集所在的根目录路径。在这个例子中,数据集的根目录位于 C:/Users/admin/Desktop/CSDN/YOLOV8_DEF/ultralytics-seg/coco128-seg
。数据集分割
train
: 定义了用于训练模型的图像所在的文件夹,这里是 images/train2017
。val
: 指定了用于验证模型的图像所在的文件夹,这里是 images/test2017
。test
: 指定了用于测试模型的图像所在的文件夹,同样是 images/test2017
。类别定义
names
: 列出了数据集中所有类别的名称。每个类别都分配了一个唯一的索引号(从 0 开始)。例如,索引 0
对应 person
(人),1
对应 bicycle
(自行车),一直到 79
对应 toothbrush
(牙刷)。下载脚本/URL
download
: 提供了数据集的下载链接。在这个案例中,https://ultralytics.com/assets/coco128-seg.zip
是数据集的下载 URL。如果有自己的数据集这个可以忽略掉。这里需要注意,训练集测试集的图片和标签都要一一对应。同时,注意观察这里面的路径是和 .yaml文件中都是对应的关系。
58 0.417781 0.771355 0.440328 0.735397 0.467375 0.658995 ... 0.829766 0.411766 0.793832 0.420781 0.769112
75 0.616156 0.364042 0.631188 0.395514 ... 0.596609 0.4 0.608641 0.37528 0.614656 0.368528
每行数据代表图像中的一个对象,包含了对象的类别、边界框信息,以及用于实例分割的多边形坐标。我将分别解释这两行数据的含义。
58
是对象的类别 ID。0.417781 0.771355
是多边形的第一个点,0.440328 0.735397
是第二个点,依此类推。这些点合起来定义了图像中对象的精确形状。 参数 | 默认值 | 描述 | 设置建议 |
---|---|---|---|
model | None | 模型文件路径 | 选择适合任务的预训练模型 |
data | None | 数据文件路径 | 选择适合的数据集配置 |
epochs | 100 | 训练周期数 | 考虑数据集和模型规模调整 |
time | None | 训练时间(覆盖epochs) | 根据时间限制设定 |
patience | 50 | 早停等待周期 | 观察训练进度,灵活调整 |
batch | 16 | 批量大小 | 基于硬件能力调整 |
imgsz | 640 | 图像尺寸 | 适应模型和硬件设置 |
save | True | 是否保存检查点和结果 | 通常保留默认 |
save_period | -1 | 检查点保存频率 | 需要时设定周期 |
cache | False | 使用数据加载缓存 | 根据硬件和数据集大小 |
device | None | 运行设备 | 选择最佳可用硬件 |
workers | 8 | 数据加载线程数 | 基于系统能力调整 |
project | None | 项目名称 | 自定义以区分项目 |
name | None | 实验名称 | 自定义以识别实验 |
exist_ok | False | 是否覆盖现有实验 | 必要时允许覆盖 |
pretrained | True | 使用预训练模型 | 新任务通常保持True |
optimizer | 'auto' | 优化器选择 | 适应模型和数据集 |
verbose | False | 详细输出 | 调试时设为True |
seed | 0 | 随机种子 | 需重现时设定确定值 |
deterministic | True | 确定性模式 | 结果一致性时启用 |
single_cls | False | 单类训练 | 特定场景下调整 |
rect | False | 矩形训练 | 场景需求时考虑 |
cos_lr | False | 余弦学习率调度 | 根据策略调整 |
close_mosaic | 10 | 关闭马赛克增强周期 | 训练需求调整 |
resume | False | 从检查点恢复 | 中断后继续训练时启用 |
amp | True | 自动混合精度训练 | 硬件支持时使用 |
fraction | 1.0 | 数据集使用比例 | 子集训练时调整 |
profile | False | 记录ONNX/TensorRT速度 | 性能分析时启用 |
freeze | None | 冻结层数 | 模型调整时使用 |
lr0 | 0.01 | 初始学习率 | 适应模型和数据集 |
lrf | 0.01 | 最终学习率 | 训练策略调整 |
momentum | 0.937 | SGD动量/Adam beta1 | 优化器调整 |
weight_decay | 0.0005 | 权重衰减 | 保持默认 |
warmup_epochs | 3.0 | 热身周期数 | 模型特性调整 |
warmup_momentum | 0.8 | 热身动量 | 训练策略调整 |
warmup_bias_lr | 0.1 | 热身偏置学习率 | 训练策略调整 |
box | 7.5 | 盒子损失增益 | 数据和模型调整 |
cls | 0.5 | 类别损失增益 | 任务复杂性调整 |
dfl | 1.5 | DFL损失增益 | 应用调整 |
pose | 12.0 | 姿态损失增益 | 姿态任务专用 |
kobj | 2.0 | 关键点目标损失增益 | 姿态任务专用 |
label_smoothing | 0.0 | 标签平滑 | 训练策略调整 |
nbs | 64 | 标称批量大小 | 硬件资源调整 |
overlap_mask | True | 分割训练中掩码重叠 | 分割任务专用 |
mask_ratio | 4 | 分割训练中掩码下采样比例 | 值越大精度越高,也越费算力 |
dropout | 0.0 | 分类训练中使用dropout | 过拟合时候用 |
val | True | 训练期间验证 | 保持默认 |
plots | False | 训练/验证图表和图像 | 需要可视化时启用 |
看到了这个runs\segment\train\weights\best.pt这个路径的时候说明模型已经训练完了,并且把训练的结果已经保存到了这个文件夹中。输出的结果如下:
Weights文件:这是一个模型权重文件,通常以.pt
(PyTorch模型)格式保存。它包含了经过训练的神经网络的所有参数和权重。这个文件是模型训练过程的直接产物,用于后续的图像识别和分析任务。
Args.yaml文件:这个文件通常包含了模型训练时使用的配置参数。它详细记录了训练过程中使用的所有设置,如学习率、批大小、训练轮数等。这个文件的目的是为了提供一个清晰的训练配置概览,使得训练过程可以被复现或调整。
# 验证模型
metrics = model.val() # 无需参数,数据集和设置已记忆
上文中进行模型训练的时候有这个代码,是直接对模型基于验证数据集进行验证测试模型实际预测效果。
当执行完了验证之后会输出如下文件:
键 | 值 | 描述 |
---|---|---|
data | None | 数据文件的路径,例如 coco128.yaml |
imgsz | 640 | 输入图像的大小,以整数表示 |
batch | 16 | 每批图像的数量(AutoBatch 为 -1) |
save_json | False | 将结果保存至 JSON 文件 |
save_hybrid | False | 保存混合版本的标签(标签 + 额外预测) |
conf | 0.001 | 用于检测的对象置信度阈值 |
iou | 0.6 | NMS(非极大抑制)用的交并比(IoU)阈值 |
max_det | 300 | 每张图像的最大检测数量 |
half | True | 使用半精度(FP16) |
device | None | 运行所用的设备,例如 cuda device=0/1/2/3 或 device=cpu |
dnn | False | 使用 OpenCV DNN 进行 ONNX 推理 |
plots | False | 在训练期间显示图表 |
rect | False | 矩形验证,每批图像为了最小填充整齐排列 |
split | val | 用于验证的数据集分割,例如 'val'、'test' 或 'train' |
from ultralytics import YOLO
# 加载一个模型
model = YOLO('yolov8n-seg.pt') # 预训练的 YOLOv8n 模型
# 对一系列图像执行批量推理
results = model(['im1.jpg', 'im2.jpg']) # 返回一个结果对象列表
# 处理结果列表
for result in results:
boxes = result.boxes # Boxes 对象,用于边界框输出
masks = result.masks # Masks 对象,用于分割掩码输出
keypoints = result.keypoints # Keypoints 对象,用于姿态输出
probs = result.probs # Probs 对象,用于分类输出
print("boxes输出示意:\n", boxes)
print("masks输出示意:\n", masks)
print("keypoints输出示意:\n", keypoints)
print("probs输出示意:\n", probs)
YOLO
对象,并加载一个预训练的模型文件 yolov8n.pt
。这个模型文件包含了 YOLOv8n 模型的结构和预训练的权重。boxes
:包含边界框坐标和置信度的对象。masks
:如果模型支持分割,这将包含分割的掩码。keypoints
:如果模型支持姿态估计,这将包含关键点信息。probs
:包含检测到的每个对象的分类概率的对象。boxes输出示意:
ultralytics.engine.results.Boxes object with attributes:
cls: tensor([0., 5., 0., 0.], device='cuda:0')
conf: tensor([0.9194, 0.8140, 0.5115, 0.3614], device='cuda:0')
data: tensor([[4.3477e+02, 2.1730e+02, 5.5293e+02, 4.9673e+02, 9.1937e-01, 0.0000e+00],
[8.5124e+00, 8.0904e+00, 7.1692e+02, 4.1092e+02, 8.1404e-01, 5.0000e+00],
[4.4685e+02, 1.7999e+02, 4.9055e+02, 2.6538e+02, 5.1146e-01, 0.0000e+00],
[4.9358e+02, 1.5875e+02, 5.2287e+02, 2.6032e+02, 3.6142e-01, 0.0000e+00]], device='cuda:0')
id: None
is_track: False
orig_shape: (500, 727)
shape: torch.Size([4, 6])
xywh: tensor([[493.8499, 357.0147, 118.1585, 279.4378],
[362.7140, 209.5052, 708.4032, 402.8297],
[468.7004, 222.6888, 43.6939, 85.3918],
[508.2283, 209.5384, 29.2877, 101.5713]], device='cuda:0')
xywhn: tensor([[0.6793, 0.7140, 0.1625, 0.5589],
[0.4989, 0.4190, 0.9744, 0.8057],
[0.6447, 0.4454, 0.0601, 0.1708],
[0.6991, 0.4191, 0.0403, 0.2031]], device='cuda:0')
xyxy: tensor([[434.7706, 217.2958, 552.9291, 496.7336],
[ 8.5124, 8.0904, 716.9156, 410.9201],
[446.8535, 179.9928, 490.5474, 265.3846],
[493.5845, 158.7527, 522.8722, 260.3240]], device='cuda:0')
xyxyn: tensor([[0.5980, 0.4346, 0.7606, 0.9935],
[0.0117, 0.0162, 0.9861, 0.8218],
[0.6147, 0.3600, 0.6748, 0.5308],
[0.6789, 0.3175, 0.7192, 0.5206]], device='cuda:0')
cls
: 类别张量,标识检测到的每个对象的类别索引(例如,0 代表第一个类别)。conf
: 置信度张量,表示模型对每个检测到的对象类别的置信程度。data
: 包含检测框坐标和置信度的张量。每行代表一个检测到的对象,格式通常为 [x_min, y_min, x_max, y_max, conf, cls]。orig_shape
: 原始图像尺寸,即模型接收的输入图像的尺寸。shape
: 检测框的形状,通常是一个包含检测到的对象数量和每个对象特征数量的形状张量。xywh
: 检测框的中心坐标和宽高,格式为 [x_center, y_center, width, height]。xywhn
: xywh
的归一化形式,其中坐标和尺寸是相对于图像大小的比例。xyxy
: 检测框的直角坐标,格式为 [x_min, y_min, x_max, y_max]。xyxyn
: xyxy
的归一化形式,同样是相对于图像大小的比例。ultralytics.engine.results.Masks object with attributes:
data: tensor([[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]], device='cuda:0')
orig_shape: (500, 727)
shape: torch.Size([4, 640, 640])
xy: [array([[ 488.45, 218.19],
[ 487.32, 219.33],
......,
[ 498.68, 219.33],
[ 497.54, 219.33],
[ 496.4, 218.19]], dtype=float32), array([[ 408.94, 9.1812],
[ 407.8, 10.317],
[ 399.85, 10.317],
......,
[ 440.74, 10.317],
[ 435.06, 10.317],
[ 433.93, 9.1812]], dtype=float32), array([[ 460.05, 181.84],
[ 458.92, 182.98],
[ 458.92, 192.07],
......,
[ 478.23, 200.02],
[ 475.96, 197.75],
[ 475.96, 184.12],
[ 473.69, 181.84]], dtype=float32), array([[ 511.17, 159.12],
[ 510.04, 160.26],
......,
[ 521.4, 160.26],
[ 520.26, 159.12]], dtype=float32)]
xyn: [array([[ 0.67188, 0.43639],
[ 0.67031, 0.43866],
......,
[ 0.68437, 0.43866],
[ 0.68281, 0.43639]], dtype=float32), array([[ 0.5625, 0.018362],
[ 0.56094, 0.020634],
[ 0.55, 0.020634],
...,
[ 0.60625, 0.020634],
[ 0.59844, 0.020634],
[ 0.59687, 0.018362]], dtype=float32), array([[ 0.63281, 0.36369],
[ 0.63125, 0.36596],
[ 0.63125, 0.38413],
......,
[ 0.65469, 0.39549],
[ 0.65469, 0.36823],
[ 0.65156, 0.36369]], dtype=float32), array([[ 0.70312, 0.31825],
[ 0.70156, 0.32052],
[ 0.7, 0.32052],
......,
[ 0.71719, 0.32052],
[ 0.71562, 0.31825]], dtype=float32)]
data
: 分割掩码的张量,其中每个元素代表图像中相应像素的分割结果。通常,值接近 1 表示该像素属于某个对象,值接近 0 表示背景。orig_shape
: 分割掩码对应的原始图像尺寸。shape
: 分割掩码的尺寸,通常与模型的输入尺寸相匹配。xy
: 对象的边缘点坐标,用于可视化或进一步处理(如抠图)。有了上述的这些内容,我们就可以自由的在进行后续其他任务的处理了。最终我直接使用yolo对图片的预测结果进行保存(就是在predict中加上save=True的参数):
这篇博客提供了一个全面的指南,介绍了如何使用 Ultralytics YOLOv8-seg 系列模型进行对象检测和分割任务。内容从环境搭建、模型选择、训练、验证到预测的完整流程都有详细说明。为想要使用 YOLOv8-seg 系列模型的开发者提供了一站式的解决方案。它不仅涵盖了从环境配置到模型部署的详细步骤,还解释了如何解读和使用模型输出,使得用户能够根据自己的需求选择合适的模型,并能够有效地训练和评估它们。 如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。