尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLOv9+DeepSort目标跟踪毕设实战:从环境搭建到MOT指标优化

发布时间:2026/9/28 16:45:19

资讯中心
01
ARTICLE

YOLOv9+DeepSort目标跟踪毕设实战:从环境搭建到MOT指标优化

YOLOv9+DeepSort目标跟踪毕设实战:从环境搭建到MOT指标优化
简介这份毕业设计资源围绕YOLOv9与DeepSORT的联合应用展开面向计算机视觉方向的学生与开发者解决多目标跟踪从检测到关联的完整实现问题。压缩包共8个文件约16.85MB包含Python源码、Jupyter Notebook、配置文件、依赖清单与说明文档等覆盖模型加载、跟踪流程与结果可视化等关键环节。项目以YOLOv9完成逐帧目标检测并输出边界框再由DeepSORT结合卡尔曼滤波与深度特征度量实现跨帧目标关联帮助读者理解检测与跟踪的衔接逻辑。源码结构清晰便于按模块阅读与二次开发适合作为毕业设计参考或目标跟踪入门实践。目前已有548人学习可借此掌握多目标跟踪算法的部署细节与工程实现思路。1. YOLOv9 加 DeepSort 做目标跟踪一份毕设源码能跑出什么名堂如果你手上正攥着一个「YOLOv9DeepSort 目标跟踪」的毕业设计题目大概率会经历这么一段心路先搜到一堆 python 源码压缩包解压一看目录结构五花八门requirements 里版本号互相打架跑起来要么 CUDA 报错要么跟踪框满屏乱跳。这个标题背后其实是一条非常成熟的工程链路——用 YOLOv9 做逐帧目标检测把检测框喂给 DeepSort 做跨帧身份关联最终输出每个目标的稳定 ID 和运动轨迹。它解决的核心问题是单帧检测只能告诉你「这一帧有几只狗」而跟踪要回答「这只狗从第 3 帧到第 300 帧一直是同一只」。适合谁做毕设的本科生、想入门多目标跟踪MOT的算法工程师、以及需要给视频加轨迹分析能力的落地开发者。这一章先把整条链路讲清楚后面几章带你从环境搭到调参把这份源码真正跑出可写进论文的结果。2. 拆开这份源码YOLOv9 检测与 DeepSort 关联各自在干什么2.1 YOLOv9 在跟踪链路里的角色与选型理由YOLOv9 在这条链路里只干一件事对视频的每一帧输出一组检测框每个框带类别和置信度。它不负责「记住」上一帧的目标也不管 ID 分配。很多人第一次看源码会困惑——为什么跟踪代码里还要单独加载一个 .pt 权重因为跟踪器本身不做检测DeepSort 的输入必须是检测结果。选 YOLOv9 而不是 YOLOv5/v8主要看中它的可编程梯度信息PGI和 GELAN 结构在同等参数量下对小目标和遮挡场景的召回更稳。对毕设来说这个「新」字也方便你在论文里写创新点。但要注意YOLOv9 官方放出的权重有 yolov9-c、yolov9-e 等多个规格源码里默认加载哪个直接决定你的帧率和精度平衡。常见做法是先用 yolov9-c.pt 跑通确认链路无误后再换 yolov9-e 冲精度。下面是最小检测调用脱离跟踪单独验证 YOLOv9 是否正常import cv2 import torch from models.common import DetectMultiBackend # 来自 YOLOv9 官方仓库 # 加载权重device 按实际选 cuda:0 或 cpu model DetectMultiBackend(yolov9-c.pt, devicetorch.device(cuda:0)) model.eval() img cv2.imread(test_frame.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 预处理letterbox 到 640x640保持长宽比 tensor model.preprocess(img_rgb) # 归一化 填充 pred model(tensor) # 前向推理 dets model.postprocess(pred, conf_thres0.25, iou_thres0.45) for x1, y1, x2, y2, conf, cls in dets: print(f类别{int(cls)} 置信度{conf:.2f} 框({x1:.0f},{y1:.0f},{x2:.0f},{y2:.0f}))逻辑说明preprocess 负责把任意分辨率图像缩放到网络输入尺寸并归一化postprocess 做 NMS 去重。参数上conf_thres0.25 是置信度阈值调高会漏检、调低会引入大量误检喂给 DeepSortiou_thres0.45 控制重叠框合并力度。这两个值不是拍脑袋定的后面第 5 章会讲怎么根据你的数据集扫出来。2.2 DeepSort 的卡尔曼预测与级联匹配机制DeepSort 的核心不是「深度学习匹配」而是「卡尔曼滤波预测 匈牙利算法分配 外观特征余弦距离」三件套。每一帧它做四步先用卡尔曼滤波根据上一帧轨迹预测当前帧每个目标的位置再提取检测框的外观特征一个 128 维向量来自 ReID 网络然后计算预测框与检测框之间的马氏距离和外观余弦距离最后用级联匹配优先把确认态轨迹和检测框配对。源码里最容易被忽略的是max_dist和max_iou_distance这两个参数。max_dist 是外观距离阈值默认 0.2意味着外观差异超过这个值的检测框不会和轨迹匹配max_iou_distance 默认 0.7控制 IoU 匹配的宽松度。遮挡场景下这两个值调不好ID 就会频繁跳变——这就是很多人说的「跟踪玄学」。下面这段是 DeepSort 更新调用的典型写法注意检测框格式必须是[x1, y1, x2, y2, conf, cls]from deep_sort_realtime.deepsort_tracker import DeepSort # max_age: 轨迹丢失多少帧后删除n_init: 连续命中多少帧才确认 tracker DeepSort(max_age30, n_init3, max_iou_distance0.7, max_dist0.2) # detections 来自上一节 YOLOv9 的输出转成 DeepSort 要求的列表格式 detections [[x1, y1, x2, y2, conf, cls] for x1, y1, x2, y2, conf, cls in dets] tracks tracker.update_tracks(detections, frameimg_rgb) for track in tracks: if not track.is_confirmed(): continue track_id track.track_id ltrb track.to_ltrb() # 转成左上右下坐标 print(fID {track_id} 位置 {ltrb})逻辑说明update_tracks 内部完成预测、匹配、更新三步。max_age30 表示目标消失 30 帧内仍保留轨迹适合短暂遮挡n_init3 表示连续 3 帧匹配上才给正式 ID能过滤掉一闪而过的误检。参数怎么改取决于你的视频帧率和目标运动速度第 4 章会给出具体排查方法。2.3 检测与跟踪的接口对齐三个必须统一的约定把 YOLOv9 和 DeepSort 接起来最容易翻车的地方不是算法而是接口约定。第一坐标格式YOLOv9 输出通常是 xyxy 绝对坐标DeepSort 也吃 xyxy但有些源码中间转成了 xywh转换写错就会导致框整体偏移。第二类别过滤DeepSort 默认不区分类别如果你只关心「人」必须在喂检测框之前按 cls 过滤否则人和车会互相抢 ID。第三帧顺序视频必须按时间顺序逐帧喂跳帧或乱序会让卡尔曼预测彻底失效。我一般会在两段代码之间加一个适配函数把格式转换和过滤集中处理避免散落在主循环里def adapt_detections(dets, target_cls0, conf_thr0.3): 把 YOLOv9 输出转成 DeepSort 输入只保留指定类别 out [] for x1, y1, x2, y2, conf, cls in dets: if int(cls) ! target_cls: continue if conf conf_thr: continue # 裁剪到图像边界防止负坐标或越界 x1, y1 max(0, x1), max(0, y1) out.append([x1, y1, x2, y2, conf, cls]) return out逻辑说明target_cls0 对应 COCO 里的 personconf_thr 在这里做二次过滤比 YOLO 内部的阈值更严格目的是减少误检对 ID 稳定性的干扰。裁剪边界这一步很多人省掉结果 DeepSort 内部计算 IoU 时出现负值匹配直接乱套。3. 从零跑通环境搭建、权重准备与最小可运行脚本3.1 环境依赖与版本锁定这份源码能不能跑起来八成取决于环境。YOLOv9 依赖 PyTorchDeepSort 依赖 numpy、scipy、opencv还有的版本用 torchreid 提特征。最常见的翻车是 PyTorch 版本和 CUDA 不匹配报CUDA error: no kernel image is available。我的血泪经验是先确定显卡驱动支持的 CUDA 版本再倒推 PyTorch 版本最后装其他依赖。下面是一份经过验证的依赖清单用 conda 建环境最省事conda create -n yolo_track python3.9 -y conda activate yolo_track # 按你的 CUDA 版本选这里以 CUDA 11.8 为例 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python4.8.1.78 pip install numpy1.24.3 scipy1.11.4 pip install filterpy1.4.5 # 卡尔曼滤波依赖 pip install lap0.4.0 # 匈牙利算法加速参数说明python 3.9 是兼容性最好的版本3.11 以上有些老依赖会编译失败。filterpy 和 lap 是 DeepSort 的硬依赖缺一个都会在 import 阶段报错。如果你没有 GPU把 torch 那行换成 CPU 版本即可但帧率会掉到个位数。3.2 权重文件与目录结构源码包里通常已经带了权重但你要确认三件事YOLOv9 的 .pt 文件是否完整有的压缩包会截断、DeepSort 的 ReID 权重通常是 ckpt.t7是否存在、以及配置文件里的路径是不是相对路径。我见过太多人把权重放在桌面代码里写死绝对路径换台机器就崩。推荐的目录结构是这样的主脚本里全部用相对路径引用project/ ├── weights/ │ ├── yolov9-c.pt │ └── ckpt.t7 ├── configs/ │ └── deepsort.yaml ├── data/ │ └── test.mp4 ├── track.py └── requirements.txt如果 ReID 权重缺失DeepSort 会退化成纯 IoU 匹配ID 跳变会非常严重。这一点在论文里要写清楚否则答辩时被问「你的外观特征怎么来的」会答不上。3.3 最小可运行主循环把前面几节拼起来就是一个能跑的主循环。核心是「读帧 → 检测 → 适配 → 跟踪 → 画框」五步不要在里面塞太多逻辑方便调试import cv2 from models.common import DetectMultiBackend from deep_sort_realtime.deepsort_tracker import DeepSort model DetectMultiBackend(weights/yolov9-c.pt, devicecuda:0) tracker DeepSort(max_age30, n_init3) cap cv2.VideoCapture(data/test.mp4) writer cv2.VideoWriter(output.mp4, cv2.VideoWriter_fourcc(*mp4v), cap.get(cv2.CAP_PROP_FPS), (int(cap.get(3)), int(cap.get(4)))) while True: ret, frame cap.read() if not ret: break rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) dets model(rgb) # 检测 dets adapt_detections(dets, target_cls0, conf_thr0.3) # 适配 tracks tracker.update_tracks(dets, framergb) # 跟踪 for t in tracks: if not t.is_confirmed(): continue x1, y1, x2, y2 map(int, t.to_ltrb()) cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(frame, fID {t.track_id}, (x1, y1 - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) writer.write(frame) cap.release() writer.release()逻辑说明VideoWriter 的帧率必须和源视频一致否则输出会快放或慢放。is_confirmed 过滤掉未确认轨迹避免画面里出现一闪而过的假 ID。这段代码跑通说明整条链路已经打通接下来才是调参和优化。4. 避坑与排查ID 跳变、漏检、显存爆炸的现场处理4.1 现象同一个目标 ID 频繁跳变原因外观特征区分度不够或者 max_dist 阈值太严导致匹配失败。遮挡后重新出现时卡尔曼预测位置偏差大级联匹配直接放弃。解决先把 max_dist 从 0.2 放宽到 0.3 试观察 ID 稳定性如果还跳检查 ReID 权重是否加载成功。另一个隐藏原因是检测框抖动YOLOv9 每帧框位置差几个像素外观特征提取区域就偏了。可以在检测后加一个简单的框平滑或者提高 conf_thres 让框更稳。4.2 现象目标被遮挡后 ID 变成新的原因max_age 太小轨迹在遮挡期间被删除目标重现时只能分配新 ID。解决把 max_age 从 30 提到 50 甚至 80代价是误检轨迹存活时间变长。更好的做法是结合场景——如果遮挡频繁且时间短max_age 调大如果目标经常离开画面调大反而引入幽灵轨迹。这个参数没有万能值必须拿你的测试视频扫一遍。4.3 现象显存溢出跑到一半 OOM原因YOLOv9 输入分辨率太高或者 batch 累积没释放。有的源码在循环里反复创建 tensor 不释放显存只增不减。解决先把推理尺寸从 1280 降到 640显存占用能降一半以上。然后在循环里显式torch.cuda.empty_cache()虽然会慢一点但能避免累积。如果还爆换 yolov9-c 而不是 yolov9-e参数量差一个量级。4.4 现象跟踪框整体偏移或错位原因坐标格式转换错误或者 letterbox 填充后的坐标没有还原回原图尺度。解决检查 preprocess 里有没有记录缩放比例和填充偏移postprocess 必须用同样的参数反算回原图坐标。很多人直接拿网络输出坐标画框结果框全挤在左上角。验证方法很简单拿一张只有单个目标的图看框是否贴合不贴合就是坐标还原错了。4.5 现象CPU 上跑得动GPU 上报维度错误原因设备不一致。模型在 GPU 上输入 tensor 在 CPU 上或者反过来。解决统一设备。在加载模型后定义device next(model.parameters()).device所有 tensor 创建时指定 device。这个错误信息通常很隐晦报的是维度不匹配实际是设备不匹配。5. 把毕设做出区分度MOT 指标验证与三个可写进论文的改进点跑通只是及格线毕设要拿高分得有量化结果。MOT 领域标准指标是 MOTA、IDF1、ID Switch用 py-motmetrics 就能算。你需要把跟踪结果写成 MOT 格式的 txt每行帧号,ID,x,y,w,h,置信度,-1,-1,-1然后和标注文件对比。import motmetrics as mm acc mm.MOTAccumulator(auto_idTrue) # gt 和 pred 都是 {帧号: [(id, x, y, w, h), ...]} 结构 for frame_id in sorted(gt.keys()): gt_ids [g[0] for g in gt[frame_id]] pred_ids [p[0] for p in pred[frame_id]] # 用 IoU 距离矩阵做匹配 distances mm.distances.iou_matrix( [g[1:] for g in gt[frame_id]], [p[1:] for p in pred[frame_id]], max_iou0.5 ) acc.update(gt_ids, pred_ids, distances) mh mm.metrics.create() print(mh.compute(acc, metrics[mota, idf1, num_switches], nameYOLOv9DeepSort))逻辑说明max_iou0.5 是匹配阈值低于这个 IoU 视为不匹配。num_switches 就是 ID Switch 次数这个值直接反映跟踪稳定性。跑完你会得到一个基线比如 MOTA 0.65、IDF1 0.58然后你的改进点就是把这个数字往上推。三个可落地的改进方向第一换更强的 ReID 特征提取网络比如把原始的小网络换成 OSNetIDF1 通常能涨 3 到 5 个点第二在 DeepSort 匹配阶段引入相机运动补偿用 GMC 算法估计背景运动对移动镜头场景效果明显第三把检测和跟踪的置信度做联合决策低置信度检测框不直接丢而是用来更新已有轨迹的卡尔曼状态减少漏跟。我自己的习惯是每改一个点固定同一段测试视频和同一份标注只变一个变量记录 MOTA 和 ID Switch 的变化。这样论文里的消融实验表格才有说服力答辩时被问「你这个改进到底有没有用」也能直接甩数据。跟踪这行没有银弹参数和场景强绑定把验证流程跑顺比调出一个漂亮数字更重要。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。