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