YOLOv5结合DeepSORT实现多目标跟踪实战教程

2025-06发布2次浏览

YOLOv5作为一种先进的目标检测算法,能够快速准确地识别图像中的多个目标。而DeepSORT(Simple Online and Realtime Tracking)是一种基于卡尔曼滤波和匈牙利算法的多目标跟踪算法,可以很好地解决目标在视频序列中的轨迹关联问题。将YOLOv5与DeepSORT结合使用,可以在实时视频流中实现高效的目标检测与跟踪。

下面我们将详细介绍如何通过YOLOv5结合DeepSORT来实现多目标跟踪,并提供代码示例和操作步骤。


1. YOLOv5简介

YOLOv5是YOLO系列目标检测算法的一个版本,具有以下特点:

  • 高效:推理速度快,适用于实时应用。
  • 精准:能够在多种场景下实现高精度的目标检测。
  • 易用:开源且支持多种框架,易于集成到其他项目中。

YOLOv5的核心思想是将目标检测问题转化为回归问题,直接从输入图像预测边界框的位置和类别。


2. DeepSORT简介

DeepSORT是一种多目标跟踪算法,其主要步骤包括:

  1. 特征提取:为每个检测到的目标提取外观特征。
  2. 卡尔曼滤波:预测目标的下一帧位置。
  3. 匈牙利算法:将当前帧的目标与前一帧的目标进行匹配。
  4. 轨迹管理:维护每个目标的轨迹信息。

DeepSORT能够处理遮挡、重叠等问题,适合复杂场景下的目标跟踪。


3. 结合YOLOv5与DeepSORT的流程

3.1 流程概述

将YOLOv5用于目标检测,获取每帧图像中的目标边界框和类别信息;然后将这些信息传递给DeepSORT,完成目标跟踪。具体流程如下:

  1. 使用YOLOv5对视频的每一帧进行目标检测,输出边界框和置信度。
  2. 将检测结果传递给DeepSORT,利用卡尔曼滤波预测目标位置并更新轨迹。
  3. 输出带有ID编号的跟踪结果。

3.2 流程图

graph TD;
    A[加载YOLOv5模型] --> B[读取视频帧];
    B --> C[YOLOv5目标检测];
    C --> D[提取边界框和置信度];
    D --> E[传递给DeepSORT];
    E --> F[DeepSORT目标跟踪];
    F --> G[绘制带ID的跟踪结果];
    G --> H[保存或显示结果];

4. 实现步骤

4.1 安装依赖

首先需要安装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

4.2 加载YOLOv5模型

加载预训练的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()

4.3 初始化DeepSORT

初始化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  # 外观特征缓存大小
)

4.4 视频处理与目标跟踪

读取视频并进行目标检测与跟踪:

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()

5. 总结

通过将YOLOv5与DeepSORT结合,我们可以实现实时多目标跟踪。YOLOv5负责高效的目标检测,而DeepSORT则解决了目标轨迹关联的问题。此方法适用于监控视频分析、自动驾驶等应用场景。