前言
视频分析领域的对象跟踪是一项关键任务,它不仅可以识别帧内对象的位置和类别,还可以在视频进行过程中为每个检测到的对象维护一个唯一的 ID。YOLOv8/YOLOv11跟踪器的输出与标准对象检测一致,但具有对象 ID 的附加值。这使得跟踪视频流中的对象并执行后续分析变得容易。官网的解释是:
-
效率:实时处理视频流,而不会影响准确性。
-
灵活性:支持多种跟踪算法和配置。
-
易用性:用于快速集成和部署的简单 Python API 。
-
可定制性:易于与经过自定义训练的 YOLO 模型一起使用,允许集成到特定领域的应用程序中。
官网的实际应用展示,如下所示:
实际应用:
🎓一、YOLOv8原始版本代码下载
官网的源码下载地址 : YOLOv8/YOLOv11官网代码
官网打不开的话,从我的网盘下载就行,网盘下载地址: YOLOv8原始版本源码下载,提取码: rpe7
注意注意注意:如果在我之前的文章下载过 YOLOv8 源码,不用重新下载了,没有特殊说明都是用同一个版本的源码
环境配置参考教程链接:链接: 环境配置链接,如果已经配置好环境可以忽略此步骤
🎓二、多目标追踪并实现轨迹绘制代码
复制下面代码即可运行,运行效果如下:
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO(model="yolov8n.pt")
video_path = "car.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True)
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
annotated_frame = results[0].plot()
# Plot the tracks
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 center point
if len(track) > 20: # retain 30 tracks for 30 frames
track.pop(0)
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(0, 255, 0), thickness=2)
cv2.imshow("YOLO Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
cv2.destroyAllWindows()
代码需要修改的地方圈起来的部分,需要你去官网下载YOLOv8/YOLOv11模型,模型支持目标检测,实例分割等,video_path填你的视频文件路径
🎓三、多目标追踪整合到Web端
理解第二章代码即可在任意系统集成多目标追踪+踪轨迹绘制,如 PyQt5界面、Web界面等,作者实现效果如下:
YOLOv8/YOLOv11 原始推理代码使用 model.predict 方法如下:
model.predict(source=r'car.mp4',save=True,show=True)
多目标追踪推理使用 model.track 方法即可:
model.track(source=r'car.mp4', tracker="ultralytics/cfg/trackers/bytetrack.yaml", persist=True,show=True)
使用 ByteTrack 跟踪器进行目标跟踪,参数的解释:
- tracker_type:指定跟踪器的类型,这里使用的是 bytetrack,bytetrack 是一种高效的多目标跟踪器。可以选择的类型包括 botsort 和bytetrack。
- track_high_thresh: 第一轮关联的置信度阈值。检测框的置信度高于此值的目标会被用于初步关联跟踪。
- track_low_thresh: 第二轮关联的置信度阈值。用于关联那些未能通过第一轮关联的低置信度检测框。如果检测框的置信度介于 track_low_thresh 和 track_high_thresh 之间,它们会被视为低置信度检测并尝试在第二轮关联中使用。
- new_track_thresh: 用于初始化新跟踪目标的阈值。如果检测框在任何已有轨迹中都没有匹配,并且其置信度高于此值,则会创建一个新的跟踪目标。
- track_buffer: 用于计算移除跟踪目标的时间缓冲。跟踪器会在失去目标一段时间(由该缓冲时间定义)后将其移除,以减少短暂丢失目标时的跟踪中断。
- match_thresh: 用于匹配轨迹的阈值。轨迹之间的匹配度(如IoU或其他指标)必须超过此值才能视为匹配成功。
第二章代码是检测和在帧上显示对象的轨迹线,直接使用 track_history 来存储和绘制轨迹
总结
关注我,带你不挂科!!!