尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于深度学习的交通流量检测系统:从YOLO训练到跟踪计数实战

基于深度学习的交通流量检测系统:从YOLO训练到跟踪计数实战 简介本资源是一套面向计算机、电子信息工程及人工智能方向本科生的毕业设计与课程设计实战项目聚焦交通流量检测这一典型视觉感知任务提供基于深度学习的端到端解决方案。项目采用CNN等主流模型实现车辆识别与计数支持日间、夜间及雨天等多场景鲁棒检测并集成数据存储、可视化展示与历史分析能力适用于智能交通系统开发、城市交通态势研判等实际应用场景。压缩包共2000个文件以1411个JavaScript文件含ECharts可视化脚本、前端交互逻辑、415个Markdown文档含环境配置、模型训练说明、实验记录、171个JSON配置与数据文件为主辅以HTML/CSS构建本地Web界面整体大小为132.42MB。目前已有56人学习下载资源结构清晰、模块解耦合理包含完整训练流程、前后端联调示例及可直接运行的演示界面特别适合初学者理解深度学习落地全流程也便于进阶者二次开发与算法优化。 选这个题目之前我以为就是拿个现成模型跑一跑把视频丢进去车流量数字就出来了。真正动手做才发现模型训练只是最基础的一环数据标注、环境配置、跟踪计数、集成演示每一步都能卡你三天。这篇就把我做“基于深度学习的交通流量检测系统”的全过程包括技术选型、环境搭建、训练调优、计数实现和踩坑记录一次性说清楚。如果你是准备拿这个题做毕设或课设的同学或者对智能交通方向的深度学习实战刚入门这篇应该能帮你省不少时间。1. 项目整体设计与思路拆解1.1 先搞清楚这个系统要交付什么交通流量检测这个事直白地说就是通过摄像头画面自动识别路上的车辆按时间段统计出车流量比如每分钟多少辆、一个小时内哪个方向车辆多。毕设和课设里通常还会要求可视化比如在视频画面上画出检测框实时显示计数最后生成统计报告评分老师一看就知道你做的是什么。我调研过很多相似题目的公开资料大部分人都把精力放在了“车辆检测”这一环但真正容易出彩的地方其实是“流量统计”。检测只是手段统计才是题目里的核心交付物。所以我在一开始就定了三个目标第一能在实时视频流中稳定检测出车辆画框准确第二能对检测到的车辆做跨帧跟踪不重复计数第三能按方向、按时间段输出统计结果最好再有可视化图表。系统整体流程可以概括为视频帧输入 - 目标检测模型识别车辆 - 多目标跟踪分配ID - 虚拟检测线计数 - 结果叠加显示并导出统计。这个流程在业界也叫“检测-跟踪-计数”Pipeline很多智能交通产品就是这么做的只是工程规模更大。1.2 技术选型为什么要用深度学习目标检测我最早纠结过传统图像处理方案比如背景差分、光流法、Haar分类器之类的。背景差分对固定摄像头、无遮挡场景挺有效的但一遇到光照变化、车辆慢速移动效果就开始飘。光流法对小目标很敏感噪声一大就乱跳。Haar分类器更适合人脸做车辆检测误检率比较高。后来还是决定用深度学习目标检测核心原因有两个一是泛化能力强训练好的模型在不同路口、不同时段都能保持相对稳定的效果二是周边生态成熟踩坑资料多。模型层面我在YOLOv5和YOLOv8之间犹豫过。YOLOv5的轮子多很多数据转换工具和教程都基于它出了奇奇怪怪的问题能在网上找到答案YOLOv8的API更友好检测精度也更高但当时有些第三方组件还不兼容。考虑到我的NVIDIA显卡只有6GB显存最后选了YOLOv5s作为主力模型在GTX 1660上能跑到80帧以上做实时检测绰绰有余。如果你算力好一点直接上YOLOv8m甚至YOLOv8l效果会更好。2. 数据准备与预处理细节2.1 数据集选择与标注格式转换深度学习训练离不开数据。公开的交通检测数据集里UA-DETRAC很经典是在多个路口用固定摄像机录的包含8250个视频帧、140万辆车标注了车辆包围框还有遮挡和天气变化。BDD100K的数据量更大包含10万张图片覆盖白天夜晚、晴天雨天更贴近真实场景。我最后选了UA-DETRAC做训练因为它的拍摄视角和我的测试场景最接近都是高位摄像头俯拍路口。UA-DETRAC的标注是XML格式而YOLO训练需要的是txt格式每行是“类别 x_center y_center width height”。我写了几行Python把XML坐标转成YOLO坐标这里有个大坑XML里的坐标是左上角xy和右下角xy转YOLO时要先计算宽高再除以图片宽高做归一化。很多人初次转换时忘了归一化训练时loss直接飞掉。import xml.etree.ElementTree as ET import os def convert_xml_to_yolo(xml_path, save_dir, img_width, img_height): tree ET.parse(xml_path) root tree.getroot() labels [] for obj in root.findall(object): name obj.find(name).text box obj.find(bndbox) x_min float(box.find(xmin).text) y_min float(box.find(ymin).text) x_max float(box.find(xmax).text) y_max float(box.find(ymax).text) x_center (x_min x_max) / 2.0 / img_width y_center (y_min y_max) / 2.0 / img_height width (x_max - x_min) / img_width height (y_max - y_min) / img_height labels.append(f0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) with open(os.path.join(save_dir, os.path.basename(xml_path).replace(.xml, .txt)), w) as f: f.write(\n.join(labels))转换完我会用OpenCV把标注框画回去一帧一帧检查确认框和车辆贴合、没有错位才放心拿去训练。这一步很花时间但能避免很多后续问题。2.2 数据增强与小样本问题训练集里白天晴天场景多夜晚、雨天少模型容易过拟合到“看起来清晰”的图像。为了解决这个问题我在数据加载阶段开启了YOLOv5自带的Mosaic增强、随机翻转、HSV扰动和MixUp。Mosaic把四张图拼成一张一是变相扩大batch二是让模型学会检测被裁切、被遮挡的物体对密集车辆场景特别有用。另一个容易被忽略的点是类别不平衡。我的数据里轿车占绝大多数卡车和公交车很少所以我在loss权重里给稀有类别稍微加了一点权重或者采用重复采样的方式让模型多看到这些类别。还加了两类特殊负样本完全没有车辆的空道路视频帧。这是为了告诉模型“道路上没有车的时候不要瞎画框”对降低误检非常有帮助。3. 环境配置与模型训练实战3.1 Ubuntu 22.04下深度学习环境搭建从显卡驱动到PyTorch第一次配深度学习环境最容易卡在NVIDIA驱动和CUDA上。我用的是Ubuntu 22.04装驱动时“安装了没反应”的情况也碰到过。总结下来稳妥流程是先查看显卡支持的驱动版本可以用ubuntu-drivers devices命令然后通过命令行安装推荐的nvidia-driver-535装完重启后执行nvidia-smi确认GPU被识别。如果输出了驱动信息但显示CUDA Version不是你要的版本没关系驱动自带CUDA兼容层PyTorch的CUDA toolkit会随pip包一起安装不需要单独装全套CUDA。真正要留意的是系统PATH和gcc版本避免后续编译扩展模块时踩坑。然后我用Anaconda创建了py310环境在PyTorch官网选对应的安装命令比如pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118。装完跑一下torch.cuda.is_available()返回True环境就通了。这里面有个特别常见的坑显卡驱动装完后系统黑屏或者循环登录很多情况是Secure Boot没关或者nouveau没禁用。Ubuntu 22.04默认开了Secure Boot装第三方驱动必须信任签名我在BIOS里关掉Secure Boot再装一次就过了。还有一次执行sudo ubuntu-drivers autoinstall后nvidia-smi提示找不到命令其实是DKMS模块没加载重启后才行。3.2 训练参数怎么调训练过程怎么看YOLOv5的训练入口是train.py参数看起来很多但核心就那几个。我最初用的配置是img 640batch 16epochs 100optimizer SGDlr0 0.01。6GB显存跑YOLOv5sbatch 16勉强够如果显存不够就降低batch大小并配合梯度累积保证等效batch不变。训练过程中要盯住两个东西一个是loss曲线另一个是mAP曲线。正常情况下训练集loss会稳步下降验证集mAP在前期快速上升后期缓慢增长。如果训练集loss降了但验证集mAP不涨大概率是过拟合我会早停或者用验证集上最优的权重如果loss降不下去优先检查标签框有没有错位再考虑降低学习率。如果你用YOLOv8训练命令更简洁yolo train datacustom.yaml modelyolov8n.pt epochs100 imgsz640 batch16另外预训练权重非常关键。直接用COCO预训练的yolov5s.pt作为起点比从零训练快很多。因为COCO里本来就有car、bus这些类模型已经具备底层特征提取能力我们要做的就是在自己的数据集上微调。训练完成后results.csv里记录了每一轮的各项指标我一般用验证集上mAP最高的那一轮权重而不是最后一轮。3.3 模型优化与效果评估训练完的模型要评估我用val.py在验证集上跑了mAP指标同时用推理脚本测了FPS。我的YOLOv5s模型mAP0.5能到86%左右mAP0.5:0.95在58%左右单张GTX 1660上推理速度约12ms实时性没问题。如果你的项目强调性能优化可以进一步做模型剪枝或TensorRT加速。剪枝是把不重要的通道去掉模型体积和显存占用明显下降但精度会波动需要重训练微调。TensorRT是更直接的加速方案把PyTorch模型转换成engine格式推理时间能缩短一半以上。不过毕设一般做到精度和速度均衡即可不要花太多时间在部署优化上。更重要的是把检测结果用起来做成一个完整的统计系统这比单纯刷高mAP更有说服力。4. 车流量统计与系统集成4.1 目标跟踪从IoU匹配到DeepSORT检测模型只能给出单帧的车辆框但“流量”是一个时间维度上的统计。一辆车在第20帧和第30帧都被检测到如果每帧都计数就会重复计算所以需要一个跟踪模块为同一辆车分配稳定的ID。最简单的入门方案是跨帧IoU匹配把当前帧检测框和上一帧已有轨迹做IoU矩阵用匈牙利算法做匹配IoU低于阈值的认为是新车辆。这种方法在固定摄像头、车流不密集的情况下够用。如果再往上提升可以用DeepSORT它结合了运动信息和外观特征遮挡后恢复ID的能力更强。我在毕设里先实现了IoU匹配后面为了精度升级到DeepSORT跟踪ID稳定了不少车辆被遮挡几帧后回来还能保持同一个ID。用DeepSORT时要注意特征提取模型的选择。它自带的ReID模型是在行人数据集上训练的直接拿来提取车辆外观特征效果一般。我后来换了一个在VehicleID上训练过的车辆ReID模型ID切换的次数明显减少。如果你的场景是课设用IoU匹配就足够讲清楚原理不一定非要上DeepSORT。4.2 虚拟线/虚拟线圈计数逻辑我用了“虚拟检测线”来计数。具体是在视频帧的特定位置画一条横线当检测框的底部中心点第一次跨过这条线时对计数器加一。这个逻辑很直观但容易踩坑车辆在跟踪ID出现抖动时底部中心点可能在线的两侧来回跳导致一辆车被反复计数。解决办法是为每个跟踪ID维护一个状态记录它是否已经计数过同一个ID只计一次同时要求中心点必须沿同一方向穿越才计数。如果还要分方向统计可以用线的矢量做叉积判断车辆是从上方进入还是下方进入。另一个更稳的方案是设置虚拟线圈区域只有框中心落在矩形区域内的车辆才计数能减少边缘场景误判。我这里给一段简单的计数判断伪代码逻辑def is_cross_line(pre_point, cur_point, line_y): if pre_point[1] line_y and cur_point[1] line_y: return down # 从上往下穿过 elif pre_point[1] line_y and cur_point[1] line_y: return up # 从下往上穿过 return None实际使用时每个跟踪ID要保存上一个中心点只有方向一致且没有计过数才累加。4.3 视频流接入和结果可视化系统集成我用的是PythonOpenCV。主循环读视频帧把帧resize到640x640传入模型拿到检测结果后交给跟踪器再根据跟踪框更新计数器。结果要显示在视频画面上包括检测框、ID、当前总流量同时每隔几秒把统计数据写入CSV。为了方便答辩演示我写了一个Web版本用Flask起服务浏览器直接播放视频流。这个版本其实就是把OpenCV处理后的帧编码成JPEG通过multipart协议推送到前端工程量不大但演示效果比在本地窗口里跑好很多。评委老师可以自己在浏览器里点开看画面里有检测框、有计数数字体验感很强。代码结构上我建议分成几个模块detector.py负责模型加载和推理tracker.py负责跟踪counter.py负责计数逻辑main.py负责主流程。这样分工清晰答辩讲起来也好展开。5. 常见问题与排查技巧实录5.1 训练不收敛、loss为NaN的排查我训练时第一次遇到loss降到一定程度就不再下降验证集mAP停在60%上下。排查后发现是数据集里包含了一些完全没有车辆的背景帧模型一直在学“这个区域有没有物体”真车反而被忽略了。把这些背景帧筛掉后mAP立刻涨了5个百分点。另外如果出现loss为NaN大多是标签txt里出现了0或者负数或者bounding box的宽高算成了0。我写了个检查脚本遍历所有txt文件发现异常直接剔除。还有可能是学习率设得太大尤其是用Adam优化器时lr调到0.01以上很容易发散。SGD会稳一些但收敛慢需要配合warmup和余弦退火。5.2 漏检误检的优化方向漏检通常发生在小目标或夜间场景。YOLO对远距离小车的特征提取能力有限解决办法是把输入分辨率从640提高到1280精度明显提升但速度会下降。如果不想牺牲速度可以试试tiling策略把大图切成多个小块分别检测再合并结果。不过这个工程复杂度比较高课设阶段不推荐。误检则常常是数据里没见过的物体例如不常见的卡车、道路护栏被当成车辆。我在测试时发现模型把路灯杆当成车原因是训练数据里路灯和车辆的上下文经常一起出现模型学到了错误关联。解决办法是增加负样本加入一些只有背景没有车辆的视频帧同时调高置信度阈值比如从0.25调到0.45误检会明显减少。5.3 车流量计数不准怎么修复计数不准主要三种情况重复计数、漏计数、方向判断错误。重复计数我把跟踪器从IoU匹配换成了DeepSORT后大幅减少。漏计数很多时候是因为车流密集时检测框不稳定车辆ID在帧间跳变解决方案是把计数线放在车辆已经完整出现的位置而不是道路边缘同时在线两侧加了一个滞留区车辆在区域内连续若干帧稳定后才尝试穿越判断。方向判断错误则是叉积公式的坐标系没对齐。图像坐标系中y轴向下叉积算出来的符号可能和直觉相反我加了一个可视化箭头确认方向关系确认“从上往下”和“从下往上”各自对应哪个方向再写进计数逻辑。5.4 环境配置翻车记录再说几个环境配置的常见问题。Python版本太新会导致部分库没有预编译包比如Python 3.12装PyTorch没问题但装一些依赖会报错我建议还是用3.10最稳。装OpenCV时如果用opencv-python-headless没有GUI显示功能在服务器上运行没问题但在本地想要imshow窗口就必须装opencv-python。还有显卡驱动安装后运行nvidia-smi没问题但PyTorch仍然用不了GPU最常见原因是PyTorch版本是CPU版本。检查一下torch.__version__是否带cpu如果是就重装对应CUDA版本。如果你实在没有本地显卡租一台云GPU服务器也能跑流程完全一样只是数据上传下载稍微麻烦一点。6. 最后一点实操心得如果让我重新做一次这个题目我会把更多时间花在数据清洗和跟踪调优上而不是反复调模型结构。模型用现成的YOLO足够真正决定项目上限的是数据质量和计数逻辑的鲁棒性。另外答辩时不要只讲“我用了YOLO”要讲清楚为什么用YOLO、数据怎么处理、计数为什么这样设计踩过哪些坑又是怎么解决的。评委老师对完整的工程思维通常比单点技术更感兴趣。最后分享一个小技巧测试视频不要只挑晴天白天的故意找一段晚高峰的密集车流或者有车辆遮挡的片段用这些难例来展示你的系统会让项目显得更真实。再配合CSV导出的统计表和折线图整个课题的完成度会直接上一个台阶。本文还有配套的精品资源点击获取
返回列表