首页/新闻资讯/正文详情

YOLOv5+DeepSORT车辆跟踪系统:违停/逆行检测与车流量统计

发布时间:2026/9/28 2:11:09 来源:云帆数科 栏目:资讯中心
YOLOv5+DeepSORT车辆跟踪系统:违停/逆行检测与车流量统计
简介本资源是一套完整的毕业设计级车辆智能分析系统基于YOLOv5目标检测与DeepSORT多目标跟踪算法实现面向计算机、人工智能、自动化等专业学生及初学者解决交通场景下车辆跟踪、流量统计、违停与逆行识别等实际问题可直接用于毕设、课程设计或项目原型开发。压缩包共134个文件含64个Python核心模块含检测、跟踪、逻辑判断主流程、30个YAML配置文件模型参数与跟踪超参、9张说明图与2个JPG示例图、7个XML标注样本、6个Shell部署脚本以及Dockerfile、README.md、LICENSE等工程化支持文件整体43.71MB结构规范便于二次开发与环境复现。已有108人学习下载所有代码均经实测运行通过配套tutorial.ipynb提供关键流程演示YOLOv5模型.jpg与train.jpg直观展示效果同时支持远程教学答疑助力从理解原理到落地实践的全链路学习。1. 毕业设计能直接跑通的YOLOv5DeepSORT车辆跟踪系统不是Demo是带违停/逆行检测、车流量统计、可二次开发的完整工程你花三天配环境、改路径、调参数最后发现tracking_id全乱跳、违停框飘在空中、逆行判断永远为False——这不是你代码写错了而是多数“YOLOv5DeepSORT”开源项目根本没做视频流时序对齐、没封检测-跟踪耦合边界、更没处理车辆ID在遮挡恢复后的身份一致性。而这份毕业设计源码从Dockerfile到tutorial.ipynb从train.jpg到YOLOv5模型.jpg全部按真实部署逻辑组织它用torch.cuda.amp自动混合精度加速推理用cv2.VideoCapture直连USB摄像头而非硬编码视频路径用deep_sort_realtime封装层替代原生DeepSORT黑匣子最关键的是——它把车流量统计嵌在track_history的滑动窗口里把违停判定锚定在ROI区域持续帧数阈值默认15帧把逆行检测建模为轨迹向量与车道线夹角余弦值动态比对。适合计科/人工智能专业学生直接当毕设交稿也适合想快速验证多目标跟踪工业落地边界的工程师——它不教你YOLO原理但告诉你为什么tracker.update()返回空列表时该先查det_confidence再查nms_iou。2. 从Docker一键启动到本地Python复现环境隔离与依赖解耦的两种实操路径2.1 Docker部署3行命令跑通绕过CUDA版本地狱项目根目录下的Dockerfile不是摆设而是专为解决“同学A的conda环境装了torch1.12cu113同学B的pip装了torch1.13cu116结果deepsort报错AttributeError: NoneType object has no attribute shape”设计的。它明确指定FROM pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime并用RUN pip install -r requirements.txt --no-cache-dir强制重装所有依赖避免宿主机残留包干扰。# Dockerfile 关键片段已去注释冗余行 FROM pytorch/pytorch:1.12.1-cuda11.3-cudnn8-runtime WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt --no-cache-dir COPY . . CMD [python, main.py, --source, 0, --view-img, --save-vid]提示执行前确认NVIDIA驱动版本≥465.19nvidia-smi查看若报错docker: Error response from daemon: could not select device driver 需运行sudo systemctl restart docker并执行sudo usermod -aG docker $USER后重新登录终端。构建镜像并启动容器docker build -t yolov5-deepsort-vehicle . docker run --gpus all -it --rm \ --device/dev/video0:/dev/video0 \ -v $(pwd)/outputs:/app/outputs \ yolov5-deepsort-vehicle--gpus all暴露全部GPU设备--device/dev/video0:/dev/video0透传USB摄像头Linux下-v $(pwd)/outputs:/app/outputs将容器内/app/outputs映射到宿主机当前目录outputs文件夹保存检测视频为什么必须用Docker因为deep_sort_realtime依赖scipy1.7.0而YOLOv5官方requirements.txt锁死scipy1.5.4Dockerfile中已手动升级并验证兼容性——这是你本地pip install踩坑的根源。2.2 本地Python环境复现CondaPyTorchCUDA精准匹配表若需在PyCharm/VSCode调试或修改逻辑推荐用Conda创建纯净环境。项目未提供environment.yml但根据requirements.txt和Dockerfile反推必须满足以下三元组PyTorch版本CUDA ToolkitConda安装命令1.12.111.3conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch1.11.011.3conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch安装后验证CUDA可用性import torch print(torch.__version__) # 应输出 1.12.1cu113 print(torch.cuda.is_available()) # 必须为 True print(torch.cuda.device_count()) # 至少为 1注意requirements.txt中deep-sort-realtime1.2.4依赖numba0.55.0若pip install报错numba requires llvmlite请先执行conda install llvmlite再装numba否则会触发LLVM编译失败。2.3 tutorial.ipynb交互式调试入口不是教学PPT而是可执行沙盒tutorial.ipynb不是Jupyter Notebook形式的教程而是带断点调试功能的流程验证器。它把main.py拆解为5个可独立运行的cellCell 1加载YOLOv5模型yolov5s.pt验证输入尺寸[1,3,640,640]是否匹配Cell 2读取test_video.mp4项目未提供需自行准备抽帧并显示原始画面Cell 3执行单帧检测打印pred张量形状应为[N,6]含x1,y1,x2,y2,conf,clsCell 4初始化DeepSORT tracker传入pred和frame获取tracks列表Cell 5绘制轨迹热力图验证track.get_state()返回的(x,y,a,h)是否随帧稳定更新关键技巧在Cell 4后插入以下代码可实时观察ID漂移问题# 在Cell 4执行后立即运行 for track in tracks: print(fTrack ID: {track.track_id}, Age: {track.age}, Hits: {track.hits}) # 若出现大量Age1/Hits1的短命track说明NMS阈值过高或detector置信度太低3. 核心功能实现原理车流量统计、违停检测、逆行判断的数学建模与代码落点3.1 车流量统计不是简单计数而是基于ROI轨迹方向的时空过滤器项目未用cv2.countNonZero()粗暴统计而是构建双ROI管道入口ROI四边形区域坐标存于config/rois.json仅当track中心点首次进入此区域时触发in_counter 1出口ROI另一四边形区域仅当track中心点离开此区域时触发out_counter 1核心逻辑在tracker.py第87行# tracker.py 片段 def update_flow_count(self, track): cx, cy int(track.to_tlbr()[0] (track.to_tlbr()[2]-track.to_tlbr()[0])//2), \ int(track.to_tlbr()[1] (track.to_tlbr()[3]-track.to_tlbr()[1])//2) if self.roi_in.contains_point((cx, cy)) and not track.in_roi: track.in_roi True self.in_counter 1 if self.roi_out.contains_point((cx, cy)) and track.in_roi: track.in_roi False self.out_counter 1track.to_tlbr()返回[x1,y1,x2,y2]cx,cy是bbox中心点self.roi_in.contains_point()调用OpenCV的cv2.pointPolygonTest()判断点是否在多边形内track.in_roi是track对象的自定义属性避免重复计数为什么不用单ROI单ROI无法区分进出方向会导致车流量翻倍。双ROI状态标记才是工业级做法。3.2 车辆违停检测持续静止帧数位置锁定的双重判定违停不是“检测框不动”而是运动矢量衰减空间锚定。项目在vehicle_analyzer.py中定义静止判定连续15帧内track的delta_x和delta_y均小于3像素abs(x_now - x_prev) 3位置锁定该track必须位于parking_zone矩形区域内坐标存于config/parking_zones.json# vehicle_analyzer.py 片段 def is_parked(self, track): if len(track.history) 15: return False recent_deltas [] for i in range(1, 15): prev track.history[-i-1] curr track.history[-i] dx abs(curr[0] - prev[0]) dy abs(curr[1] - prev[1]) recent_deltas.append(dx dy) avg_delta sum(recent_deltas) / len(recent_deltas) # 获取当前bbox中心点 cx, cy (track.to_tlbr()[0]track.to_tlbr()[2])//2, \ (track.to_tlbr()[1]track.to_tlbr()[3])//2 return avg_delta 3.0 and self.parking_zone.contains_point((cx, cy))track.history存储最近30帧的(x,y)坐标recent_deltas计算每帧位移和avg_delta 3.0过滤掉微小抖动如风吹树叶导致的误检self.parking_zone.contains_point()确保只在划线停车区报警3.3 车辆逆行检测轨迹向量与车道线夹角的余弦阈值法逆行检测最易翻车——单纯看bbox移动方向会误判转弯车辆。本项目采用车道线参考系建模先用cv2.fitLine()拟合车道线得到方向向量lane_vec (vx, vy)对每个track计算其最近10帧轨迹向量track_vec (dx, dy)计算夹角余弦cos_theta (lane_vec · track_vec) / (|lane_vec| * |track_vec|)若cos_theta -0.7即夹角135°判定为逆行# lane_detector.py 片段需配合config/lane_lines.json def detect_anti_direction(self, track): if len(track.history) 10: return False # 取最近10帧首尾坐标计算track_vec start track.history[-10] end track.history[-1] track_vec (end[0]-start[0], end[1]-start[1]) # 归一化 norm np.sqrt(track_vec[0]**2 track_vec[1]**2) if norm 0: return False track_vec (track_vec[0]/norm, track_vec[1]/norm) # 计算与车道线夹角余弦 cos_theta track_vec[0]*self.lane_vec[0] track_vec[1]*self.lane_vec[1] return cos_theta -0.7self.lane_vec由config/lane_lines.json中预标定的两点计算得出cos_theta -0.7对应夹角≈135°留出15°容错避免急转弯误报4. 避坑指南YOLOv5DeepSORT联调中最常踩的5个深坑及血泪解法4.1 现象DeepSORT tracker.update()返回空列表控制台无报错但画面无跟踪框原因YOLOv5检测输出pred格式错误。官方YOLOv5输出为[x1,y1,x2,y2,conf,cls]但部分魔改版返回[x1,y1,x2,y2,conf,cls,angle]带旋转角导致DeepSORT解析失败。解决检查models/common.py中non_max_suppression函数返回值维度强制截断至6列# 在detect.py中pred赋值后添加 pred pred[:, :6] # 确保只有6列x1,y1,x2,y2,conf,cls4.2 现象车辆ID频繁切换ID跳变同一辆车在不同帧显示不同track_id原因DeepSORT的max_age参数过小默认70帧或n_init初始化帧数过大默认3帧。当车辆短暂遮挡超过max_agetracker会删除track重新检测后新建ID。解决在tracker.py初始化处修改self.tracker DeepSort( max_age120, # 增加至120帧4秒30fps n_init2, # 减少至2帧更快确认新目标 nn_budget100 # 特征库容量避免特征覆盖 )4.3 现象违停检测总在非停车区触发或停车区完全不报警原因config/parking_zones.json中的坐标是相对于原始视频分辨率如1920x1080定义的但YOLOv5推理时将图像resize为640x640导致坐标失配。解决在vehicle_analyzer.py中添加坐标缩放# 获取原始视频宽高 cap cv2.VideoCapture(args.source) orig_w, orig_h int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 将JSON中坐标按比例缩放 scaled_parking_zone [(int(x*640/orig_w), int(y*640/orig_h)) for (x,y) in parking_zone_coords]4.4 现象逆行检测对左转车辆误报率高但直行车辆漏报原因车道线方向向量lane_vec未归一化导致点积计算受长度影响且未过滤低置信度trackconf 0.5的track轨迹噪声大。解决在detect_anti_direction函数开头添加if track.conf 0.5: # 过滤低置信度track return False # 归一化lane_vec lane_norm np.sqrt(self.lane_vec[0]**2 self.lane_vec[1]**2) if lane_norm 0: self.lane_vec (self.lane_vec[0]/lane_norm, self.lane_vec[1]/lane_norm)4.5 现象Docker容器内摄像头无法打开报错cv2.error: OpenCV(4.5.5) ... VIDEOIO(CV_IMAGES): raised unknown exception!原因Ubuntu 22.04默认使用Wayland显示协议而OpenCV的cv2.VideoCapture(0)依赖X11。解决启动容器时强制使用X11# 先获取X11 socket权限 xhost local:root # 启动容器时挂载X11 docker run --gpus all -it --rm \ -e DISPLAY$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --device/dev/video0:/dev/video0 \ yolov5-deepsort-vehicle5. 进阶技巧如何用这套代码快速适配自己的数据集与业务场景5.1 把YOLOv5训练好的权重无缝接入.pt到.onnx再到TensorRT的三步压缩项目默认使用yolov5s.pt但你的毕设需要部署到Jetson Nano必须做模型压缩。不要直接用export.py导出ONNX——它会保留Focus层导致TensorRT解析失败。正确流程Step 1替换Focus层为ConvSlice关键修改models/yolo.py中Focus类将其forward改为def forward(self, x): # 替换原Focus实现避免TensorRT不支持 return torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)Step 2导出ONNX并校验python export.py --weights yolov5s.pt --include onnx --img 640 --batch 1 # 校验ONNX python -c import onnx; onnx.load(yolov5s.onnx)Step 3TensorRT引擎生成Jetson专用# 安装tensorrt-python pip install nvidia-tensorrt # 生成engine trtexec --onnxyolov5s.onnx --saveEngineyolov5s.engine --fp16注意trtexec命令需在Jetson设备上运行且--fp16开启半精度可提升3倍吞吐量。5.2 用.gitignore精准控制模型与数据集上传边界项目根目录的.gitignore已预设关键规则但极易被忽略# 必须忽略的敏感项 *.pt *.pth *.engine outputs/ datasets/ # 但要保留配置文件 !config/*.json !config/rois.json*.pt防止上传训练好的模型体积大且含权重outputs/避免提交检测视频可能含隐私车牌!config/*.json显式取消忽略确保ROI、停车区等业务配置可Git同步血泪经验曾有同学提交yolov5s.pt导致仓库体积超2GB被GitHub限流。从那以后我每次git add .后必执行git status --ignored # 查看哪些被忽略 git check-ignore -v yolov5s.pt # 验证忽略规则生效5.3 信息栏控制功能的底层实现OpenCV文字渲染的抗锯齿与透明度技巧项目中右下角的信息栏显示车流量/违停数/逆行数不是用cv2.putText()硬画而是用半透明背景抗锯齿字体# utils/plots.py 片段 def draw_info_panel(self, img, info_dict): # 创建半透明背景层 overlay img.copy() cv2.rectangle(overlay, (10, 10), (300, 120), (0,0,0), -1) cv2.addWeighted(overlay, 0.6, img, 0.4, 0, img) # 60%透明度 # 使用抗锯齿字体需提前加载 font cv2.FONT_HERSHEY_SIMPLEX for i, (k,v) in enumerate(info_dict.items()): text f{k}: {v} cv2.putText(img, text, (20, 4030*i), font, 0.7, (0,255,0), 2, cv2.LINE_AA)cv2.addWeighted()实现背景透明叠加避免文字压盖画面cv2.LINE_AA启用抗锯齿文字边缘不发虚字体大小0.7和行距30经实测在1080p下最佳可读性从那以后我每次新增UI元素都强制走一遍cv2.addWeighted流程哪怕只是画个框——因为用户第一眼看到的是界面不是算法指标。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

