Skip to content

使用Ultralytics YOLO11进行实例分割和跟踪 🚀

什么是实例分割

Ultralytics YOLO11 实例分割涉及识别和勾勒图像中的单个物体,提供对空间分布的详细理解。与语义分割不同,它为每个物体提供唯一的标签和精确的轮廓,这对于物体检测和医学成像等任务至关重要。

Ultralytics包中提供了两种类型的实例分割跟踪:

  • 按类别对象的实例分割: 每个类别对象被分配一个独特的颜色,以便清晰地视觉分离。

  • 带对象轨迹的实例分割: 每个轨迹由不同的颜色表示,便于识别和跟踪。



观看: 使用Ultralytics YOLO11进行实例分割和对象跟踪

示例

实例分割 实例分割 + 对象跟踪
Ultralytics实例分割 Ultralytics实例分割与对象跟踪
Ultralytics实例分割 😍 Ultralytics实例分割与对象跟踪 🔥

实例分割和跟踪

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolo11n-seg.pt")  # 分割模型
names = model.model.names
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        print("视频帧为空或视频处理已成功完成。")
        break

    results = model.predict(im0)
    annotator = Annotator(im0, line_width=2)

    if results[0].masks is not None:
        clss = results[0].boxes.cls.cpu().tolist()
        masks = results[0].masks.xy
        for mask, cls in zip(masks, clss):
            color = colors(int(cls), True)
            txt_color = annotator.get_txt_color(color)
            annotator.seg_bbox(mask=mask, mask_color=color, label=names[int(cls)], txt_color=txt_color)

    out.write(im0)
    cv2.imshow("instance-segmentation", im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

```python from collections import defaultdict

import cv2

from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors

track_history = defaultdict(lambda: [])

model = YOLO("yolo11n-seg.pt") # 分割模型 cap = cv2.VideoCapture("path/to/video/file.mp4")

``` w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

    out = cv2.VideoWriter("instance-segmentation-object-tracking.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

    while True:
        ret, im0 = cap.read()
        if not ret:
            print("视频帧为空或视频处理已成功完成。")
            break

        annotator = Annotator(im0, line_width=2)

        results = model.track(im0, persist=True)

        if results[0].boxes.id is not None and results[0].masks is not None:
            masks = results[0].masks.xy
            track_ids = results[0].boxes.id.int().cpu().tolist()

            for mask, track_id in zip(masks, track_ids):
                color = colors(int(track_id), True)
                txt_color = annotator.get_txt_color(color)
                annotator.seg_bbox(mask=mask, mask_color=color, label=str(track_id), txt_color=txt_color)

        out.write(im0)
        cv2.imshow("instance-segmentation-object-tracking", im0)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break

    out.release()
    cap.release()
    cv2.destroyAllWindows()
    ```

seg_bbox 参数

名称 类型 默认值 描述
mask array None 分割掩码坐标
mask_color RGB (255, 0, 255) 每个分割框的掩码颜色
label str None 分割对象的标签
txt_color RGB None 分割和跟踪对象的标签颜色

注意

如有任何疑问,请随时在 Ultralytics Issue 部分 或下方讨论部分发布您的问题。

常见问题

如何使用 Ultralytics YOLO11 进行实例分割?

要使用 Ultralytics YOLO11 进行实例分割,请使用 YOLO11 的分割版本初始化 YOLO 模型,并通过它处理视频帧。以下是一个简化的代码示例:

示例

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

model = YOLO("yolo11n-seg.pt")  # 分割模型
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    results = model.predict(im0)
    annotator = Annotator(im0, line_width=2)

    if results[0].masks is not None:
        clss = results[0].boxes.cls.cpu().tolist()
        masks = results[0].masks.xy
        for mask, cls in zip(masks, clss):
            annotator.seg_bbox(mask=mask, mask_color=colors(int(cls), True), det_label=model.model.names[int(cls)])

    out.write(im0)
    cv2.imshow("instance-segmentation", im0)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

了解更多关于实例分割的信息,请参阅 Ultralytics YOLO11 指南

Ultralytics YOLO11 中的实例分割和对象跟踪有什么区别?

实例分割识别并勾勒图像中的单个对象,为每个对象分配唯一的标签和掩码。对象跟踪在此基础上为视频帧中的对象分配一致的标签,便于对同一对象进行持续跟踪。了解更多区别,请参阅 Ultralytics YOLO11 文档

为什么我应该使用 Ultralytics YOLO11 进行实例分割和跟踪,而不是像 Mask R-CNN 或 Faster R-CNN 这样的模型?

与 Mask R-CNN 或 Faster R-CNN 等其他模型相比,Ultralytics YOLO11 提供实时性能、卓越的 准确性 和易用性。YOLO11 与 Ultralytics HUB 无缝集成,使用户能够高效管理模型、数据集和训练管道。了解更多 YOLO11 的优势,请参阅 Ultralytics 博客

如何使用 Ultralytics YOLO11 实现对象跟踪?

要实现对象跟踪,请使用 model.track 方法,并确保每个对象的 ID 在各帧之间保持一致。以下是一个简单的示例:

Example

from collections import defaultdict

import cv2

from ultralytics import YOLO
from ultralytics.utils.plotting import Annotator, colors

track_history = defaultdict(lambda: [])

model = YOLO("yolo11n-seg.pt")  # 分割模型
cap = cv2.VideoCapture("path/to/video/file.mp4")
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))

out = cv2.VideoWriter("instance-segmentation-object-tracking.avi", cv2.VideoWriter_fourcc(*"MJPG"), fps, (w, h))

while True:
    ret, im0 = cap.read()
    if not ret:
        break

    annotator = Annotator(im0, line_width=2)
    results = model.track(im0, persist=True)

    if results[0].boxes.id is not None and results[0].masks is not None:
        masks = results[0].masks.xy
        track_ids = results[0].boxes.id.int().cpu().tolist()

        for mask, track_id in zip(masks, track_ids):
            annotator.seg_bbox(mask=mask, mask_color=colors(track_id, True), track_label=str(track_id))

    out.write(im0)
    cv2.imshow("instance-segmentation-object-tracking", im0)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

out.release()
cap.release()
cv2.destroyAllWindows()

更多内容请参见实例分割与跟踪部分

Ultralytics 是否提供适合用于训练 YOLO11 模型进行实例分割和跟踪的数据集?

是的,Ultralytics 提供了多个适合训练 YOLO11 模型的数据集,包括分割和跟踪数据集。数据集示例、结构和使用说明可以在 Ultralytics 数据集文档 中找到。


📅 Created 10 months ago ✏️ Updated 13 days ago

Comments