新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv5+DeepSORT跟踪计数实战:从环境搭建到参数调优与二次开发

发布时间:2026/9/28 17:18:59来源:尧图网络
YOLOv5+DeepSORT跟踪计数实战:从环境搭建到参数调优与二次开发
简介这份资源是一套基于Python、YOLOv5与DeepSORT实现的行人或车辆跟踪计数系统面向计算机视觉方向的毕业设计、课程设计与项目开发学习者帮助解决目标检测、多目标跟踪与过线计数等典型工程问题。压缩包共122个文件约129.7MB包含38个py源码文件、58个pyc编译文件、9个yaml配置、5个xml标注文件以及权重文件、演示视频、Dockerfile和说明文档等覆盖模型配置、工具函数、数据集处理与运行脚本等模块。项目已在Win10、PyCharm、Python3.6环境下测试依赖PyTorch 1.7.0以上与OpenCV运行main.py即可启动追踪检测。已有66人学习关注。读者可获得完整可运行源码、项目文档与演示视频理解YOLOv5检测与DeepSORT跟踪的衔接方式、计数逻辑实现及环境配置排错思路并在此基础上扩展行人或车辆统计等应用。1. 从一段 test.mp4 说起这套 YOLOv5 DeepSORT 跟踪计数系统到底能跑出什么如果你手头有一段固定机位的行人或车辆视频想统计一段时间内经过画面的人数或车数最省事的路径不是从零写检测器而是拿一套已经跑通的 YOLOv5 DeepSORT 工程直接改。这份资源就是干这个的yolov5_deepsort-master目录里放着main.py、general.py、utils.py、datasets.py配一个yolov5l.pt权重和一段test.mp4演示视频外加Dockerfile、README.md和项目文档。运行环境写得很明确——win10 pycharm python3.6依赖 pytorch 1.7.0 和 opencv控制台执行main.py就能看到跟踪框和计数结果。它适合三类人做计算机毕业设计、课程设计需要可演示系统的想学目标检测多目标跟踪完整链路的以及要在此基础上做二次开发换类别、换计数线、接摄像头的。不适合指望开箱即用做工业级部署的人因为计数逻辑和跟踪参数都需要按场景调。2. 拆开 yolov5_deepsort-master检测与跟踪是怎么串起来的2.1 YOLOv5 负责“看到”DeepSORT 负责“记住”这套系统的核心分工很清晰。YOLOv5 是单阶段目标检测器输入一帧图像输出若干边界框和类别置信度它只回答“这一帧里哪里有目标”不关心上一帧的目标是谁。DeepSORT 补的就是这个身份连续性它把检测框送进卡尔曼滤波做运动预测再用一个 ReID 特征提取网络算外观描述子通过级联匹配把当前帧的框和已有轨迹关联起来关联不上的新建轨迹连续多帧匹配不上的删除轨迹。为什么选 YOLOv5 而不是 Faster R-CNN因为跟踪计数是逐帧推理速度直接决定能不能实时。YOLOv5l 在普通显卡上单帧推理大概几十毫秒换成两阶段检测器帧率会掉得很难看而 DeepSORT 的匹配又依赖检测框的稳定性帧率太低会导致轨迹断裂。yolov5l.pt是 l 规格权重精度比 s/m 高但速度慢一些如果只是做课程演示换成yolov5s.pt帧率会明显提升代价是远处小目标漏检变多。2.2 目录里每个文件在链路中的位置拿到源码包先别急着运行把文件职责理一遍能省很多排查时间。main.py是入口负责读视频、循环取帧、调用检测和跟踪、画框、计数、写输出。general.py和utils.py是 YOLOv5 的通用工具包含非极大值抑制、坐标变换、图像预处理这些函数。datasets.py管数据加载和增强做推理时基本不碰它但如果你要换自己的视频源读帧逻辑可能落在这里或main.py里。yolov5l.pt是预训练权重test.mp4是验证用的样例视频Dockerfile给的是容器化环境参考.gitignore和.iml是工程配置demo.jpg通常是效果截图。提示先确认yolov5l.pt和test.mp4的相对路径和main.py里写的一致路径不对是最常见的“跑不起来”原因。2.3 从零把环境跑起来的具体步骤环境这块python3.6 是底线但实际建议用 3.8 或 3.9因为 pytorch 1.7 之后的很多轮子对 3.6 支持在减弱。下面是我一般会走的流程命令按 Windows 的 pycharm 终端或 cmd 写。# 建独立环境避免和系统 python 打架 conda create -n yolo_track python3.8 -y conda activate yolo_track # 装 pytorch具体 cuda 版本按自己显卡选这里给 cpu 版示例 pip install torch1.7.0 torchvision # 装 opencv 和其他常用依赖 pip install opencv-python numpy scipy pillow装完先别改代码直接跑一次原始main.py确认能出结果再动。运行命令就是控制台里python main.py如果报ModuleNotFoundError缺什么补什么如果报权重加载失败检查yolov5l.pt是否在预期目录如果视频窗口弹不出来可能是 opencv 的 GUI 后端问题改成写文件输出即可。这一步的目标是拿到一个“能跑通的基线”后面所有改动都基于它对比。2.4 计数逻辑藏在哪里怎么改计数线跟踪计数系统的“计数”通常不是 DeepSORT 自带的而是在main.py里手写的画一条虚拟线或一个区域当某个轨迹的中心点从线的一侧移动到另一侧时计数加一并用轨迹 ID 去重防止同一目标重复计数。常见实现是维护一个track_id - 上次所在侧的字典每帧更新。# 伪代码示意实际变量名以源码为准 counted_ids set() track_side {} for frame in video: detections yolo_detect(frame) tracks deepsort_update(detections, frame) for t in tracks: tid t.track_id cx, cy t.center side up if cy LINE_Y else down if tid in track_side and track_side[tid] ! side: if tid not in counted_ids: counted_ids.add(tid) total 1 track_side[tid] side逻辑说明LINE_Y是计数线的纵坐标side判断目标在线之上还是之下只有发生跨线且该 ID 没计过数才累加。参数上LINE_Y要按你的视频分辨率设别照搬counted_ids用集合是为了 O(1) 去重。如果发现同一目标被计两次多半是轨迹 ID 在中途断了又新建这时候要回头调 DeepSORT 的max_age和匹配阈值而不是改计数逻辑。3. 参数调优与二次开发让计数在你的视频上站得住3.1 检测阈值和跟踪参数的联动关系YOLOv5 侧最影响跟踪的是置信度阈值和 NMS 的 IoU 阈值。置信度调低检测框变多DeepSORT 匹配负担加重容易出现 ID 跳变调高漏检增多轨迹容易断。我一般先把置信度设在 0.4 到 0.5 之间跑一遍看漏检和误检哪个更严重再微调。NMS 的 IoU 阈值默认 0.45 左右如果画面里目标密集、遮挡多可以适当调高到 0.5 减少误抑制。DeepSORT 侧关键参数是max_dist外观匹配距离阈值、max_iou_distance、max_age轨迹最大存活帧数和n_init确认轨迹所需连续匹配帧数。max_age太小目标被遮挡几帧轨迹就没了再出现会被当成新目标重复计数太大消失的目标轨迹迟迟不删可能和后来者错误关联。行人场景我一般把max_age设到 30 左右车辆速度快、遮挡少可以小一些。3.2 换成自己的视频或摄像头换视频源通常改main.py里的读取路径把test.mp4换成你的文件接摄像头则把cv2.VideoCapture的参数从文件路径改成设备索引0。import cv2 # 读本地视频 cap cv2.VideoCapture(your_video.mp4) # 或者接摄像头0 一般是默认摄像头 # cap cv2.VideoCapture(0) # 确认打开成功失败时给出明确提示而不是静默退出 if not cap.isOpened(): raise RuntimeError(视频源打开失败检查路径或设备索引) fps cap.get(cv2.CAP_PROP_FPS) w int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))逻辑说明VideoCapture传字符串读文件传整数读设备isOpened()必须判否则后面读帧全是空。参数上CAP_PROP_FPS拿到的帧率用于写输出视频如果要做“每秒经过人数”这种指标得用帧率把帧序号换算成时间。接摄像头时分辨率可能和模型输入不一致YOLOv5 内部会做 letterbox 缩放但计数线的坐标要按原始分辨率设别按缩放后的设。3.3 换类别从行人车辆到其他目标这套权重是 COCO 预训练的能检测 80 类。如果你只关心行人和车辆可以在检测后按类别 ID 过滤COCO 里行人是 0常见车辆是 2car、5bus、7truck。过滤能减少无关目标对跟踪的干扰也能让计数更干净。# 只保留行人和车辆类别类别 id 按 COCO 定义 KEEP_CLASSES {0, 2, 5, 7} def filter_detections(dets): # dets 每项形如 [x1, y1, x2, y2, conf, cls] return [d for d in dets if int(d[5]) in KEEP_CLASSES]逻辑说明在送进 DeepSORT 之前过滤能直接降低匹配复杂度。参数上KEEP_CLASSES按你的需求改如果要检测其他类别查 COCO 类别表换 ID。注意过滤后如果某帧一个目标都没有DeepSORT 仍要正常更新走预测否则轨迹状态会乱。3.4 输出结果与可视化演示和毕设通常需要一段带框带计数的输出视频。用cv2.VideoWriter把每帧画完框和计数文字后写出去编码器选mp4v兼容性较好。fourcc cv2.VideoWriter_fourcc(*mp4v) out cv2.VideoWriter(output.mp4, fourcc, fps, (w, h)) # 循环内画完框和计数后 out.write(frame) # 循环结束后释放 out.release() cap.release() cv2.destroyAllWindows()逻辑说明VideoWriter的帧率和分辨率必须和源一致否则输出会快放或变形。参数上fourcc换XVID配.avi也行但 mp4v 更通用。写文件比弹窗稳定做毕设演示视频建议直接写文件避免现场弹窗卡顿。4. 避坑与排查这套源码最容易翻车的五个地方4.1 现象运行报权重文件找不到或格式错误原因yolov5l.pt没放在main.py预期的相对路径下或者下载/拷贝过程中文件损坏。解决先确认权重和入口脚本的相对位置用绝对路径试一次再核对文件大小是否正常损坏就重新获取。路径问题占这类报错的大半。4.2 现象跟踪框频繁跳 ID计数明显偏多原因检测框抖动大或漏检多DeepSORT 匹配不上就新建轨迹。解决先提高检测置信度减少误检再适当增大max_age让轨迹在短暂遮挡后能接回来如果画面里目标外观相似比如一群穿同色衣服的人ReID 特征区分度不够可以考虑换更强的 ReID 模型或降低外观匹配权重。4.3 现象同一目标被计两次原因轨迹中途断裂后重建新 ID 再次跨线。解决检查max_age是否过小确认计数去重是按轨迹 ID 做的如果断裂无法避免可以在计数逻辑里加一个“短时间内同一位置不重复计数”的冷却判断但这属于补救根子还在跟踪稳定性。4.4 现象帧率很低视频像慢放原因yolov5l.pt模型偏大或者跑在 CPU 上。解决换yolov5s.pt或yolov5m.pt确认 pytorch 装的是 GPU 版本且torch.cuda.is_available()为 True输入分辨率也可以适当降低但要注意小目标检测精度会下降。4.5 现象opencv 弹窗报错或显示异常原因opencv 的 GUI 后端和系统环境不兼容常见于某些精简版 python 环境。解决不依赖弹窗直接写输出视频文件或者装opencv-contrib-python换后端。做演示时写文件比弹窗更可控。5. 进阶技巧把计数从“能跑”做到“敢写进报告”5.1 用分段统计替代单一总数单一总数在报告里说服力有限改成按时间段统计更有信息量。做法是维护一个按秒或按分钟分桶的计数器每帧根据当前帧序号换算时间把跨线事件记到对应桶里。import time bucket {} # 时间桶 - 计数 fps cap.get(cv2.CAP_PROP_FPS) or 25 def record_count(frame_idx, tid): sec int(frame_idx / fps) bucket.setdefault(sec, set()).add(tid) # 统计时 per_sec {s: len(ids) for s, ids in bucket.items()}逻辑说明用集合存每个时间桶内的轨迹 ID天然去重。参数上fps拿不到时给个默认值兜底否则除零会崩。这样输出的“每秒/每分钟经过数”可以直接画成曲线放进毕设报告。5.2 用轨迹长度过滤误计数有些误检产生的短命轨迹也会跨线造成虚高。可以在计数前加一个轨迹存活帧数门槛只有存活超过一定帧数的轨迹才允许计数。MIN_TRACK_LEN 5 # 轨迹至少存活 5 帧才参与计数 def can_count(track): return track.age MIN_TRACK_LEN逻辑说明track.age是轨迹存在的帧数DeepSORT 的轨迹对象一般带这个属性没有就自己维护。参数上MIN_TRACK_LEN按帧率和目标速度调太快的目标设太大会漏计太慢的目标设太小会误计。5.3 验证计数准不准的笨办法没有标注数据时最靠谱的验证是人工数。把输出视频放慢人工数一遍跨线目标和程序结果对比。差异在 5% 以内基本可用超过 10% 就要回头查是漏检、ID 跳变还是计数线位置不合理。我一般会挑三段不同时段的视频各数一遍而不是只看一段因为不同时段目标密度不同暴露的问题也不一样。5.4 一个容易被忽略的细节计数线的方向性如果只判断“跨线”不判断方向进出都计数结果会翻倍。正确做法是记录跨线前后的侧别只有从 A 侧到 B 侧才计反向不计或单独计。def is_valid_cross(prev_side, curr_side): # 只统计从下往上反向不计 return prev_side down and curr_side up逻辑说明方向判断依赖上一帧的侧别所以track_side字典必须每帧更新。参数上方向按你的业务定统计“进入人数”还是“离开人数”决定判断条件。这个细节不写清楚报告里的数字会对不上。从那以后我每次拿到这类跟踪计数工程都强制先用test.mp4跑通基线再换自己的视频最后才动参数和计数逻辑——顺序反了出了问题根本分不清是环境、模型还是代码的锅。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

