计算机视觉——基于YOLOv8 BotSort 与 ByteTrack实现目标追踪的对比

概述

计算机视觉领域正在迅速发展,不仅影响现实世界中的挑战,还推动了人工智能其他领域(如自然语言处理)的进步。随着计算机视觉中不断涌现的新概念,当解决现实问题时,持续的目标跟踪几乎变得至关重要。


Ultralytics YOLOv8 目标跟踪器(BotSort 与 ByteTrack)对比

目标跟踪是计算机视觉的一个基本方面,涉及在视频序列中持续识别和监控目标。它确保即使在外观和条件发生变化的情况下,也能持续跟踪目标的轨迹。各种算法,包括卡尔曼滤波器和深度学习方法,都被用于提高准确性。

一. ByteTrack 和 BotSort 与 Ultralytics YOLOv8 的使用

流行的目标跟踪算法包括 ByteTrack 和 BotSort,而 DeepSORT 在各种场景中表现出色。Ultralytics YOLOv8 提供了全面的目标跟踪功能,包括目标检测、目标分割和姿态估计等任务,所有这些都可以通过几行代码实现。

注意:请使用以下命令安装 Ultralytics 包。

pip install ultralytics

1.1 BotSort

你可以使用以下代码将 BotSort 与 YOLOv8 结合使用。通过命令行界面中的单行命令,可以轻松执行带有 BotSort 的目标跟踪。

yolo track model="path/to/best.pt" source="path/to/video.mp4"

为了绘制每个目标的跟踪线,可以使用以下代码。

import cv2
import numpy as np
from pathlib import Path
from ultralytics import YOLO
from collections import defaultdict
from ultralytics.utils.plotting import Annotator

track_history = defaultdict(lambda: [])

model = YOLO("yolov8n.pt")
names = model.model.names
video_path = "path/to/video.mp4"
if not Path(video_path).exists():
    raise FileNotFoundError(f"Source path "                            
                            f"'{video_path}' "                            
                            f"does not exist.")

