实例分割概述
实例分割是计算机视觉任务的一种,它超越了简单的物体检测,能够识别图像中的单个物体并将其从图像的其余部分分割出来。这种高级别的分割技术不仅能定位物体的位置,还能精确描绘出每个物体的实际形状。
实例分割模型的输出
实例分割模型的输出是一组掩码(mask)或轮廓线,这些掩码或轮廓线勾勒出了图像中每个物体的确切边界,并且每个物体都附带类别标签和置信度分数。当需要了解图像中物体不仅"在哪里",而且"具体是什么形状"时,实例分割就显得尤为重要。
示例:使用预训练的 Ultralytics YOLOv8 模型进行分割
观看:使用预训练的 Ultralytics YOLOv8 模型进行分割
YOLOv8 的实例分割模型使用 -seg
后缀,例如 yolov8n-seg.pt
,这些模型是在 COCO 数据集上预训练的。
模型
YOLOv8 预训练的实例分割模型如下所示。检测、分割和姿态估计模型在 COCO 数据集上进行了预训练,而分类模型则在 ImageNet 数据集上进行了预训练。模型会在首次使用时自动从 Ultralytics 的最新发布中下载。
模型 | 大小(像素) | mAPbox(50-95) | mAPmask(50-95) | 速度(CPU ONNX,毫秒) | 速度(A100 TensorRT,毫秒) | 参数(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 |
其中,mAPval 值是在 COCO val2017 数据集上的单模型单尺度评估结果。
训练模型
要使用 YOLOv8n-seg 在 COCO128-seg 数据集上进行训练,可以设置图像大小为 640 像素,训练周期为 100 轮。
示例
Python
python
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n-seg.yaml") # 从 YAML 文件构建新模型
model = YOLO("yolov8n-seg.pt") # 加载预训练模型(推荐用于训练)
model = YOLO("yolov8n-seg.yaml").load("yolov8n.pt") # 从 YAML 文件构建模型并转移权重
# 训练模型
results = model.train(data="coco8-seg.yaml", epochs=100, imgsz=640)
命令行接口 (CLI)
shell
python path/to/train.py --data coco8-seg.yaml --epochs 100 --imgsz 640
数据集格式
YOLO 分割数据集的具体格式可以在数据集指南中找到。要将现有数据集(如 COCO 等格式)转换为 YOLO 格式,请使用 Ultralytics 提供的 JSON2YOLO 工具。
验证模型
验证训练好的 YOLOv8n-seg 模型在 COCO128-seg 数据集上的准确性。无需传递任何参数,因为模型会保留其训练数据和参数作为属性。
示例
Python
python
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n-seg.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义模型
# 验证模型
metrics = model.val() # 不需要参数,数据集和设置会被记住
# 获取指标
metrics.box.map # mAP(50-95) 对于边界框
metrics.box.map50 # mAP50 对于边界框
metrics.box.map75 # mAP75 对于边界框
metrics.box.maps # 每个类别的 mAP(50-95) 列表
metrics.seg.map # mAP(50-95) 对于分割
metrics.seg.map50 # mAP50 对于分割
metrics.seg.map75 # mAP75 对于分割
metrics.seg.maps # 每个类别的 mAP(50-95) 列表
命令行接口 (CLI)
shell
python path/to/val.py
运行预测
使用训练好的 YOLOv8n-seg 模型对图像进行预测。
示例
Python
python
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n-seg.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义模型
# 使用模型进行预测
results = model("https://ultralytics.com/images/bus.jpg") # 对图像进行预测
命令行接口 (CLI)
shell
python path/to/predict.py --source https://ultralytics.com/images/bus.jpg
导出模型
可以将 YOLOv8n-seg 模型导出为不同的格式,例如 ONNX、CoreML 等。
示例
Python
python
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n-seg.pt") # 加载官方模型
model = YOLO("path/to/best.pt") # 加载自定义训练模型
# 导出模型
model.export(format="onnx")
命令行接口 (CLI)
shell
python path/to/export.py --weights yolov8n-seg.pt --format onnx
可用的 YOLOv8-seg 导出格式
下表列出了可用的 YOLOv8-seg 导出格式。你可以使用 format
参数导出到任何格式,例如 format='onnx'
或 format='engine'
。完成导出后,你可以直接在导出的模型上进行预测或验证,例如 yolo predict model=yolov8n-seg.onnx
。
格式 | format 参数 | 模型 | 元数据 | 参数 |
---|---|---|---|---|
PyTorch | - | yolov8n-seg.pt | √ | - |
TorchScript | torchscript | yolov8n-seg.torchscript | √ | imgsz, optimize, batch |
ONNX | onnx | yolov8n-seg.onnx | √ | imgsz, half, dynamic, simplify, opset, batch |
OpenVINO | openvino | yolov8n-seg_openvino_model/ | √ | imgsz, half, int8, batch |
TensorRT | engine | yolov8n-seg.engine | √ | imgsz, half, dynamic, simplify, workspace, int8, batch |
CoreML | coreml | yolov8n-seg.mlpackage | √ | imgsz, half, int8, nms, batch |
TF SavedModel | saved_model | yolov8n-seg_saved_model/ | √ | imgsz, keras, int8, batch |
TF GraphDef | pb | yolov8n-seg.pb | × | imgsz, batch |
TF Lite | tflite | yolov8n-seg.tflite | √ | imgsz, half, int8, batch |
TF Edge TPU | edgetpu | yolov8n-seg_edgetpu.tflite | √ | imgsz |
TF.js | tfjs | yolov8n-seg_web_model/ | √ | imgsz, half, int8, batch |
PaddlePaddle | paddle | yolov8n-seg_paddle_model/ | √ | imgsz, batch |
NCNN | ncnn | yolov8n-seg_ncnn_model/ | √ | imgsz, half, batch |
常见问题解答
如何在自定义数据集上训练 YOLOv8 分割模型?
要在自定义数据集上训练 YOLOv8 分割模型,首先需要准备数据集以符合 YOLO 分割格式的要求。可以使用 JSON2YOLO 工具来转换来自其他格式的数据集。一旦数据集准备好,就可以使用 Python 或者命令行接口进行训练。
示例
Python
python
from ultralytics import YOLO
# 加载预训练的 YOLOv8 分割模型
model = YOLO("yolov8n-seg.pt")
# 训练模型
results = model.train(data="path/to/your_dataset.yaml", epochs=100, imgsz=640)
命令行接口 (CLI)
shell
python path/to/train.py --data path/to/your_dataset.yaml --epochs 100 --imgsz 640
更多可用的参数选项,请参阅配置页面。
物体检测与实例分割的区别是什么?
物体检测的任务是在图像中识别并定位物体,通过绘制边界框来标记它们的位置;而实例分割则不仅要确定边界框,还要精确描绘每个物体的确切形状。YOLOv8 的实例分割模型提供了勾勒每个检测到物体的掩码或轮廓,这对于需要知道物体精确形状的任务来说非常重要,例如医学成像或自动驾驶等。
为什么选择 YOLOv8 进行实例分割?
Ultralytics YOLOv8 是一种最先进的模型,以其高准确性和实时性能而闻名,这使得它非常适合实例分割任务。YOLOv8 的分割模型在 COCO 数据集上进行了预训练,确保了模型对于多种物体的强大性能。此外,YOLOv8 支持训练、验证、预测以及导出功能,易于集成,因此非常适合研究和工业应用。
如何加载并验证预训练的 YOLOv8 分割模型?
加载并验证预训练的 YOLOv8 分割模型非常简单,下面是如何使用 Python 和命令行接口进行操作的示例。
示例
Python
python
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n-seg.pt")
# 验证模型
metrics = model.val()
# 打印指标
print("边界框的平均精度(mAP):", metrics.box.map)
print("掩码的平均精度(mAP):", metrics.seg.map)
命令行接口 (CLI)
shell
python path/to/val.py
这些步骤将为你提供诸如平均精度(mAP)等验证指标,这些指标对于评估模型性能至关重要。
如何将 YOLOv8 分割模型导出为 ONNX 格式?
将 YOLOv8 分割模型导出为 ONNX 格式很容易,可以通过 Python 或者命令行接口完成。
示例
Python
python
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n-seg.pt")
# 将模型导出为 ONNX 格式
model.export(format="onnx")
命令行接口 (CLI)
shell
python path/to/export.py --weights yolov8n-seg.pt --format onnx
有关导出到各种格式的更多细节,请参阅导出页面。