YOLOv5作为一种先进的目标检测算法,能够快速准确地识别图像中的多个目标。而DeepSORT(Simple Online and Realtime Tracking)是一种基于卡尔曼滤波和匈牙利算法的多目标跟踪算法,可以很好地解决目标在视频序列中的轨迹关联问题。将YOLOv5与DeepSORT结合使用,可以在实时视频流中实现高效的目标检测与跟踪。
下面我们将详细介绍如何通过YOLOv5结合DeepSORT来实现多目标跟踪,并提供代码示例和操作步骤。
YOLOv5是YOLO系列目标检测算法的一个版本,具有以下特点:
YOLOv5的核心思想是将目标检测问题转化为回归问题,直接从输入图像预测边界框的位置和类别。
DeepSORT是一种多目标跟踪算法,其主要步骤包括:
DeepSORT能够处理遮挡、重叠等问题,适合复杂场景下的目标跟踪。
将YOLOv5用于目标检测,获取每帧图像中的目标边界框和类别信息;然后将这些信息传递给DeepSORT,完成目标跟踪。具体流程如下:
graph TD; A[加载YOLOv5模型] --> B[读取视频帧]; B --> C[YOLOv5目标检测]; C --> D[提取边界框和置信度]; D --> E[传递给DeepSORT]; E --> F[DeepSORT目标跟踪]; F --> G[绘制带ID的跟踪结果]; G --> H[保存或显示结果];
首先需要安装YOLOv5和DeepSORT的相关依赖:
pip install torch torchvision opencv-python-headless numpy filterpy scipy
克隆YOLOv5和DeepSORT的仓库:
git clone https://github.com/ultralytics/yolov5.git
git clone https://github.com/nwojke/deep_sort.git
加载预训练的YOLOv5模型:
import torch
from yolov5.models.experimental import attempt_load
# 加载YOLOv5模型
weights = 'yolov5s.pt' # 或者使用自己的权重文件
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = attempt_load(weights, map_location=device)
model.eval()
初始化DeepSORT所需的组件:
from deep_sort.deep_sort import DeepSort
# 初始化DeepSORT
deepsort = DeepSort(
max_dist=0.2, # 特征空间的最大距离
max_iou_distance=0.7, # IOU阈值
max_age=30, # 轨迹的最大丢失帧数
n_init=3, # 轨迹确认所需的最少检测次数
nn_budget=100 # 外观特征缓存大小
)
读取视频并进行目标检测与跟踪:
import cv2
import numpy as np
# 打开视频文件
video_path = 'input_video.mp4'
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 使用YOLOv5进行目标检测
results = model(frame, size=640) # 检测尺寸为640
detections = results.xyxy[0].cpu().numpy()
# 格式化YOLOv5的输出以适应DeepSORT
outputs = []
for detection in detections:
bbox = detection[:4] # 边界框 [x1, y1, x2, y2]
conf = detection[4] # 置信度
cls = int(detection[5]) # 类别
if cls == 0: # 假设只跟踪人(类别0)
outputs.append(np.hstack((bbox, [conf])))
if len(outputs) > 0:
outputs = np.array(outputs)
# 使用DeepSORT进行跟踪
tracks = deepsort.update(outputs, frame)
# 绘制跟踪结果
for track in tracks:
bbox = track.to_tlbr() # 获取边界框
track_id = track.track_id # 获取轨迹ID
cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])),
(int(bbox[2]), int(bbox[3])), (0, 255, 0), 2)
cv2.putText(frame, f"ID-{track_id}", (int(bbox[0]), int(bbox[1])),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 显示结果
cv2.imshow('Tracking', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
通过将YOLOv5与DeepSORT结合,我们可以实现实时多目标跟踪。YOLOv5负责高效的目标检测,而DeepSORT则解决了目标轨迹关联的问题。此方法适用于监控视频分析、自动驾驶等应用场景。