cap = cv2.VideoCapture(video_path)
while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)

        boxes = results[0].boxes.xywh.cpu()
        clss = results[0].boxes.cls.cpu().tolist()
        track_ids = results[0].boxes.id.int().cpu().tolist()

        annotator = Annotator(frame, line_width=2,
                              example=str(names))
        for box, track_id, cls in zip(boxes, track_ids, clss):
            x, y, w, h = box
            x1, y1, x2, y2 = (x - w / 2, y - h / 2,
                              x + w / 2, y + h / 2)
            label = str(names[cls]) + " : " + str(track_id)
            annotator.box_label([x1, y1, x2, y2],
                                label, (218, 100, 255))
            # 绘制跟踪线
            track = track_history[track_id]
            track.append((float(box[0]), float(box[1])))
            if len(track) > 30:
                track.pop(0)

            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(frame, [points], isClosed=False,
                          color=(37, 255, 225), thickness=2)
            # 绘制中心圆
            cv2.circle(frame,
                       (int(track[-1][0]), int(track[-1][1])),
                       5, (235, 219, 11), -1)

        cv2.imshow("YOLOv8 Detection", frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break    
    else:
        break
cap.release()
cv2.destroyAllWindows()

结果如下所示:


使用 Ultralytics YOLOv8 的 BotSort 进行目标跟踪

1.2 ByteTrack

你可以使用以下代码将 ByteTrack 与 YOLOv8 结合使用。

yolo track model=path/to/best.pt tracker="bytetrack.yaml" source=0

为了绘制每个目标的跟踪线,可以使用以下代码。

import cv2
import numpy as np
from pathlib import Path
from ultralytics import YOLO
from collections import defaultdict
from ultralytics.utils.plotting import Annotator

track_history = defaultdict(lambda: [])

model = YOLO("yolov8n.pt")
model.to("cpu")
names = model.model.names
video_path = "G:vidpose.mp4"
if not Path(video_path).exists():
    raise FileNotFoundError(f"Source path "                            
                            f"'{video_path}' "                            
                            f"does not exist.")

cap = cv2.VideoCapture(video_path)
while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True,
                              tracker="bytetrack.yaml")

        boxes = results[0].boxes.xywh.cpu()
        clss = results[0].boxes.cls.cpu().tolist()
        track_ids = results[0].boxes.id.int().cpu().tolist()

        annotator = Annotator(frame, line_width=2,
                              example=str(names))
        for box, track_id, cls in zip(boxes, track_ids, clss):
            x, y, w, h = box
            x1, y1, x2, y2 = (x - w / 2, y - h / 2,
                              x + w / 2, y + h / 2)
            label = str(names[cls]) + " : " + str(track_id)
            annotator.box_label([x1, y1, x2, y2],
                                label, (218, 100, 255))
            # 绘制跟踪线
            track = track_history[track_id]
            track.append((float(box[0]), float(box[1])))
            if len(track) > 30:
                track.pop(0)

            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(frame, [points], isClosed=False,
                          color=(37, 255, 225), thickness=2)
            # 绘制中心圆
            cv2.circle(frame,
                       (int(track[-1][0]), int(track[-1][1])),
                       5, (235, 219, 11), -1)

        cv2.imshow("YOLOv8 Detection", frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break    
    else:
        break
cap.release()
cv2.destroyAllWindows()

结果如下所示:


使用 Ultralytics YOLOv8 的 ByteTrack 进行目标跟踪

二. BotSort 与 ByteTrack 的对比

BotSort 和 ByteTrack 都是强大的目标跟踪算法,它们各自独特的特点使它们脱颖而出。在我们的全面对比中,我们将深入探讨两个关键指标,即速度(以每秒帧数或 FPS 衡量)和准确性,揭示它们各自的长处和性能特点。此分析旨在提供对每个算法在实时跟踪关键方面表现出色的深入理解。

2.1 速度(FPS)

在速度方面,ByteTrack 优于 BotSort。这使得 ByteTrack 能够近乎实时地运行推理。这一特性对于需要快速且响应迅速的目标跟踪的应用场景至关重要。

图 1.4:Ultralytics YOLOv8 的 BotSort 与 ByteTrack 速度(FPS)对比

2.2 准确性

尽管在各种场景中表现出色,但与 ByteTrack 相比,BotSort 在涉及 REID(再识别)和新跟踪器关联的场景中表现出更高的有效性。

在提供的图像中,突出显示的区域清晰地展示了 BotSort 与 ByteTrack 相比实现的更强关联。


Ultralytics YOLOv8 的 BotSort 与 ByteTrack 准确性对比**

三.结论

ByteTrack 和 BotSort 都是有效的目标跟踪算法。在决定采用之前,建议针对特定用例测试每种算法。

  • 如果你优先考虑速度且对准确性的影响最小,则可以选择 ByteTrack。
  • 如果你优先考虑准确性且对速度略有折衷,则可以选择 BotSort。
  • 对于再识别目的,BotSort 优于 ByteTrack。
### botsortbytetrack 的比较及其应用 #### 1. 基本原理差异 BotSort 是一种多目标跟踪算法,它通过融合 DeepSORT 中的外观特征和 ByteTrack 中的高召回率检测来提高性能。相比之下,ByteTrack 更侧重于解决遮挡问题以及长时间丢失后的重新识别问题[^1]。 ```python # BotSort伪代码片段展示其如何结合DeepSORT特性 def bot_sort(frame, detections): features = extract_features(detections) # 提取外观特征 tracks = update_tracks(features, frame) return tracks ``` ByteTrack 则采用了一种基于运动模型的方法,在处理复杂场景下的目标追踪方面表现出色。该方法利用卡尔曼滤波器预测轨迹,并通过匈牙利算法匹配新帧中的检测结果现有轨迹[^2]。 ```python # ByteTrack伪代码片段强调其对遮挡情况的处理能力 def byte_track(frame, detections): predictions = predict_trajectories(tracks) matches = hungarian_algorithm(predictions, detections) update_tracks(matches, frame) return tracks ``` #### 2. 应用场景对比 对于低密度环境下的实时监控任务,如交通流量监测或零售店顾客行为分析,两种算法都能提供良好的服务。然而,在行人密集区或多视角视频流环境中,ByteTrack 凭借更强大的抗干扰能力和更高的准确性成为首选方案[^3]。 当涉及到需要精确身份验证的应用场合时——比如安全检查站的人脸识别系统——BotSort 因为其对外观特征的有效利用而显得更加合适。这种情况下,即使存在一定程度上的遮挡现象,也能依靠个体的独特视觉属性完成稳定的身份确认过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值