在处理视频流中的目标追踪时,我们通常会使用目标检测来识别视频帧中的目标,然后使用跟踪算法来追踪它们在连续帧中的运动。

视频分析领域的物体追踪不仅能标识出帧内物体的位置和类别,还能在视频进行过程中为每个检测到的物体保持一个唯一的ID。

下面是Ultralytics YOLO 物体追踪的一些应用领域:

a. 实时视频分析与安防监控: Ultralytics YOLO 可以在监控摄像头捕获的实时视频中快速检测多个对象,例如人、车辆等。结合跟踪器,可以实现目标的持续追踪,用于安防监控或视频分析系统。

b. 自动驾驶和交通监测: Ultralytics YOLO 在交通场景中可以用于检测汽车、行人、自行车等交通参与者。通过目标追踪,可以对交通流量进行实时监测,支持自动驾驶系统或交通管理。

c. 工业生产与品质控制: 在工厂和生产线中,Ultralytics YOLO 可以检测和追踪产品的移动和位置,用于生产自动化和质量控制。

d. 智能辅助系统: 在辅助医疗、辅助驾驶、机器人导航等领域,Ultralytics YOLO 可以帮助识别和追踪关键对象,提供智能的辅助功能。

e. 体育赛事分析: Ultralytics YOLO 可以用于体育赛事中的目标追踪,例如足球比赛中追踪球员的位置,以及其他球类运动中的追踪应用。

Ultralytics YOLO扩展了其物体检测功能,提供强大且多功能的物体追踪:

实时追踪:在高帧率视频中无缝追踪物体。

支持多个追踪器:可从多种成熟的追踪算法中选择合适的追踪器。

自定义追踪器配置:通过调整各种参数来定制追踪算法,以满足特定需求。

Ultralytics YOLO可用的追踪器:

Ultralytics YOLO支持以下追踪算法。可以通过传递相关的YAML配置文件如tracker=tracker_type.yaml来启用,Ultralytics YOLO 默认追踪器是BoT-SORT:

A. BoT-SORT - 使用 botsort.yaml 启用此追踪器。

B. ByteTrack - 使用 bytetrack.yaml 启用此追踪器。

Ultralytics YOLO 如何对视频中的目标进行追踪:

1. 要在视频流中运行追踪器,请使用已训练的检测、分割或姿态模型,例如YOLOv8n、YOLOv8n-seg和YOLOv8n-pose。


from ultralytics import YOLO

# 加载官方或自定义模型
model = YOLO('yolov8n.pt')  # 加载一个官方的检测模型
model = YOLO('yolov8n-seg.pt')  # 加载一个官方的分割模型
model = YOLO('yolov8n-pose.pt')  # 加载一个官方的姿态模型
model = YOLO('path/to/best.pt')  # 加载一个自定义训练的模型

# 使用模型进行追踪
# source 为视频、视频流地址
results = model.track(source="", show=True)  # 使用默认追踪器进行追踪
results = model.track(source="", show=True, tracker="bytetrack.yaml")  # 使用ByteTrack追踪器进行追踪

如上所述,Detect、Segment和Pose模型在视频或流媒体源上运行时均可进行追踪。

2. 追踪参数配置

追踪配置与预测模式共享一些属性,如conf、iou和show。有关进一步配置,请参见预测、推理模型里面的配置。


from ultralytics import YOLO

# 配置追踪参数并运行追踪器
model = YOLO('yolov8n.pt')
results = model.track(source="", conf=0.3, iou=0.5, show=True)

3. 选择追踪器​​​​​​​


from ultralytics import YOLO

# 加载模型并使用自定义配置文件运行追踪器
# yaml 文件可在官网进行下载
model = YOLO('yolov8n.pt')
results = model.track(source="", tracker='custom_tracker.yaml')

Ultralytics还允许我们使用修改后的追踪器配置文件。要执行此操作,只需从ultralytics/cfg/trackers中复制一个追踪器配置文件(例如,custom_tracker.yaml)并根据我们的需求修改任何配置(除了tracker_type)。

使用Ultralytics YOLOv8进行多物体追踪示例:

下面我们使用OpenCV和YOLOv8在视频帧上运行物体追踪,此代码假设我们已经安装了必要的包(opencv-python和ultralytics)。参数persist=True告诉追踪器当前的图像或帧是序列中的下一个,并且期望在当前图像中从上一个图像中获得追踪路径。

import cv2
from ultralytics import YOLO

