ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv7车辆行人检测实战:从5000张数据到模型部署

YOLOv7车辆行人检测实战:从5000张数据到模型部署 简介面向车辆行人检测方向开发者的YOLOv7完整方案包含训练好的权重、评估曲线与5000多张标注数据集可直接用于交通场景下person与car两类目标检测任务。基于PyTorch框架实现附带PR曲线、loss曲线等训练过程记录mAP达90%以上适合需要快速落地检测模型或学习YOLOv7训练流程的中高级开发者。包体共158个文件以Python脚本、yaml配置、ipynb notebook、jpg示例图为主并包含pt权重、xml/txt标签、训练日志及PDF说明整体约851MB。数据集的txt与xml两种标签分别存放在独立文件夹便于切换不同训练框架使用配套notebook还展示了TensorRT、ONNXRuntime动态批次推理等扩展用法。已有2489人学习下载。资源内权重、训练曲线、数据集、推理脚本一应俱全从数据准备到模型部署均覆盖能为复现实验或二次开发节省大量时间。1. YOLOv7车辆行人检测5000张数据足够练出能用的权重文件很多人第一次接触YOLOv7车辆行人检测时都会问同一个问题5000张数据真的够训练一个可用模型吗答案要分场景看。对于固定的交通监控视角、白天为主的道路场景5000张经过清洗的车辆行人数据配合预训练权重完全足够训练出mAP在0.7以上的模型但如果是多角度、多天气、多光照的开放道路这个数据量就需要配合强数据增强和迁移学习策略才能稳住精度。这篇文章会从数据集目录整理、标注格式转换、训练参数调优到模型推理部署讲一条完整路径。目标是让拿到练好的车辆行人检测模型的人能看懂权重文件怎么加载、推理脚本的参数怎么改也能用这份5000张的数据集自己复现一遍从训练到部署的全过程。2. YOLOv7的E-ELAN结构与车辆行人检测头的适配逻辑2.1 E-ELAN结构如何兼顾车辆和行人的尺度差异YOLOv7在骨干网络中使用了ELANEfficient Layer Aggregation Network的改进版本E-ELAN。传统残差结构是把输入直接跳连到输出而E-ELAN将特征图在通道维度上切分成多个分支每个分支执行不同次数的卷积堆叠最后拼接在一起。这个设计最直接的好处是不同分支拥有不同大小的感受野浅层分支保留边缘和纹理信息深层分支捕获语义信息。对应到车辆行人检测场景里画面中一个前方5米的行人可能占据200像素高度而路口的车辆在不同距离下宽度差异极大。E-ELAN的多分支特征聚合方式让网络在下采样过程中不会把中小目标的细节过早丢弃这比同等参数量的传统残差网络更适合两类目标同时检测。从计算角度分析E-ELAN还在模型推理时引入了重参数化Reparameterization技巧。训练时使用多分支结构来增强梯度传播部署时将多个卷积层合并为单个3×3卷积推理速度因此明显优于结构相同的普通CNN。这个特性直接影响车辆行人检测系统的帧率表现——在Jetson边缘设备上重参数化后的模型往往能比训练时结构快20%以上。2.2 检测头与损失函数中针对两类目标的设置YOLOv7的检测头沿用FPNPAN结构从三个不同尺度的特征图上输出预测结果分别对应大、中、小目标。车辆行人检测模型只需要两个类别vehicle和person。在data/coco.yaml或者自定义的数据配置文件中类别列表的写法如下train: ./datasets/VehiclePerson/images/train val: ./datasets/VehiclePerson/images/val nc: 2 names: [vehicle, person]nc表示类别数量为2names列表的索引顺序必须与标注文件中的类别ID一一对应。顺序一旦写错训练出来的模型在推理时会把车辆和行人标签互换而且loss曲线看不出任何异常。损失函数方面YOLOv7使用CIoU Loss作为边界框回归损失。CIoU不仅考虑预测框和真实框的重叠面积还把中心点距离和宽高比一致性纳入计算。对于车辆这种宽高比接近1.5到2.0的物体CIoU的宽高比惩罚项让预测框的尺寸收敛更稳定。行人目标通常高宽比大于2CIoU同样可以约束预测框不至于在竖直方向上漂移。类别损失使用BCEWithLogitsLoss这里有一个实际经验提示当车辆数量明显多于行人时类别损失会被车辆样本主导。建议在训练配置中为person类别单独增加cls_pw权重一般设为1.2到1.5能有效缓解类别不平衡问题。2.3 锚框尺寸统计用聚类替代默认值YOLOv7默认的锚框尺寸基于COCO数据集80个类别的统计结果生成。车辆行人的尺寸分布和COCO整体分布差异很大直接使用默认锚框会导致回归分支的训练起点不理想。常见做法是在训练前对5000张数据集的标注框做K-Means聚类重新统计适合当前数据集的锚框尺寸。YOLOv7开源代码的tools/kmeans_anchors.py脚本可以直接复用。运行命令如下python tools/kmeans_anchors.py \ --data ./datasets/VehiclePerson \ --num_clusters 9 \ --img_size 640 \ --save_dir ./runs/anchorsnum_clusters设置为9对应三个检测尺度各3组锚框。聚类完成后生成的anchors.txt需要手动粘贴到模型配置文件的对应位置。如果聚类得到的锚框与默认值相差超过30%说明当前数据的目标尺度分布确实特殊不要忽略这一步。3. 5000张车辆行人数据集的目录结构、标注格式与划分3.1 数据集目录结构与YOLO格式标注转换拿到一份5000张的车辆行人检测数据集第一步不是直接训练而是确认目录结构是否符合YOLOv7的训练索引逻辑。标准的YOLO系列数据集目录如下VehiclePerson/ ├── images/ │ ├── train/ │ │ ├── img_0001.jpg │ │ └── ... │ └── val/ │ ├── img_0001.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_0001.txt │ │ └── ... │ └── val/ │ ├── img_0001.txt │ └── ... └── data.yaml标注文件为纯文本格式每一行代表一个目标框0 0.682031 0.561198 0.126563 0.244792 1 0.815625 0.843750 0.062500 0.245139五个数字依次为类别ID、归一化中心点x坐标、归一化中心点y坐标、归一化宽度、归一化高度。全部是0到1之间的小数由像素坐标除以图片宽高得到。第二行开头是1说明该目标属于person类别。如果拿到的数据集是VOC格式的XML标注或COCO格式的JSON标注需要先做格式转换。COCO转YOLO时有一个高频踩坑点注意COCO标注的bbox字段是[x_min, y_min, width, height]而YOLO格式要求的是归一化的中心点坐标和宽高。转换公式为center_x (x_min width / 2) / image_width不要直接用x_min / image_width当作中心点。3.2 训练集与验证集的划分策略5000张数据集的划分比例通常选择8比2即4000张进训练集1000张进验证集。需要注意的是一定要保证划分的随机性并且设置固定的随机种子方便复现。import os import random import shutil random.seed(42) images os.listdir(raw_images) random.shuffle(images) split_idx int(len(images) * 0.8) train_images images[:split_idx] val_images images[split_idx:] for filename in train_images: shutil.copy(fraw_images/{filename}, fVehiclePerson/images/train/{filename}) shutil.copy( fraw_labels/{filename[:-4]}.txt, fVehiclePerson/labels/train/{filename[:-4]}.txt ) for filename in val_images: shutil.copy(fraw_images/{filename}, fVehiclePerson/images/val/{filename}) shutil.copy( fraw_labels/{filename[:-4]}.txt, fVehiclePerson/labels/val/{filename[:-4]}.txt )seed(42)保证每次执行划分结果一致。图片和标注文件的文件名必须一一对应YOLO框架只通过文件名前缀关联图片与标签不读取任何内嵌元数据。有一个实践中的细节值得注意划分前最好先按场景来源分组。如果5000张数据里有3000张来自同一路口的固定摄像头剩余2000张来自其他路段直接把所有文件名混在一起随机划分会出现同一摄像头的数据同时出现在训练集和验证集中的情况导致验证集精度虚高。这种泄漏在测试时会造成严重误判。3.3 数据增强参数在训练配置中的权衡5000张数据量并不大数据增强是防止过拟合的关键手段。YOLOv7在超参数配置文件data/hyp.scratch.p5.yaml中提供了完整的增强参数项参数名作用说明推荐值hsv_h色调增强幅度增强对外观颜色变化的鲁棒性0.015hsv_s饱和度增强幅度0.7hsv_v明度增强幅度车辆行人受光照影响大不宜过高0.4degrees随机旋转角度10.0translate平移比例0.1scale缩放范围应对不同距离的目标尺寸0.5fliplr水平翻转概率道路场景适用0.5mosaic四图拼接概率显著提升小目标检测能力1.0这几个参数中hsv_v和degrees对车辆行人检测的影响最大。交通监控场景中同一辆车在早晚光照下的明暗差异很大hsv_v太低会导致夜间场景检测效果下降而旋转角度超过10度会让路面上的车辆出现不真实的倾斜形态影响回归分支的收敛。mosaic在前半段训练周期中保持开启效果很好但如果验证集大量使用真实标注最终几个epoch建议把mosaic概率降到0.2以下让模型适应真实的非拼接图像分布。4. 训练或微调YOLOv7车辆行人检测模型的完整流程4.1 环境依赖与预训练权重选择训练YOLOv7模型的环境配置并不复杂核心依赖是PyTorch 1.8及以上版本、CUDA 11.x、OpenCV。推荐使用Python虚拟环境隔离依赖git clone https://github.com/WongKinYiu/yolov7.git cd yolov7 pip install -r requirements.txt python -c import torch; print(torch.cuda.is_available())最后一步输出True表示GPU可用。如果输出False需要检查PyTorch的CUDA版本是否与机器驱动匹配常见问题是PyTorch安装的是CPU版本卸载后用CUDA对应版本的命令重新安装即可。训练方式分成两种如果训练自己的模型直接使用开源的yolov7.pt预训练权重从头初始化。如果是对已有车辆行人模型做微调需要把自己的数据集路径和类别数改为和训练好的模型一致然后加载这个权重继续训练若干epoch。微调时学习率要调低建议初始学习率为0.001而从头训练的初始学习率为0.01。4.2 训练命令与核心参数实测说明YOLOv7官方仓库的train.py是最常用的训练入口。针对5000张的车辆行人数据集推荐训练命令如下python train.py \ --data ./datasets/VehiclePerson/data.yaml \ --cfg cfg/training/yolov7.yaml \ --weights yolov7.pt \ --batch-size 16 \ --img 640 \ --epochs 200 \ --workers 8 \ --device 0--batch-size 16在显存为16G的显卡上是一个安全值如果显存只有8G需要降到8同时可以开启--cache-images把图片预加载到内存中。--img 640对应输入尺寸这个值在检测精度和推理速度之间比较均衡。训练过程中需要关注的输出指标有三个box_loss、cls_loss和obj_loss。如果三个loss在前20个epoch内持续下降说明模型在学习如果cls_loss震荡明显、不下降优先检查数据标注文件以及类别ID映射是否写错。--epochs 200针对5000张数据是充裕的。实际训练中模型通常在80到120个epoch之间收敛验证集mAP在这个区间达到平台期。如果继续训练较久后验证集mAP开始回落说明发生了过拟合早停机制或者减少数据增强幅度是解决方案。4.3 使用练好的模型进行图片和视频推理训练结束后runs/train/exp/weights/best.pt就是验证集上表现最好的权重文件。对单张图片执行检测的命令如下python detect.py \ --weights runs/train/exp/weights/best.pt \ --source ./test_images/road_01.jpg \ --conf-thres 0.35 \ --iou-thres 0.45 \ --save-txt \ --project ./runs/detect逐项解释关键参数。--conf-thres 0.35表示检测置信度阈值低于这个值的预测框会被丢弃。车辆这类大目标置信度一般较高可以设0.4以上行人目标在远距离或遮挡时置信度偏低阈值过高会漏检0.35是比较均衡的起点。--iou-thres 0.45是NMS的IoU阈值同一目标重叠多个预测框时重叠度高于这个值的框会被合并。--save-txt会把检测结果保存为文本文件每行格式与标注文件一致方便后续做精度统计。对视频文件做推理只需把--source换成视频路径python detect.py \ --weights runs/train/exp/weights/best.pt \ --source traffic_video.mp4 \ --conf-thres 0.35 \ --iou-thres 0.45在GPU上处理1080p视频YOLOv7模型的推理速度大约在50到80帧每秒主要开销在视频解码和NMS后处理上。如果想用摄像头实时检测--source 0表示读取本机第一个摄像头设备。5. 模型部署加速与检测效果验证的实操技巧5.1 PyTorch权重转ONNX的导出流程如果要将练好的车辆行人检测模型部署到生产环境ONNX是最常见的中间格式。YOLOv7仓库自带的export.py脚本可以一键完成导出python export.py \ --weights runs/train/exp/weights/best.pt \ --img-size 640 \ --batch 1 \ --simplify--simplify标志会调用ONNX Simplifier对计算图做算子融合和常量折叠通常能让导出模型体积缩小10%到20%同时降低推理延迟。导出后建议用onnxruntime检查模型结构是否完整import onnxruntime as ort session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider]) print(f输入节点: {session.get_inputs()[0].name}, 形状: {session.get_inputs()[0].shape})输入节点的形状应该是[None, 3, 640, 640]输出节点的形状是[None, 25200, 7]。这里的25200由三个检测尺度所有锚框数量加总得出7则对应[batch_membership, x1, y1, x2, y2, obj_score, class_scores]。提示如果在ONNX导出后输出节点数量与预期不符最常见的原因是export.py中--grid参数未开启导致输出层没有包含最后的解码操作需要在导出时确认这个参数的值。5.2 验证mAP与帧率的量化指标模型是否真正可用不能只看训练日志要在独立的测试集上计算mAP和推理延迟。YOLOv7仓库的test.py脚本支持直接评估python test.py \ --data ./datasets/VehiclePerson/data.yaml \ --weights runs/train/exp/weights/best.pt \ --batch-size 16 \ --img 640 \ --conf-thres 0.001 \ --iou-thres 0.5这里--conf-thres设置为0.001是为了mAP计算时覆盖更多置信度区间不是推理时实际使用的阈值。输出结果中需要重点关注mAP0.5和mAP0.5:0.95两个指标前者在车辆行人检测项目中最常被引用。帧率验证不能只看模型计算时间完整链路的耗时通常包括图像解码、缩放填充、模型推理、NMS后处理四部分。一个实用的方法是把detect.py中记录的单帧平均耗时作为参考Speed: 6.2ms pre-process, 12.1ms inference, 1.8ms NMS per image at shape (1, 3, 640, 640)这里的12.1ms inference是纯粹的张量计算时间只优化这一段可以通过TensorRT加速。在NVIDIA Jetson Orin等边缘设备上把ONNX模型转换为TensorRT的FP16精度引擎推理延迟通常可以再压缩35%到50%。转换过程建议使用trtexec工具生成引擎文件命令参考如下trtexec \ --onnxbest.onnx \ --saveEnginebest_fp16.engine \ --fp16 \ --workspace4096车辆行人检测模型最终部署时还有一个实用技巧在检测后端增加类别的逻辑过滤规则。例如单车道场景中车辆宽度像素比例不应超过画面宽度的三分之一行人的高宽比不应小于1.5用这类先验知识把明显异常的预测框在NMS之前过滤掉能换来几个百分点的mAP提升同时降低后处理负载。本文还有配套的精品资源点击获取
返回列表