使用 Ultralytics YOLO 进行语义分割#
语义分割会为图像中的每个像素分配类别标签,从而生成覆盖整个场景的稠密类别图。与会分离单个对象的实例分割不同,语义分割会将所有同类像素归为一组,不受独立对象数量影响。
观看: 使用 Ultralytics YOLO26 进行语义分割 | 快速入门教程
语义分割模型的输出是一张单独的高×宽类别图,其中每个像素值都对应一个预测类别 ID。因此,语义分割非常适合场景解析任务,例如自动驾驶、医学影像和土地覆盖制图。
使用 task=semantic 或 yolo semantic CLI 任务进行语义分割。YOLO26 语义分割模型文件使用 -sem 后缀,例如 yolo26n-sem.pt。
模型#
下方展示了在 Cityscapes 数据集上预训练的 YOLO26 Semantic 模型。
首次使用时,模型会自动从 Ultralytics 最新版本下载。
| 模型 | 尺寸 (像素) | mIoU验证集 | 速度 RTX3090 PyTorch (ms) | 参数 (M) | FLOPs (B) |
|---|---|---|---|---|---|
| YOLO26n-sem | 1024 × 2048 | 78.3 | 4.4 ± 0.0 | 1.6 | 23.8 |
| YOLO26s-sem | 1024 × 2048 | 80.8 | 8.4 ± 0.0 | 6.5 | 91.0 |
| YOLO26m-sem | 1024 × 2048 | 82.0 | 19.9 ± 0.1 | 14.3 | 305.5 |
| YOLO26l-sem | 1024 × 2048 | 82.9 | 26.5 ± 0.1 | 17.8 | 388.2 |
| YOLO26x-sem | 1024 × 2048 | 83.6 | 48.9 ± 0.2 | 40.1 | 866.9 |
- mIoUval 数值是在 Cityscapes 验证集上以单模型、单尺度方式测得的。
使用yolo semantic val data=cityscapes.yaml device=0 imgsz=2048复现 - 速度指标是在 RTX3090 实例上对 Cityscapes 验证图像进行测量后取平均值。
使用yolo semantic val data=cityscapes.yaml batch=1 device=0|cpu imgsz=2048复现 - 参数量和 FLOPs 数值对应于经过
model.fuse()融合后的模型,该操作会合并 Conv 和 BatchNorm 层。预训练检查点保留完整的训练架构,因此显示的计数可能更高。
下方展示了在 ADE20K 数据集上预训练的 YOLO26 Semantic 模型。
| 模型 | 尺寸 (像素) | mIoU验证集 | 速度 RTX3090 PyTorch (ms) | 参数 (M) | FLOPs (B) |
|---|---|---|---|---|---|
| YOLO26n-sem-ade20k | 640 | 38.8 | 3.9 ± 0.2 | 1.6 | 4.5 |
| YOLO26s-sem-ade20k | 640 | 45.6 | 4.2 ± 0.3 | 6.5 | 17.5 |
| YOLO26m-sem-ade20k | 640 | 47.4 | 4.7 ± 0.3 | 14.4 | 59.6 |
| YOLO26l-sem-ade20k | 640 | 49.7 | 8.3 ± 0.2 | 17.9 | 75.2 |
| YOLO26x-sem-ade20k | 640 | 51.5 | 9.9 ± 0.3 | 40.2 | 168.4 |
- mIoUval 数值是在 ADE20K 验证集上以单模型、单尺度方式测得的。
使用yolo semantic val model=yolo26n-sem-ade20k.pt data=ade20k.yaml device=0 imgsz=640复现,并将yolo26n-sem-ade20k.pt替换为所需的yolo26*-sem-ade20k.pt检查点。 - 速度指标是在 RTX3090 实例上对 ADE20K 验证图像进行测量后取平均值。
使用yolo semantic val model=yolo26n-sem-ade20k.pt data=ade20k.yaml batch=1 device=0|cpu imgsz=640复现,并将yolo26n-sem-ade20k.pt替换为所需的yolo26*-sem-ade20k.pt检查点。 - 参数量和 FLOPs 数值对应于经过
model.fuse()融合后的模型,该操作会合并 Conv 和 BatchNorm 层。预训练检查点保留完整的训练架构,因此显示的计数可能更高。
查看尚未发布的 YOLO27 预览版,了解初步的 Cityscapes mIoU 结果。
训练#
在 Cityscapes8 数据集上以 1024 的图像尺寸训练 YOLO26n-sem,训练 100 个轮次。如需查看可用参数的完整列表,请参阅配置页面。
from ultralytics import YOLO
# 加载模型
model = YOLO("yolo26n-sem.yaml") # 从 YAML 构建新模型
model = YOLO("yolo26n-sem.pt") # 加载预训练模型(推荐用于训练)
model = YOLO("yolo26n-sem.yaml").load("yolo26n-sem.pt") # 从 YAML 构建模型并迁移权重
# 训练模型
results = model.train(data="cityscapes8.yaml", epochs=100, imgsz=1024)有关 train 模式的完整详情,请参阅训练页面。你也可以使用 Ultralytics Platform 云训练训练语义分割模型。
数据集格式#
语义分割数据集使用单通道掩码图像(通常为 PNG),其中每个像素值表示一个类别 ID。值为 255 的像素会被视为“忽略”像素,不参与损失计算。数据集 YAML 应指定图像路径及其对应的掩码目录。带有 YOLO 多边形标签的数据集可以直接用于训练,标签会即时转换为掩码(参见下文的我可以使用实例分割数据吗)。有关格式详情,请参阅语义分割数据集指南。支持的数据集包括 Cityscapes 和 ADE20K。你可以使用 Ultralytics Platform 标注管理和标注语义数据集。
验证#
在语义分割数据集上验证已训练的 YOLO26n-sem 模型精度。请显式传入 data,以确保验证使用预期的数据集 YAML。
from ultralytics import YOLO
# 加载模型
model = YOLO("yolo26n-sem.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义模型
# 验证模型
metrics = model.val(data="cityscapes.yaml")
metrics.miou # 平均交并比
metrics.pixel_accuracy # 总体像素准确率预测#
使用训练好的 YOLO26n-sem 模型对图像进行预测。
from ultralytics import YOLO
# 加载模型
model = YOLO("yolo26n-sem.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义模型
# 使用模型进行预测
results = model("https://ultralytics.com/images/bus.jpg") # 对图像进行预测
# 访问结果
for result in results:
semantic_mask = result.semantic_mask.data # 类别图,形状为 (H,W),整数数据类型由类别数量决定请参阅预测页面,了解完整的 predict 模式详情。
结果输出#
YOLO 语义分割会为每张图像返回一个 Results 对象。每个结果都为整张图像存储一张稠密类别图,而不是对象掩码列表。即使同一预测类别的像素属于不同对象,它们也会共享相同的类别 ID。
| 属性 | 类型 | 形状 | 说明 |
|---|---|---|---|
result.semantic_mask | SemanticMask | (H,W) | 密集类别映射。 |
result.semantic_mask.data | torch.uint8torch.int16torch.int32 | (H,W) | 类别 ID;数据类型由类别数量决定。 |
result.masks | - | - | 没有实例掩码。 |
result.boxes | - | - | 没有实例框/置信度。 |
如需了解所有任务中特定于任务的 Results 字段,请参阅按任务查看预测结果部分。
语义分割会预测一张稠密类别图,然后将该图调整回图像尺寸,以供可视化和下游使用。因此,当推理时使用的 imgsz 远低于原始图像分辨率时,车道标线、球场线、杆子或电线等极细结构可能会呈现锯齿状。如果边界看起来不平滑,请先使用更大的 imgsz 重新测试原生 PyTorch .pt 模型,例如 1024、1280,或选择最接近源图像尺寸的实用值。确认 .pt 输出可接受后,再使用导出模型,因为较低分辨率的输入无法恢复预测类别图中原本不存在的精细细节。
实例分割与语义分割#
| 方面 | 实例分割(task="segment") | 语义分割(task="semantic") |
|---|---|---|
| 预测目标 | 分别分割每个检测到的对象 | 为每个像素分配一个类别 ID |
| 输出字段 | result.masks | result.semantic_mask |
| 主要数据 | result.masks.data | result.semantic_mask.data |
| 形状 | (N,H,W) | (H,W) |
| 像素值 | 二值掩码值:0 或 1 | 类别 ID:0、1、2…… |
| 数据类型 | torch.uint8 | torch.uint8torch.int16torch.int32 |
| 同类对象 | 保留为独立实例 | 合并到同一类别区域 |
| 多边形 | 可以,通过 result.masks.xy 和 result.masks.xyn | 默认不输出多边形 |
| 边界框和置信度 | 可以,通过 result.boxes | 不提供每个实例的边界框或置信度分数 |
| 典型用途 | 计数、跟踪、裁剪、对象级测量 | 稠密场景标注、可行驶区域、土地覆盖、医学区域 |
导出#
将 YOLO26n-sem 模型导出为 ONNX、CoreML 等其他格式。
from ultralytics import YOLO
# 加载模型
model = YOLO("yolo26n-sem.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义模型
# 导出模型
model.export(format="onnx")下表列出了可用的 YOLO26 语义分割导出格式。你可以使用 format 参数导出为任意格式,例如 format='onnx' 或 format='engine'。你可以直接使用导出的模型进行预测或验证,例如 yolo predict model=yolo26n-sem.onnx。导出完成后,系统会显示适用于你模型的用法示例。
| 格式 | format 参数 | 模型 | 元数据 | 参数 |
|---|---|---|---|---|
| PyTorch | - | yolo26n-sem.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-sem.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-sem.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-sem_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-sem.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-sem.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-sem.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-sem_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-sem.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-sem_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-sem.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-sem_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-sem.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-sem_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-sem_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-sem_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-sem_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-sem_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-sem_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-sem_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-sem_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-sem_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-sem_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None 默认输出原始结果,以供外部 NMS 使用。设置 nms=False 可选择可用的无 NMS 检测头;不支持的格式会回退到其原生输出路径。上方的 nms 条目表示可以通过 nms=True 嵌入 NMS 的格式。
请参阅 Export 页面,了解完整的 export 详情。
常见问题#
要在自定义数据集上训练 YOLO26 语义分割模型,你需要准备 PNG 掩码图像,其中每个像素值表示一个类别 ID(0、1、2……),值为 255 的像素会在训练期间被忽略。创建一个指向图像和掩码目录的数据集 YAML 文件,然后训练模型:
示例from ultralytics import YOLO # 加载预训练的 YOLO26 语义分割模型 model = YOLO("yolo26n-sem.pt") # 训练模型 results = model.train(data="path/to/your_dataset.yaml", epochs=100, imgsz=1024)请查看配置页面,了解更多可用参数。
可以。如果你的数据集使用 Ultralytics YOLO 多边形标签(每张图像对应一个
.txt),请从数据集 YAML 中省略masks_dir,并确保数据集根目录下图像旁边不存在masks/文件夹(仅该文件夹存在就会触发 PNG 掩码模式,即使没有设置masks_dir也是如此)。随后,加载器会即时将多边形转换为每张图像对应的语义掩码。对于多类别数据集(N > 1),系统会自动在names中追加一个background类别。对于单类别数据集(N == 1),训练仍使用 1 个类别——你声明的类别会成为掩码中的1,未覆盖的像素则变为0。详情请参阅语义分割数据集指南。Ultralytics YOLO26 内置了多个语义分割数据集的配置:
- Cityscapes:包含 19 个类别的城市街景数据集,广泛用于自动驾驶研究。
- ADE20K:大规模场景解析数据集,包含 150 个类别。
你也可以使用任何提供 PNG 掩码标注的自定义数据集,其中像素值对应类别 ID。
使用评估时采用的数据集 YAML 文件验证预训练的 YOLO26 语义分割模型:
示例from ultralytics import YOLO # 加载预训练模型 model = YOLO("yolo26n-sem.pt") # 验证模型 metrics = model.val(data="cityscapes.yaml") print("Mean IoU:", metrics.miou) print("Pixel Accuracy:", metrics.pixel_accuracy)这些步骤会生成 mIoU(平均交并比)和像素准确率等验证指标,这些都是评估语义分割性能的标准度量。
使用 Python 或 CLI 命令将 YOLO26 语义分割模型导出为 ONNX 格式:
示例from ultralytics import YOLO # 加载预训练模型 model = YOLO("yolo26n-sem.pt") # 将模型导出为 ONNX 格式 model.export(format="onnx")如需了解将模型导出为各种格式的更多详情,请参阅导出页面。