【计算机视觉】YOLO语义分割

发布于:2025-04-03 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、语义分割简介

1. 定义

语义分割(Semantic Segmentation)是计算机视觉中的一项任务,其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同,语义分割能够在像素级别上区分不同类别,从而实现对图像内容更精细的理解。

2. 原理

  • 像素级分类: 网络将输入图像逐像素进行分类,每个像素根据其所在区域被赋予一个类别标签。
  • 深度卷积神经网络: 常用网络结构包括全卷积网络(FCN)、U-Net、DeepLab等,这些结构通常由一个特征提取的backbone(例如ResNet、EfficientNet)和一个上采样(或解码)部分构成,用以恢复空间分辨率。
  • 损失函数: 常用交叉熵损失、Dice Loss等来平衡各类样本(尤其当类别分布不均衡时)。

3. 作用与应用

  • 自动驾驶: 对道路、行人、车辆等目标进行像素级分割,辅助场景理解。
  • 医疗影像: 分割器官、病灶区域,辅助临床诊断。
  • 遥感图像: 提取地物信息,如建筑、道路、水域等。
  • 场景解析: 用于机器人导航、视频监控等需要环境理解的场景。

二、基于YOLO进行语义分割训练

虽然原始的YOLO系列模型主要用于目标检测,但最新版本(例如YOLOv8)已经扩展了分割能力,实现了检测与分割任务的联合训练。下面介绍具体流程。

1. 数据集标注

  • 标注方式:

    • 对于语义分割,需要为每个图像提供与之对应的分割掩码(mask),每个像素的值表示其所属类别。
    • 常见的标注格式有VOC格式(以PNG图片保存mask)或COCO格式(包含多边形或RLE编码)。
    • 如果是基于YOLOv8的分割任务,则一般需要两个文件:图像文件以及对应的mask文件,mask中的不同灰度值代表不同类别。
  • 注意事项:

    • 标注时要确保边界清晰,避免模糊区域。
    • 类别不平衡问题需提前处理,如进行数据增强或采样调整。
  • 标注信息

    class_id x1 y1 x2 y2 ... xn yn
    

    各位置的含义说明如下:

    • 第一个数(class_id):
      表示该目标的类别编号(从 0 开始),用于区分不同的语义类别。
    • 后续的数值(x1, y1, x2, y2, …, xn, yn):
      这些数字成对出现,每一对代表多边形边界上一个顶点的坐标。
      • x 坐标与 y 坐标:通常是归一化后的值(相对于图像宽度和高度),数值范围通常在 0 到 1 之间。
      • 顶点顺序:须按照目标边缘的顺序排列(顺时针或逆时针均可,但应保持一致),以确保能够正确构成目标的闭合区域。

2. 训练方式与代码示例

YOLOv8的分割模型在训练时通常采用端到端方式,同时学习检测和分割任务。下面提供一个伪代码/代码示例,展示如何进行训练:

# data.yaml —— YOLOv8 语义分割任务数据集配置文件

# 数据集根目录,可以是绝对路径或相对于当前工作目录的相对路径
path: ../datasets/pothole_seg

# 训练、验证和测试图像的路径(相对于 path)
train: images/train   # 存放训练图像的文件夹
val: images/val       # 存放验证图像的文件夹
test: images/test     # 测试图像(可选,训练时可以不配置)

# 类别数量
nc: 1

# 类别名称列表,顺序要与标注数据中每行第一个数字(类别索引)保持一致
names: ['pothole']

在上述代码中,YOLOv8的训练脚本会自动加载数据、应用数据增强、计算目标检测与分割的联合损失,最终输出训练好的模型。

3. 模型评估

在训练过程中,YOLOv8 会实时输出多个指标来帮助您评估模型的性能,主要包括:

  • 训练损失:记录总损失以及各个组成部分,如目标框(box)损失、目标置信度(obj)损失、分类(cls)损失以及分割任务中特有的掩码损失(mask loss 或 segmentation loss)。
  • 验证指标:在验证阶段,会自动计算并输出常见指标,如精度(Precision,P)、召回率(Recall,R)、以及平均精度均值(mAP),通常包括 mAP@0.5(即 IoU 阈值为 0.5 时的 mAP)和 mAP@0.5:0.95(不同 IoU 阈值下的综合 mAP)。
  • 速度指标:训练日志中还会显示每个 epoch 的时间消耗、每张图像的处理速度等,这有助于评估训练效率。

4. 模型使用

from ultralytics import YOLO

# 加载训练好的语义分割模型权重
model = YOLO("runs/segment/train/weights/best.pt")

# 对单张图像进行推理
results = model.predict(source="path/to/image.jpg", imgsz=640)

# 查看并保存推理结果(通常在runs/segment/predict目录中保存预测图片和对应的txt文件)
results.show()    # 弹窗显示预测结果
results.save()    # 将预测结果保存到磁盘

  • 分割掩码:每个检测到的对象会输出一个精确的分割掩码,可用于后续的目标区域分析。
  • 置信度:显示每个预测的置信度分数,帮助您判断模型输出的可靠性。
  • 后处理:根据需要,您可以对输出的结果进行进一步的后处理,例如与原图叠加显示、导出为JSON格式等。

三、语义分割训练技巧与注意点

数据与标注

  • 标注质量:语义分割要求精细的多边形标注,每个目标区域的顶点必须准确无误。确保标注数据的一致性和准确性,否则容易影响模型分割效果。
  • 数据预处理:图像和标注文件需要归一化处理,保证坐标值在 [0, 1] 范围内。同时建议对数据进行合理划分(训练/验证/测试),保证数据分布均衡。

数据增强

  • 多样化增强:使用随机翻转、旋转、缩放、透视变换以及马赛克(Mosaic)等数据增强策略,可以显著提升模型对各种场景的泛化能力。
  • 注意增强策略与任务匹配:对于语义分割任务,增强方法需要同时作用于图像和对应的掩码。确保增强过程中保持目标区域的连贯性。

模型与超参数设置

  • 预训练权重:使用预训练模型(如 yolov8n-seg.pt)作为初始化,可以加速收敛并提高精度,尤其在数据量较小时效果更明显。
  • 训练损失监控:关注总损失及各部分损失(如 box、obj、cls、mask 损失),根据损失变化及时调整学习率和其他超参。
  • 超参数调节:调节 batch size、学习率(lr0 与 lrf)、动量、权重衰减等,特别注意 mask_ratio 和 overlap_mask 参数,这两个参数对语义分割模型中掩码预测的效果有较大影响。
  • 多尺度训练:可尝试使用多尺度训练以适应不同尺寸目标,提高模型的鲁棒性。

训练过程监控与调试

  • 实时监控:利用 TensorBoard 或 Ultralytics 提供的日志工具实时查看训练过程中的损失曲线、验证指标(如 mAP@0.5 和 mAP@0.5:0.95)、精度和召回率等。
  • 早停机制:使用早停(early stopping)策略,在验证指标长时间不提升时停止训练,避免过拟合。
  • 硬件与内存:根据 GPU 内存适当设置 batch size,同时注意使用 AMP(自动混合精度)训练,既能提高训练速度也能降低内存占用。

后处理与结果可视化

  • 分割掩码处理:训练完成后,通过可视化工具检查预测的分割掩码效果,验证模型是否能准确还原目标区域。
  • 定制后处理:根据任务需求可以对分割结果进行后处理,例如平滑边界、提取 ROI 区域等。

在这里插入图片描述