介绍
车流统计是智能交通分析的基础,流量、流速、行驶轨迹都建立在"每辆车被持续稳定跟住"之上,这一步就是多目标跟踪(MOT),业界通用方案是"检测器 + 跟踪器"两段式。两段式里有一条经典路线 DeepSORT:只保留高置信度检测框,给每个框提取外观特征(ReID),靠"运动预测 + 外观相似度"把前后帧的目标关联起来。本项目重点跟的是车——而 DeepSORT 是在行人数据集上设计调参的(外观模型直接用行人重识别权重),车辆场景的车流密集交叉、转弯减速、遮挡形态都与行人不同,直接套用会遇到车辆场景特有的问题。
实际跑车流视频暴露出三个典型问题:刚建档的轨迹一帧漏检就被删除,检测恢复后只能换新 ID;轨迹丢失 2~3 帧后外观匹配失败,IoU 营救轮又进不去(原版只允许丢失 1 帧的轨迹参加),目标断裂换 ID;短暂遮挡时画面框闪断(输出层只给丢失后 1 帧的惯性补位)。它们分别对应后文的三项改进。
本项目的目标:让车辆目标的轨迹 ID 保持稳定——不频繁切换,短暂丢失(漏检、遮挡)后能找回原 ID 继续跟踪。
检测用 Ultralytics YOLO,跟踪用 DeepSORT,针对车流场景做了三项实测有效的跟踪改进(以命令行参数提供,默认值即改进值)。本文按以下顺序介绍:整体架构、检测器选型与参数、DeepSORT 轨迹算法流程与三项改进、改进测试方法、结果对比数据、四个测试分析工具的完整用法(附实际命令)。
1、整体架构
1.1、技术栈
1.2、数据流水线
视频帧(每 N 帧) → Detector.detect() → Nx6 检测数组 [x1, y1, x2, y2, conf, cls]
→ xyxy_to_xywh() → 中心点格式 [xc, yc, w, h] + 置信度 + 类别
→ DeepSort.update() → ReID 特征提取 → 级联匹配 → 轨迹输出 Nx7 [x1, y1, x2, y2, cls, track_id, conf]
→ draw_tracking() → 绘制边框 + ID + 帧信息
→ 写入输出视频 + 逐帧结果 txt
设计要点三条:
- 检测与跟踪彻底解耦:检测端
Detector.detect()输出标准 Nx6 数组,跟踪端DeepSort.update()只认"中心点框 + 置信度 + 类别 + 原图"——只要检测器能产出"框 + 置信度",不限 YOLO、不限框架,转成这个格式接上接口就能用,跟踪端代码零改动。换 YOLO 系模型只改--model一个参数。 - 跳帧不解码:
--frame-interval控制每隔 N 帧处理一次,跳过的帧用 grab 只推进不解码(零解码成本),需要处理的帧才 retrieve 解码——同一套参数可以在"逐帧"与"抽帧"两种喂帧方式下跑,输出视频帧率按比例缩放保持时间轴一致。 - 每次运行全量落盘:输出 txt 逐帧记录每个检测框的去向(配上了哪条轨迹 / 被置信度门槛过滤),文件头写入本次全部配置参数,后续所有分析、人工核查、基线与改进对比都基于这份 txt,实验完全可追溯。
1.3、目录结构
AiMotDeepSort/ ├── detector.py # YOLO 检测器封装类(加载模型、设备选择、帧推理、解析结果) ├── README.md # 工程说明(环境安装、快速开始、文档导航) │ ├── 📁 deep_sort/ # DeepSORT 核心实现(原版源码 + 接口封装) │ ├── deep_sort.py # DeepSort 主类(检测 → 轨迹接口 + 输出组装) │ ├── __init__.py # 工厂函数 DeepSortTracker(args) + xyxy_to_xywh 格式转换 │ │ │ ├── 📁 sort/ # 轨迹算法核心 │ │ ├── tracker.py # 主跟踪器(置信度过滤 → 级联匹配 + IoU 匹配 → 建档结算) │ │ ├── kalman_filter.py # 卡尔曼滤波器(8 维状态) │ │ ├── track.py # 单条轨迹(状态机 Tentative → Confirmed → Deleted) │ │ ├── nn_matching.py # 外观特征最近邻距离度量(余弦距离) │ │ ├── detection.py # 检测框 + 特征封装 │ │ ├── iou_matching.py # IoU 代价计算 │ │ ├── linear_assignment.py # 匈牙利分配 / 级联匹配 │ │ ├── preprocessing.py # 检测框 NMS │ │ └── __init__.py │ │ │ ├── 📁 deep/ # ReID 外观特征提取 │ │ ├── feature_extractor.py # Extractor(默认加载 ckpt.t7)/ FastReIDExtractor(备选) │ │ ├── model.py # 特征网络(resnet18 结构 → 128 维) │ │ ├── resnet.py # ResNet 骨干 │ │ └── 📁 checkpoint/ # ReID 权重目录 │ │ ├── ckpt.t7 # 默认外观权重(--reid-ckpt 默认值,本项目测试全部用它) │ │ ├── original_ckpt.t7 # 原版权重备份(当前代码未引用) │ │ ├── market_bot_R50.pth # FastReID 备选权重(当前代码未引用) │ │ └── resnet18-5c106cde.pth # torchvision ResNet18 ImageNet 预训练骨干权重 │ ├── 📁 ultralytics/ # 内置 Ultralytics YOLO 库(8.4.41,仅用于检测,免安装) │ ├── 📁 utils/ # 工具函数 │ ├── __init__.py │ ├── draw.py # draw_tracking 轨迹绘制(边框、ID、帧信息) │ ├── logger.py # 日志封装(控制台 + logs/app.log 双通道) │ ├── paths.py # 路径工具(工程目录路径配置) │ └── config.py # 配置读取(读 configs/system_config.json) │ ├── 📁 configs/ # 配置文件目录 │ └── system_config.json # 系统配置(日志级别等) │ ├── 📁 logs/ # 运行日志目录 │ └── app.log # 日志输出(utils/logger.py 写入) │ ├── 📁 test/ # 测试与分析脚本 │ ├── test_deepsort.py # 跟踪主测试脚本(检测 → 跟踪 → 可视化 → 输出) │ ├── frame_viewer.py # 逐帧看片器(结果 txt 叠加原视频逐帧查看) │ ├── analyze_track_results.py # 单次运行分析(7 张图 + markdown 报告) │ ├── analyze_track_compare.py # 两次运行对比(参数对比表 + 8 张对比图 + 报告) │ └── 📁 output/ # 运行输出目录(deepsort_<模型>_<视频>_<时间戳> 运行目录 + 两次对比目录,含视频 / txt / 图表 / 报告) │ ├── 📁 model/ # 模型文件目录 │ ├── yolov8s.pt # YOLOv8s 检测模型(默认模型,全部基线与改进数据基于它) │ ├── yolo11s.pt # YOLO11s 检测模型 │ ├── yolov5su.pt # YOLOv5su 检测模型 │ └── yolo26s.pt # YOLO26s 检测模型 │ ├── 📁 video/ # 视频文件目录 │ ├── dense.mp4 # 密集交叉场景测试视频 │ └── turn.mp4 # 转弯减速场景测试视频 │ └── 📁 doc/ # 项目文档目录 ├── 项目介绍.md # 工程详解(架构、参数、算法、改进、结果、工具用法) ├── 项目结构.md # 本文件 ├── deepsort源码分析.md # DeepSORT 逐类逐方法源码解读 ├── 卡尔曼滤波预测过程.md # 预测 / 投影 / 修正 / 建档四函数实际数字推算 ├── deepsort改进点.md # 三项改进的完整七段文档 └── *.png # 文档插图
2、改进
改进一:IoU 匹配容忍丢失帧数(–iou-match-tolerance)
改进二:确认阶段容忍丢失帧数(–tentative-tolerance)
3、测试
4、详细介绍请看文章
【AI视觉软件 03】基于 Ultralytics + DeepSORT 的多目标跟踪与改进(支持YOLO全系列,重点车跟踪)-CSDN博客
5、购买获得以下内容
out 是测试输出的视频,如需要查看原测试可以下载,分开上传是为了减少压缩包大小,加快下载速度。