1. YOLOv8基础检测与DeepSORT跟踪框架搭建

任务目标

本案例将搭建一个基于YOLOv8检测与DeepSORT跟踪的基础框架,实现视频中多目标(人、车等)的实时检测与稳定跟踪,最终生成带跟踪ID的标注视频。核心流程为:读取视频帧 → YOLOv8目标检测 → DeepSORT特征提取与数据关联 → 绘制跟踪框与ID → 输出结果视频。

环境依赖

需要安装以下核心库(建议Python 3.9+,CUDA可选):

pip install ultralytics deep-sort-realtime opencv-python

说明:deep-sort-realtime 库封装了DeepSORT的级联匹配与轨迹管理逻辑,内部使用轻量级ReID模型提取外观特征,无需额外下载权重文件。

完整实现代码

以下代码为最小可运行实现,直接保存为 yolo_deepsort_tracker.py:

import cv2
import numpy as np
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort

def main():
    # 1. 初始化模型
    detector = YOLO('yolov8n.pt')  # 自动下载轻量级预训练权重
    tracker = DeepSort(max_age=30, nn_budget=100, max_cosine_distance=0.3)
    
    # 2. 打开视频(输入路径自行替换)
    cap = cv2.VideoCapture('input_video.mp4')
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    # 3. 输出视频写入器
    out = cv2.VideoWriter('output_video.mp4', 
                          cv2.VideoWriter_fourcc(*'mp4v'), 
                          fps, (width, height))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
            
        # 4. YOLOv8检测(仅保留person和car,可按需调整)
        results = detector(frame, classes=[0, 2], conf=0.4, verbose=False)[0]
        detections = []
        for box in results.boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
            conf = float(box.conf[0])
            cls = int(box.cls[0])
            # DeepSORT输入格式:[left, top, width, height, conf, class_id]
            detections.append(([x1, y1, x2 - x1, y2 - y1], conf, cls))
        
        # 5. DeepSORT跟踪更新
        tracks = tracker.update_tracks(detections, frame=frame)
        
        # 6. 绘制跟踪结果
        for track in tracks:
            if not track.is_confirmed():
                continue
            track_id = track.track_id
            ltrb = track.to_ltrb()  # [left, top, right, bottom]
            x1, y1, x2, y2 = map(int, ltrb)
            cls_name = detector.names[track.det_class] if track.det_class is not None else 'obj'
            
            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
            label = f'ID:{track_id} {cls_name}'
            cv2.putText(frame, label, (x1, y1 - 10), 
                       cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
        
        out.write(frame)
        # 可选:实时预览(去掉注释即可)
        # cv2.imshow('Tracking', frame)
        # if cv2.waitKey(1) & 0xFF == ord('q'):
        #     break
    
    cap.release()
    out.release()
    cv2.destroyAllWindows()
    print('处理完成,结果已保存至 output_video.mp4')

if __name__ == '__main__':
    main()

运行方式

  1. 将待处理视频命名为 input_video.mp4 并放在脚本同目录下;
  2. 执行命令:python yolo_deepsort_tracker.py;
  3. 首次运行会自动下载 yolov8n.pt 权重(约6MB)。

验证方法与通过标准

  • 运行无报错:脚本正常结束并打印“处理完成”提示;
  • 输出文件存在:同目录下生成 output_video.mp4,时长与输入视频一致;
  • 跟踪效果正确:打开输出视频,同一目标在整个视频片段中ID保持不变;不同目标(如两辆交错的车)ID不混淆;检测框稳定贴合目标,无频繁丢失或跳变。

常见问题

  • 检测类别调整:classes=[0, 2] 表示只检测人(COCO类别0)和车(类别2),如需其他类别可修改列表;
  • 跟踪ID跳变:若目标被长时间遮挡后ID改变,可增大 max_age(如设为60)提升记忆时长;
  • 处理速度慢:可改用 yolov8s.pt 或降低输入分辨率,也可将 conf 阈值调高至0.5减少候选框。
YOLOv8 + DeepSORT 多目标跟踪流程 视频帧输入 input_video.mp4 YOLOv8 检测器 目标边界框 类别 + 置信度 yolov8n.pt 检测结果 [x, y, w, h] conf, class_id 格式转换 DeepSORT 级联匹配 轨迹管理 ReID特征提取 跟踪结果 track_id + 边界框 类别标签 绘制标注框 ID + 类别 + 彩色框 输出视频 output_video.mp4 逐帧循环处理 核心:检测提供每帧目标位置 → DeepSORT通过运动+外观特征进行帧间关联 → 分配稳定ID max_age=30 控制轨迹丢失后的保留帧数,nn_budget=100 控制外观特征库容量