详解 Cursor 核心能力:代码库索引、AI 审查重构、隐私模式、模型选择、自定义 Rules、外部文档知识库与 MCP 服务器配置 2026/9/28 18:55:20

详解 Cursor 核心能力:代码库索引、AI 审查重构、隐私模式、模型选择、自定义 Rules、外部文档知识库与 MCP 服务器配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Claude 4 vs GPT-4.1 vs Gemini 2.5 Pro:2025 编程能力实测横评与 TaoToken 统一接入配置 2026/9/28 18:55:20

Claude 4 vs GPT-4.1 vs Gemini 2.5 Pro:2025 编程能力实测横评与 TaoToken 统一接入配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
【电脑自动化 AI 工具】OpenClaw 零代码部署教程|Windows 下用 TaoToken 统一 Key 接入全过程(含安装包) 2026/9/28 18:55:20

【电脑自动化 AI 工具】OpenClaw 零代码部署教程|Windows 下用 TaoToken 统一 Key 接入全过程(含安装包)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AIAgent、Prompt、MCP是什么?用TaoToken统一Key跑通第一个MCP配置 2026/9/28 18:55:20

AIAgent、Prompt、MCP是什么?用TaoToken统一Key跑通第一个MCP配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
公司要不要把 Claude Sonnet 5 放进默认模型?先别一键切换,用 TaoToken 做一次灰度验证 2026/9/28 18:55:20

公司要不要把 Claude Sonnet 5 放进默认模型?先别一键切换,用 TaoToken 做一次灰度验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
设备偶发掉线重启恢复?五维排查法从物理链路到日志取证 2026/9/28 18:55:00

设备偶发掉线重启恢复?五维排查法从物理链路到日志取证

1. 设备偶发掉线重启恢复的排查思路总览设备偶发掉线、重启之后又恢复正常,这个现象在运维圈里几乎人人都遇到过。它最让人头疼的地方在于:故障是间歇性的,等你赶到现场或者连上设备的时候,它已经自己好了。你查日志,日…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