使用 Ultralytics YOLO 进行语义分割#
语义分割为图像中的每个像素分配类别标签,生成覆盖整个场景的密集类别图。不同于实例分割将各个对象分离开来,语义分割会将同一类别的所有像素归为一组,而不考虑其中包含多少个不同对象。
Watch: Semantic Segmentation with Ultralytics YOLO26 | Quickstart Tutorial
语义分割模型的输出是一个单一的高×宽类别图,其中每个像素值对应一个预测类别 ID。这使语义分割非常适合场景解析任务,例如自动驾驶、医学成像和土地覆盖制图。
使用 task=semantic 或 yolo semantic CLI 任务进行语义分割。YOLO26 语义分割模型文件使用 -sem 后缀,例如 yolo26n-sem.pt。
模型#
下面展示了在 Cityscapes 数据集上预训练的 YOLO26 语义分割模型。
首次使用时,模型 会自动从最新的 Ultralytics 发布版本 下载。
| 模型 | 尺寸 (像素) | mIoUval | 速度 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复现 - Speed 指标是在 RTX3090 实例上对 Cityscapes 验证图像取平均得到的。
使用yolo semantic val data=cityscapes.yaml batch=1 device=0|cpu imgsz=2048复现 - Params 和 FLOPs 值对应于执行
model.fuse()后的融合模型,该操作会合并 Conv 和 BatchNorm 层。预训练检查点保留完整的训练架构,因此显示的数量可能更高。
下面展示了在 ADE20K 数据集上预训练的 YOLO26 语义分割模型。
首次使用时,模型 会自动从最新的 Ultralytics 发布版本 下载。
| 模型 | 尺寸 (像素) | mIoUval | 速度 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检查点。 - Speed 指标是在 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检查点。 - Params 和 FLOPs 值对应于执行
model.fuse()后的融合模型,该操作会合并 Conv 和 BatchNorm 层。预训练检查点保留完整的训练架构,因此显示的数量可能更高。
查看未发布的 YOLO27 预览版以了解初步的 Cityscapes mIoU 结果。
训练#
在 Cityscapes8 数据集上以图像大小 1024 训练 YOLO26n-sem,共训练 100 个周期。有关可用参数的完整列表,请参阅配置页面。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-sem.yaml") # build a new model from YAML
model = YOLO("yolo26n-sem.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-sem.yaml").load("yolo26n-sem.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="cityscapes8.yaml", epochs=100, imgsz=1024)请在训练页面查看完整的 train 模式详细信息。语义分割模型也可以通过 Ultralytics Platform 云训练进行训练。
数据集格式#
语义分割数据集使用单通道掩码图像,通常为 PNG 格式,其中每个像素值表示一个类别 ID。值为 255 的像素会被视为“ignore”,并从损失计算中排除。数据集 YAML 应指定图像路径及其对应的掩码目录。有关格式详细信息,请参阅语义分割数据集指南。支持的数据集包括 Cityscapes 和 ADE20K。你可以使用 Ultralytics Platform 标注管理语义数据集并为其添加标签。
验证#
在语义分割数据集上验证已训练的 YOLO26n-sem 模型准确率。显式传入 data,确保验证使用指定的数据集 YAML。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-sem.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="cityscapes.yaml")
metrics.miou # mean Intersection over Union
metrics.pixel_accuracy # overall pixel accuracyPredict#
使用已训练的 YOLO26n-sem 模型对图像运行预测。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-sem.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# Access the results
for result in results:
semantic_mask = result.semantic_mask.data # class map, shape (H,W), integer dtype selected by class count请在预测页面查看完整的 predict 模式详情。
结果输出#
YOLO 语义分割会为每张图像返回一个 Results 对象。每个结果都会为整张
图像存储一个密集类别图,而不是对象掩码列表。具有相同预测类别的像素共享相同的类别 ID,即使它们
属于不同对象。
| 属性 | 类型 | 形状 | 描述 |
|---|---|---|---|
result.semantic_mask | SemanticMask | (H,W) | 密集类别映射。 |
result.semantic_mask.data | torch.uint8torch.int16torch.int32 | (H,W) | 类别 ID;dtype 由类别数量决定。 |
result.masks | - | - | 没有实例掩码。 |
result.boxes | - | - | 没有实例框/置信度。 |
result.masks.xy | - | - | 默认不生成多边形。 |
有关每项任务中任务专用的 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、... |
| Dtype | torch.uint8 | torch.uint8torch.int16torch.int32 |
| 同类对象 | 保留为独立实例 | 合并到同一类别区域 |
| 多边形 | 是,通过 result.masks.xy 和 result.masks.xyn | 默认不输出多边形 |
| 边界框和置信度 | 是,通过 result.boxes | 没有实例级边界框或置信度分数 |
| 典型用途 | 计数、跟踪、裁剪、对象级测量 | 密集场景标注、可行驶区域、土地覆盖、医学区域 |
导出#
将 YOLO26n-sem 模型导出为其他格式,例如 ONNX、CoreML 等。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-sem.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Export the model
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 |
| TF SavedModel | saved_model | yolo26n-sem_saved_model/ | ✅ | imgsz、keras、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 |
| 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 |
| LiteRT | litert | yolo26n-sem.tflite | ✅ | imgsz、quantize、batch、data、fraction、device |
| Hailo | hailo | yolo26n-sem_hailo_model/ | ✅ | imgsz、name、quantize、data、fraction、simplify、conf、iou |
| Huawei Ascend | ascend | yolo26n-sem_ascend_model/ | ✅ | imgsz、batch、name、quantize、opset、simplify、nms |
| Apple Core AI | coreai | yolo26n-sem.aimodel | ✅ | imgsz、batch、quantize |
nms=None 默认对外部 NMS 使用原始输出。设置 nms=False 以选择可用的无 NMS 检测头;不支持的格式将回退到其本机输出路径。上面的 nms 条目标识了可以通过 nms=True 嵌入 NMS 的格式。
请在导出页面查看完整的 export 详情。
常见问题#
要在自定义数据集上训练 YOLO26 语义分割模型,你需要准备 PNG 掩码图像,其中每个像素值表示一个类别 ID(0、1、2、...),值为 255 的像素在训练期间会被忽略。创建一个指向图像和掩码目录的数据集 YAML 文件,然后训练模型:
示例from ultralytics import YOLO # Load a pretrained YOLO26 semantic segmentation model model = YOLO("yolo26n-sem.pt") # Train the model results = model.train(data="path/to/your_dataset.yaml", epochs=100, imgsz=512)请查看配置页面,了解更多可用参数。
可以。如果你的数据集使用 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 # Load a pretrained model model = YOLO("yolo26n-sem.pt") # Validate the model 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 # Load a pretrained model model = YOLO("yolo26n-sem.pt") # Export the model to ONNX format model.export(format="onnx")有关导出为各种格式的更多详情,请参阅导出页面。