YOLOv5道路目标检测-识别-计数一体化实战指南

发布时间:2026/9/10 16:16:19
YOLOv5道路目标检测-识别-计数一体化实战指南 简介本资源是一套基于YOLOv5的端到端道路车辆与行人检测识别计数系统面向计算机、人工智能及相关专业本科生毕业设计、课程设计及项目实战学习者解决交通场景下目标检测、跟踪与实时计数的核心任务。压缩包共78个文件含50个Python源码如main.py、detector.py、tracker.py、6个YOLO配置yaml文件yolov5s/m/l/x.yaml、5个XML标注样本、3个Shell脚本含push.sh、2个JPG示例图及1个MP4测试视频辅以requirements.txt、使用说明.txt和Dockerfile等工程化支持文件整体82.69MB结构清晰、模块解耦。已有442人学习下载资源经严格调试提供预训练模型yolov5m.pt、完整数据处理与推理流程、DeepSORT多目标跟踪集成及可视化计数结果开箱即用无需额外配置即可运行演示。1. 这不是“跑通YOLOv5”的演示而是面向真实道路场景的检测-识别-计数闭环系统你下载的这个.zip文件表面看是“YOLOv5源码模型文档”但实际封装了一个可直接部署到交通监控、智慧园区或校园安防场景的轻量级视觉分析流水线。它不依赖云端API不调用第三方服务所有逻辑在本地完成从视频流或图像帧中定位车辆与行人检测区分小轿车、卡车、自行车、成人、儿童等细粒度类别识别并按时间窗口/区域/类型持续统计数量计数。这套方案避开复杂工程链路——没有K8s编排、不对接消息队列、不集成GIS地图只用OpenCV PyTorch NumPy三件套在普通笔记本GTX 1650起步或边缘设备Jetson Nano/Orin上即可实现实时推理30 FPS640×480。适合两类人一是毕设/课设学生需要可交付、可答辩、可展示完整工作流的项目二是中小项目现场工程师需快速验证算法效果、调试参数、生成带标注的统计报表。它不教你怎么从零训练YOLOv5而是告诉你当模型已存在、数据已标好、硬件已就位时如何让“检测框”真正变成“可读数字”。2. 用YOLOv5s-v6.1模型在本地跑通最小检测流水线2.1 为什么选YOLOv5s而非YOLOv8或YOLOv11当前压缩包内模型基于YOLOv5官方v6.1版本非v7或v8核心原因在于部署确定性v6.1的ONNX导出兼容性极佳TensorRT 8.4/8.6均可无损优化其COCO预训练权重在道路场景泛化强尤其对遮挡车辆、远距离行人且PyTorch 1.12生态对其torch.hub加载、model.eval()、torch.no_grad()支持最成熟。相比之下YOLOv8虽新但其Ultralytics库默认启用AMP和autocast在老旧GPU驱动下易触发CUDA context errorYOLOv11尚未发布稳定版。本系统采用yolov5s.pt14.2MB兼顾速度~45 FPS on GTX 1650与精度mAP0.556.2 on COCO val2017是道路场景落地的“甜点模型”。2.2 解压后目录结构与关键文件定位解压.zip得到标准YOLOv5工程目录road_counting/ ├── models/ # 模型定义yolov5s.yaml ├── weights/ # 预训练权重yolov5s.ptCOCO通用 road_best.pt本项目微调 ├── detect.py # 主检测脚本含计数逻辑 ├── utils/ # 工具模块plots.py绘图、general.pyNMS、metrics.py评估 ├── data/ # 数据配置road.yaml定义classes: [car,truck,bus,person,bicycle] ├── README.md # 说明文档含环境要求、命令示例、参数说明 └── requirements.txt # 依赖清单明确指定torch1.12.1cu113, opencv-python4.8.0提示road_best.pt是作者在BDD100KUA-DETRAC道路数据集上微调后的权重比原始yolov5s.pt对“侧方停车车辆”、“雨天模糊行人”召回率高12.7%。使用前务必确认detect.py中weightsweights/road_best.pt路径正确。2.3 最小可运行命令与参数解析在road_counting/根目录执行以下命令启动单帧检测并显示计数结果python detect.py --source test_videos/highway.mp4 \ --weights weights/road_best.pt \ --data data/road.yaml \ --conf 0.4 \ --iou 0.5 \ --save-txt \ --save-conf \ --line-thickness 2--source支持*.mp4、*.avi、0USB摄像头、path/to/images/批量图片--conf 0.4置信度阈值。道路场景推荐0.35~0.45——低于0.3易出误检如广告牌误判为车高于0.5漏检率陡增尤其远距离行人--iou 0.5NMS IoU阈值。保持0.5是YOLOv5默认值若目标密集如拥堵路段可降至0.45提升框分离度--save-txt生成runs/detect/exp/labels/下每帧的.txt标注文件格式class_id center_x center_y width height conf--save-conf在输出图像上叠加置信度数值非仅画框输出结果解读运行后生成runs/detect/exp/目录其中exp/含带红框标注的视频帧截图image0.jpg,image1.jpg...exp/labels/对应.txt文件每行代表一个检测目标例如0 0.421 0.632 0.185 0.291 0.873→class_id0(car),x_center0.421,y_center0.632,width0.185,height0.291,conf0.873exp/counts.csv关键输出每秒统计表含timestamp, car, truck, bus, person, bicycle, total七列3. 从检测到计数三步实现区域化、时段化、分类化统计3.1 计数逻辑嵌入detect.py的核心修改点原生YOLOv5detect.py仅输出检测框本项目在run()函数末尾插入计数模块关键代码段如下detect.py第328行起# detect.py 片段计数统计逻辑 if save_txt and not webcam: # 仅对视频/图片启用计数 # Step1: 加载预定义ROI区域多边形坐标 roi_poly np.array([[100, 300], [500, 300], [600, 480], [0, 480]]) # 示例画面底部车道区 # Step2: 对当前帧所有检测框判断中心点是否在ROI内 for *xyxy, conf, cls in reversed(det): # det: [x1,y1,x2,y2,conf,cls_id] c1, c2 (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])) center_x (c1[0] c2[0]) // 2 center_y (c1[1] c2[1]) // 2 if cv2.pointPolygonTest(roi_poly, (center_x, center_y), False) 0: class_name names[int(cls)] # names [car,truck,bus,person,bicycle] count_dict[class_name] 1 # Step3: 写入CSV每帧写一行含时间戳和各类别计数 with open(f{save_dir}/counts.csv, a) as f: f.write(f{time.time():.3f},{count_dict[car]},{count_dict[truck]},{count_dict[bus]},{count_dict[person]},{count_dict[bicycle]},{sum(count_dict.values())}\n)roi_poly定义兴趣区域Region of Interest此处为四边形车道区。实际部署需用cv2.polylines()在视频首帧手动绘制并保存坐标cv2.pointPolygonTest()高效判断点是否在多边形内O(1)复杂度比遍历所有像素快10倍以上counts.csv以时间戳为索引支持后续用Pandas做滚动平均如每30秒均值、趋势分析如早高峰车流峰值3.2 支持多ROI与跨帧去重的进阶计数策略单纯“框中心在ROI内”会因车辆移动导致同一辆车被重复计数如车头进入→车身全入→车尾离开。本系统提供两种防重方案方案A基于Kalman滤波的轨迹跟踪轻量级启用--track参数后调用utils.tracker.sort.Sort()SORT算法为每个目标分配唯一ID并记录其历史轨迹python detect.py --source test_videos/crossroad.mp4 \ --weights weights/road_best.pt \ --data data/road.yaml \ --conf 0.35 \ --iou 0.45 \ --track \ --save-txt \ --line-thickness 2输出runs/detect/exp/tracks/下.txt文件每行格式frame_id, track_id, x1, y1, x2, y2, conf, cls_id, unused, unused计数时仅统计首次进入ROI的track_id避免重复计数方案B基于IoU的帧间匹配无额外依赖若不希望引入SORT依赖可在detect.py中添加简易匹配逻辑# 在循环检测框前初始化prev_boxes [] for *xyxy, conf, cls in reversed(det): curr_box np.array([*xyxy]) # 计算与上一帧所有框的IoU ious [bbox_iou(curr_box, prev) for prev in prev_boxes] if max(ious) 0.3: # IoU0.3视为新目标 # 执行ROI判断与计数 ... prev_boxes [np.array([*xyxy]) for *xyxy, conf, cls in reversed(det)]注意此方案计算开销略高但完全免依赖适合资源受限边缘设备。3.3 统计结果可视化生成带时间轴的折线图utils/plots.py新增plot_counts_csv()函数自动读取counts.csv并绘制def plot_counts_csv(csv_path, output_pathcounts_plot.png): df pd.read_csv(csv_path, names[timestamp,car,truck,bus,person,bicycle,total]) df[time_min] (df[timestamp] - df[timestamp].iloc[0]) / 60 # 转换为分钟 plt.figure(figsize(12,6)) for col in [car,truck,bus,person,bicycle]: plt.plot(df[time_min], df[col], labelcol, linewidth2) plt.xlabel(Time (minutes)) plt.ylabel(Count) plt.title(Vehicle Pedestrian Counting Over Time) plt.legend() plt.grid(True) plt.savefig(output_path, dpi300, bbox_inchestight) plt.close()执行python utils/plots.py --csv runs/detect/exp/counts.csv即生成高清统计图可直接用于汇报材料。4. 模型微调用自定义道路数据集训练road_best.pt4.1 数据准备规范LabelImg标注YOLO格式转换本系统要求输入数据严格遵循YOLO格式图像images/train/xxx.jpg,images/val/xxx.jpg标注labels/train/xxx.txt,labels/val/xxx.txt每行格式class_id center_x center_y width height归一化到0~1关键约束✅class_id必须与data/road.yaml中names:顺序一致0car, 1truck, 2bus, 3person, 4bicycle❌ 不允许空行、负坐标、宽高超1.0、center_x±width/2越界提示使用labelImg标注时务必在Auto Save mode下勾选Use automatic saving of annotations并设置Save As格式为YOLO。标注完成后用utils/general.py中convert_labels()函数校验格式。4.2 训练命令与超参数调优指南在road_counting/目录执行python train.py --data data/road.yaml \ --weights weights/yolov5s.pt \ --cfg models/yolov5s.yaml \ --epochs 100 \ --batch-size 16 \ --img 640 \ --name road_finetune \ --cache \ --workers 4--cache将图像缓存到RAM加速IO需≥32GB内存--workers 4DataLoader进程数设为CPU核心数一半i5-10400F建议设4i7-11800H建议设6--img 640输入尺寸。道路场景推荐640平衡细节与速度若需检测小目标如远处行人可试--img 1280显存需≥12GB关键超参数调整表参数默认值道路场景推荐值作用说明lr0(初始学习率)0.010.005避免微调时破坏COCO预训练特征lrf(终学习率比例)0.20.1确保最后10轮学习率足够低稳定收敛mosaic1.00.5Mosaic增强对道路场景增益有限降低比例减少伪影mixup0.00.1少量mixup提升遮挡目标鲁棒性如树荫下车辆scale(缩放增强)0.50.3道路目标尺度变化小降低缩放幅度修改方式编辑models/yolov5s.yaml同级目录下的hyp.scratch-low.yaml或直接在train.py中覆盖--hyp参数。4.3 验证训练效果mAP与FPS双指标评估训练完成后runs/train/road_finetune/下生成results.csv每epoch的Box(P),Box(R),Box(mAP0.5),Box(mAP0.5:0.95)val_batch0_pred.jpg验证集首批预测效果可视化weights/best.pt最佳权重mAP最高必须验证的两项指标mAP0.5应≥58.0对比原始yolov5s.pt的56.2FPS在目标设备上实测命令python detect.py --source test_videos/test1.mp4 --weights runs/train/road_finetune/weights/best.pt --device 0 --half--half启用FP16推理GTX 1650上提速约1.8倍从25→45 FPS若FPS下降检查--img尺寸是否过大或--batch-size是否超出显存5. 边缘部署与实时性能调优Jetson Nano实测参数配置5.1 TensorRT加速将PyTorch模型转为引擎文件在Jetson NanoUbuntu 18.04 JetPack 4.6上将road_best.pt转为TensorRT引擎# 1. 导出ONNX主机端x86环境 python export.py --weights weights/road_best.pt --include onnx --opset 12 # 2. 在Nano上构建TensorRT引擎需安装tensorrt8.2.5.1 trtexec --onnxyolov5s.onnx \ --saveEngineyolov5s.engine \ --fp16 \ --workspace2048 \ --minShapesinput:1x3x640x480 \ --optShapesinput:4x3x640x480 \ --maxShapesinput:8x3x640x480--fp16强制FP16精度Nano上推理速度提升2.3倍对比FP32--workspace2048分配2GB显存用于优化避免编译失败--min/opt/maxShapes定义动态batch size范围适配不同负载5.2 Nano端推理代码精简绕过PyTorch依赖detect_trt.py替代原detect.py直接加载TensorRT引擎import pycuda.autoinit import pycuda.driver as cuda import tensorrt as trt import numpy as np class TRTYOLOv5: def __init__(self, engine_file): self.runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) with open(engine_file, rb) as f: self.engine self.runtime.deserialize_cuda_engine(f.read()) self.context self.engine.create_execution_context() # 分配GPU显存buffer省略细节 def infer(self, img_np): # img_np: (3,640,480) float32 # cudaMemcpy H2D → execute → cudaMemcpy D2H return detections # shape: (N, 6) [x1,y1,x2,y2,conf,cls_id] # 使用示例 detector TRTYOLOv5(yolov5s.engine) cap cv2.VideoCapture(csi://0) # 直接读取CSI摄像头 while cap.isOpened(): ret, frame cap.read() if not ret: break frame_resized cv2.resize(frame, (480,640)).transpose(2,0,1) # CHW dets detector.infer(frame_resized) # 后处理NMS、ROI计数同detect.py逻辑此方案完全移除PyTorch依赖仅需tensorrt、pycuda、opencv-python三库Nano实测640×480输入FPS达21.3对比PyTorch原生12.7 FPS5.3 CPU-only模式应急方案OpenVINO量化压缩若无GPU可用OpenVINO将模型转为INT8# 安装openvino-dev2022.3.0 python mo.py --input_model yolov5s.onnx \ --data_type FP16 \ --input_shape [1,3,640,480] \ --output_dir openvino_ir/ \ --reverse_input_channels # 量化需校准数据集 pot -c pot_config.jsonpot_config.json需指定stat_subset_size: 200校准图像数量化后模型体积减小58%CPU推理速度提升3.1倍i5-8250U实测精度损失mAP0.5下降≤1.2%仍在道路场景可用范围内6. 故障排查五类高频报错与对应解决指令6.1 “CUDA out of memory” —— 显存不足的精准定位当detect.py报此错不要盲目调小--batch-size先执行诊断# 查看GPU显存占用实时 nvidia-smi --query-compute-appspid,used_memory --formatcsv # 检查PyTorch缓存 python -c import torch; print(torch.cuda.memory_summary()) # 强制释放缓存在detect.py开头添加 import gc gc.collect() torch.cuda.empty_cache()根本解法在detect.py中设置torch.backends.cudnn.benchmark False禁用cudnn自动优化可降低显存峰值15%临时解法加--device cpu强制CPU推理速度降为1/10但能跑通6.2 “ModuleNotFoundError: No module named utils.plots” —— 路径导入错误此错表明Python未将road_counting/设为工作目录。必须在项目根目录执行命令cd /path/to/road_counting # 确保在此目录 python detect.py --source ... # 此时utils可被正确导入若用IDEPyCharm/VSCode需在运行配置中设置Working directory为项目根路径禁止在子目录如/road_counting/utils/下执行否则from utils.plots import *会失败6.3 视频输出无计数框/空白CSV —— ROI坐标未生效检查detect.py中roi_poly定义是否被注释或路径错误# 错误写法坐标未更新 roi_poly np.array([[0,0], [100,0], [100,100], [0,100]]) # 覆盖整个画面左上角100x100 # 正确写法用实际视频分辨率 cap cv2.VideoCapture(source) w, h int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) roi_poly np.array([[int(0.1*w), int(0.6*h)], [int(0.9*w), int(0.6*h)], [int(0.9*w), int(0.9*h)], [int(0.1*w), int(0.9*h)]])建议先用cv2.imshow()显示ROI区域确认覆盖目标车道后再运行计数6.4counts.csv时间戳乱序 —— 多线程写入冲突当启用--device 0,1多GPU时多个进程同时写counts.csv会导致时间戳错乱。必须加文件锁# 在写CSV前添加 import threading csv_lock threading.Lock() # 写入时 with csv_lock: with open(f{save_dir}/counts.csv, a) as f: f.write(f{time.time():.3f},...\n)单GPU无需此操作多GPU必加锁6.5 检测框全部偏右/偏下 —— 图像预处理尺寸不匹配若输出框位置系统性偏移检查detect.py中letterbox()调用# 确保resize后pad方式一致 img letterbox(img0, new_shapeimgsz, autoTrue, stride32)[0] # autoTrue自动pad # 错误img cv2.resize(img0, (640,480)) # 无pad导致坐标映射错误letterbox函数在utils.general.py中其autoTrue保证长边缩放到imgsz短边pad至32整数倍是YOLOv5坐标映射正确的前提本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询