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()
运行方式
- 将待处理视频命名为
input_video.mp4并放在脚本同目录下; - 执行命令:
python yolo_deepsort_tracker.py; - 首次运行会自动下载
yolov8n.pt权重(约6MB)。
验证方法与通过标准
- 运行无报错:脚本正常结束并打印“处理完成”提示;
- 输出文件存在:同目录下生成
output_video.mp4,时长与输入视频一致; - 跟踪效果正确:打开输出视频,同一目标在整个视频片段中ID保持不变;不同目标(如两辆交错的车)ID不混淆;检测框稳定贴合目标,无频繁丢失或跳变。
常见问题
- 检测类别调整:
classes=[0, 2]表示只检测人(COCO类别0)和车(类别2),如需其他类别可修改列表; - 跟踪ID跳变:若目标被长时间遮挡后ID改变,可增大
max_age(如设为60)提升记忆时长; - 处理速度慢:可改用
yolov8s.pt或降低输入分辨率,也可将conf阈值调高至0.5减少候选框。