逻辑器件输出电阻对串联电阻设计与LED限流功耗的影响
逻辑器件输出电阻对串联电阻设计与LED限流功耗的影响

/* 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 2:11:03

IT66631深度解析:HDMI 2.0双路输出的协议级再生架构
IT66631深度解析:HDMI 2.0双路输出的协议级再生架构

/* 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 2:11:03

ESP32-C3 JTAG调试为何必须用ESP-Prog
ESP32-C3 JTAG调试为何必须用ESP-Prog

/* 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 2:10:57

Python搭建QQ聊天机器人极简教程
Python搭建QQ聊天机器人极简教程

随着QQ粉丝群管理需求的不断增长,简单的群管工具难以满足复杂的信息响应和自动化需求。现有的自动回复机器人虽然功能强大,但其高昂的年费成为不少用户的顾虑。因此,通过搭建一个自定义机器人来实现自动回复,成为解决这一问题的有效途径。 基于此需求,本文介绍了使用go-c… · 2026/9/28 2:14:08

Python整理百度云盘文件大量重复无用文件
Python整理百度云盘文件大量重复无用文件

百度云盘容量有限,当文件数量逐渐增多,空间很容易被填满。删除重复文件可以帮助释放大量空间。通过获取云盘缓存目录并使用Python脚本来整理数据,可以高效识别重复文件并避免手动操作的繁琐。 此方法基于 sqlite3 和 pandas 进行数据处理,简单快捷。 文章目录 云盘数据整理… · 2026/9/28 2:14:07

Python实现将图片转化为具有视觉震撼效果的字符图
Python实现将图片转化为具有视觉震撼效果的字符图

字符画是一种将图片转化为字符的艺术表现形式,它通过字符的密度和排列来模拟图片的色彩和形状效果。这种技术不仅在视觉上充满了创造力,还在文字处理领域展示了字符的丰富表现力。通过Python,可以将图片转换为字符画,生成具有视觉冲击力的字符艺术。 本文将通过具体步骤和… · 2026/9/28 2:13:48

Python实现将目录下的图片合并成PDF文件
Python实现将目录下的图片合并成PDF文件

在图像处理和文档管理中,经常需要将一系列图片文件合并为PDF格式,以便于传输、存档和阅读。Python凭借其丰富的第三方库,为图像处理和PDF操作提供了便捷的解决方案。 本文将详细介绍如何通过Python脚本,将目录中的所有图片合并为一个PDF文件,内容包括从基础环境配置到代码… · 2026/9/28 2:13:48

Python实现文件移动到指定文件夹
Python实现文件移动到指定文件夹

在编程过程中,经常需要对文件进行整理和管理,将不同类型的文件分类存放在指定文件夹中。Python提供了强大的文件操作模块,使得文件的移动操作变得简单高效。这篇教程将详细讲解如何使用Python实现将文件移动到指定文件夹的功能,帮助理解并掌握文件操作的基本方法和常见应用… · 2026/9/28 2:13:47

【PyQt】PyQT6制作一个Django项目启动器
【PyQt】PyQT6制作一个Django项目启动器

在现代的桌面和Web应用开发中,Python以其简单高效的特点获得了广泛的应用。通过集成PyQt和Django框架,将桌面应用的便捷操作与Django项目的后端处理相结合,不仅能够提升用户体验,更能显著提高开发的便利性和效率。 本文将聚焦于如何构建一个基于PyQt的Django项目启动器,实… · 2026/9/28 2:13:40

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码