# 加载YOLOv8模型
model = YOLO('yolov8n.pt')

# 打开视频文件
video_path = "video.mp4"
cap = cv2.VideoCapture(video_path)

# 循环遍历视频帧
while cap.isOpened():
    # 从视频读取一帧
    success, frame = cap.read()

    if success:
        # 在帧上运行YOLOv8追踪,持续追踪帧间的物体
        results = model.track(frame, persist=True)

        # 在帧上展示结果
        annotated_frame = results[0].plot()

        # 展示带注释的帧
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # 如果按下'q'则退出循环
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # 如果视频结束则退出循环
        break

# 释放视频捕获对象并关闭显示窗口
cap.release()
cv2.destroyAllWindows()

请注意从model(frame)更改为model.track(frame)的变化,这使能够启用物体追踪而不只是简单的检测。这个修改的脚本将在视频的每一帧上运行追踪器,可视化结果,并在窗口中显示它们。通过按'q'可以退出循环。

使用Ultralytics YOLOv8随时间绘制追踪路径示例:

在连续帧上可视化物体追踪路径可以提供有关视频中检测到的物体的运动模式和行为的有价值的洞见。使用Ultralytics YOLOv8,绘制这些路径是一个无缝且高效的过程。

在以下示例中,我们演示了如何利用Ultralytics YOLOv8的追踪功能在多个视频帧上绘制检测物体的移动。代码涉及打开视频文件、逐帧读取,并使用Ultralytics YOLOv8模型识别并追踪各种物体。通过保留检测到的边界框的中心点并连接它们,我们可以绘制表示跟踪物体路径的线条。

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# 加载YOLOv8模型
model = YOLO('yolov8n.pt')

# 打开视频文件
video_path = "video.mp4"
cap = cv2.VideoCapture(video_path)

# 存储追踪历史
track_history = defaultdict(lambda: [])

# 循环遍历视频帧
while cap.isOpened():
    # 从视频读取一帧
    success, frame = cap.read()

    if success:
        # 在帧上运行YOLOv8追踪,持续追踪帧间的物体
        results = model.track(frame, persist=True)

        # 获取框和追踪ID
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()

        # 在帧上展示结果
        annotated_frame = results[0].plot()

        # 绘制追踪路径
        for box, track_id in zip(boxes, track_ids):
            x, y, w, h = box
            track = track_history[track_id]
            track.append((float(x), float(y)))  # x, y中心点
            if len(track) > 30:  # 在90帧中保留90个追踪点
                track.pop(0)

            # 绘制追踪线
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # 展示带注释的帧
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # 如果按下'q'则退出循环
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # 如果视频结束则退出循环
        break

# 释放视频捕获对象并关闭显示窗口
cap.release()
cv2.destroyAllWindows()

使用Ultralytics YOLOv8进行多线程追踪:

多线程追踪提供了同时在多个视频流上运行物体追踪的能力。当处理多个视频输入,例如来自多个监控摄像头时,这一功能特别有用,其中并发处理可以大大提高效率和性能。

在上面的代码中,我们可以利用Python的threading模块来同时运行多个追踪器实例。每个线程负责在一个视频文件上运行追踪器,所有线程在后台同时运行。

为了确保每个线程接收到正确的参数(视频文件、要使用的模型和文件索引),我们可以定义一个函数run_tracker_in_thread,它接受这些参数并包含主追踪循环。此函数逐帧读取视频,运行追踪器,并显示结果。

我们可以使用两个不同的模型:yolov8n.pt和yolov8n-seg.pt,每个模型都在不同的视频文件或视频流中中追踪物体。

在threading.Thread中参数daemon=True表示,这些线程会在主程序结束时关闭。然后我们用start()来开始线程,并使用join()来使主线程等待,直到两个追踪线程都结束。

最后,在所有线程完成任务后,使用cv2.destroyAllWindows()关闭显示结果的窗口。

以上就是本次分享的内容,感谢大家支持。您的关注、点赞、收藏是我创作的动力。

万水千山总是情,点个 👍 行不行。

GitHub 加速计划 / ul / ultralytics
27.24 K
5.39 K
下载
ultralytics - 提供 YOLOv8 模型,用于目标检测、图像分割、姿态估计和图像分类,适合机器学习和计算机视觉领域的开发者。
最近提交(Master分支:2 个月前 )
1b74f142 2 天前
3e48829c Co-authored-by: UltralyticsAssistant <web@ultralytics.com> Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com> 2 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