ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

雾天行人车辆检测数据集:5类YOLOV5格式,开箱即训

雾天行人车辆检测数据集:5类YOLOV5格式,开箱即训 简介这份资源面向从事目标检测算法学习与工程落地的开发者提供雾天场景下的行人、车辆检测数据集可直接用于YOLOv5训练省去自行采集与标注的成本。数据按YOLOv5目录规范组织图像为400至1000分辨率的RGB图片覆盖雾天马路上的常见车辆与人群共划分人、轿车、公交车、自行车、摩托车5个类别。包内共2000个文件以1999个txt标注文件与1个Python可视化脚本为主压缩包约123.5MB其中训练集含4320张图片及对应标签验证集含100张图片及对应标签并附类别说明文本。资源还提供show.py脚本随机传入一张图片即可绘制边界框并保存到当前目录无需修改即可运行便于快速核验标注质量。目前已有405人学习下载适合需要雾天检测数据、想验证模型鲁棒性或开展相关课程实验的读者参考使用。1. 雾天行人车辆检测数据集5 类标注、YOLOV5 目录格式拿到就能开训雾天场景的目标检测是自动驾驶和路侧感知里最容易被低估的一类脏活。晴天数据上 mAP 跑到 0.9 的模型一进雾天就集体翻车行人只剩个模糊轮廓车辆尾灯糊成一团光斑模型要么漏检要么把雾团当目标。这个数据集要解决的就是这件事它是一份按 YOLOV5 目录格式组织、面向雾天场景的行人与车辆目标检测数据集共 5 个类别标注文件是 YOLO 的 txt 格式配好 data.yaml 就能直接喂给 YOLOV5 开训。适合三类人想验证雾天鲁棒性的算法工程师、做自动驾驶或智慧交通感知的从业者、以及想拿一份真实脏数据练手 YOLOV5 训练自己数据集流程的新手。它不解决雾的物理建模只解决「有标注、能开训、能复现」这一步。2. 先搞清楚这份数据集的结构与 5 类标签怎么定拿到一份数据集第一件事不是急着 train.py而是把目录结构和标签体系摸清楚。YOLOV5 对目录格式有硬性约定标签类别顺序又直接决定训练出来的模型认不认人这两件事搞错后面全是无用功。2.1 YOLOV5 目录格式到底长什么样YOLOV5 官方推荐的目录结构是 images 和 labels 平行放置train/val 各自成对。常见做法是这样dataset/ ├── images/ │ ├── train/ # 训练集图片jpg/png │ │ ├── fog_0001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── fog_0201.jpg │ └── ... ├── labels/ │ ├── train/ # 与 images/train 同名的 txt │ │ ├── fog_0001.txt │ │ └── ... │ └── val/ │ ├── fog_0201.txt │ └── ... └── data.yaml # 数据集描述文件关键约束有三条第一images/train/fog_0001.jpg必须对应labels/train/fog_0001.txt文件名不含扩展名严格一致差一个字符 YOLOV5 就找不到标签训练时会把这张图当负样本白白污染梯度。第二labels 目录下不能混入classes.txt、train.cache之外的多余文件YOLOV5 扫描时会尝试解析所有 txt。第三图片和标签分开放不要图省事把 txt 和 jpg 塞同一个文件夹YOLOV5 的 dataloader 默认按平行目录找。提示如果数据集原始是 VOC 的 xml 或 COCO 的 json先转成 YOLO txt 再按上面结构摆放转换脚本见 2.3。2.2 5 个类别怎么排、data.yaml 怎么写这份数据集是 5 类别通常覆盖雾天道路场景里的核心目标比如 person、car、bus、truck、motorcycle 这类组合具体类别名以数据集自带的 classes 说明为准不要凭感觉改。类别顺序就是标签文件里数字的含义txt 每行是class_id x_center y_center width height其中 class_id 从 0 开始对应 data.yaml 里 names 列表的下标。data.yaml 是训练入口写错一个字段训练直接报错# data.yaml path: ./dataset # 数据集根目录 train: images/train # 相对 path 的训练图片路径 val: images/val # 相对 path 的验证图片路径 nc: 5 # 类别数必须和 names 长度一致 names: # 顺序即 class_id0 开始 0: person 1: car 2: bus 3: truck 4: motorcyclenc和names长度不一致是最常见的低级错误YOLOV5 会在构建模型头时报维度不匹配。path用相对路径时是相对于你执行 train.py 的工作目录不是相对于 data.yaml 所在目录这点很多人栽过。稳妥做法是写绝对路径或者训练前cd到项目根目录。2.3 从 VOC/COCO 转成 YOLO txt 的转换脚本如果拿到的原始标注不是 YOLO 格式得先转。VOC 的 xml 转 YOLO txt 是最常见的一步核心是把绝对坐标的 xmin/ymin/xmax/ymax 归一化成中心点加宽高import os import xml.etree.ElementTree as ET # 类别名到 id 的映射顺序必须和 data.yaml 的 names 一致 CLASS_MAP {person: 0, car: 1, bus: 2, truck: 3, motorcycle: 4} def voc_to_yolo(xml_path, out_txt, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASS_MAP: continue # 跳过不在 5 类里的目标避免类别越界 cls_id CLASS_MAP[name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化到 0-1YOLO 要求中心点 宽高 x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 裁剪到 [0,1]防止标注越界导致训练报错 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(max(w, 0.0), 1.0) h min(max(h, 0.0), 1.0) lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(out_txt, w) as f: f.write(\n.join(lines))逻辑说明遍历 xml 里每个 object按 CLASS_MAP 映射类别把绝对像素坐标转成归一化中心点格式。参数上img_w、img_h必须传原图真实尺寸不能传网络输入尺寸比如 640否则坐标全错。:.6f保留 6 位小数是 YOLO 惯例精度足够。裁剪到 [0,1] 是后悔药雾天标注里偶尔有框超出图像边界的脏数据不裁 YOLOV5 会直接抛异常中断训练。转换完记得抽查几张用可视化脚本把框画回图上确认没偏。3. 用 YOLOV5 在雾天数据上跑通训练命令、超参与显存结构摸清后进入训练。这一章给的是能直接抄的命令和参数重点讲清楚每个参数为什么这么设以及雾天数据相比晴天数据要额外注意什么。3.1 环境配置与最小训练命令环境用 conda 隔离最省心YOLOV5 对 torch 版本敏感别用系统 Python 硬装conda create -n yolov5_fog python3.9 -y conda activate yolov5_fog git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt装完先跑一次自检确认 torch 能识别 GPUpython -c import torch; print(torch.__version__, torch.cuda.is_available())输出里True才说明 CUDA 可用。然后是最小训练命令python train.py \ --data ./dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --name fog_exp1--weights yolov5s.pt用预训练权重雾天数据量通常不大从头训容易过拟合迁移学习是标配。--img 640是 YOLOV5 默认输入尺寸雾天小目标多的话可以提到 960但显存翻倍。--batch 16是 8G 显存的安全值显存不够就降到 8 或 4YOLOV5 会自动做梯度累积补偿。--name决定结果存到runs/train/fog_exp1。3.2 雾天场景必调的 4 个超参数YOLOV5 的超参数在data/hyp.scratch.yaml里雾天数据有几个参数值得单独调参数默认值雾天建议原因hsv_v0.40.6雾天亮度变化大增强亮度扰动提升鲁棒性hsv_s0.70.5雾天色彩饱和度低过强饱和度增强反而失真mosaic1.01.0保留mosaic 拼接能模拟不同雾浓度叠加fl_gamma0.00.5开启 Focal Loss缓解雾天难样本的类别不平衡改法是在训练命令里加--hyp data/hyp.fog.yaml把默认文件复制一份改。hsv_v提到 0.6 是血泪经验雾天图像整体偏灰模型容易学到「灰背景」的捷径加大亮度扰动逼它关注形状而非亮度。fl_gamma设 0.5 是因为雾天里被遮挡的行人是难样本Focal Loss 能压低易样本权重让梯度集中在这些目标上。3.3 训练日志怎么看、显存不够怎么办训练启动后重点盯三行train/box_loss、val/box_loss、metrics/mAP_0.5。正常情况 box_loss 持续下降mAP 上升。如果 train loss 降但 val loss 涨是过拟合加数据增强或减 epoch。如果两个 loss 都不动检查 data.yaml 路径和标签是否为空。显存不够的排查顺序先降--batch再降--img最后换yolov5n小模型。别一上来就--device cpuCPU 训 YOLOV5 慢到怀疑人生。用nvidia-smi看显存占用如果 batch 16 时占用 7.8G 还频繁 OOM说明是碎片问题加--workers 4减少 dataloader 进程数有时反而更稳。注意雾天数据集如果图片分辨率很高比如 1920x1080--img 640会把小目标缩没行人可能只剩几个像素。这种情况要么提高 img 尺寸要么先切图再训。4. 雾天检测的避坑清单5 个真实翻车现场这一章全是踩过的坑每条按现象、原因、解决写。雾天数据集的坑和普通数据集不太一样很多是标注质量和场景特性带来的。4.1 现象mAP 虚高但实际漏检严重原因验证集和训练集来自同一段连续视频相邻帧高度相似模型记住了背景而非目标。雾天场景尤其明显因为雾的分布在同一段视频里几乎不变模型学到「这片雾这个位置有车」。解决按视频源或时间段划分 train/val不要随机按帧划分。如果数据集已经分好检查 val 里有没有和 train 几乎一样的图用感知哈希去重。4.2 现象训练中途报 Label class X exceeds nc原因标签文件里的 class_id 大于等于 nc。常见于转换脚本类别映射写错或者数据集混入了其他来源的标注。解决写个脚本扫一遍所有 txt统计出现的 class_id 最大值cat labels/train/*.txt | awk {print $1} | sort -n | uniq -c输出里最大 id 必须小于 nc。超了就回去查转换脚本的 CLASS_MAP。4.3 现象雾天行人框大量重叠NMS 后只剩一个原因雾天能见度低行人密集时标注框互相重叠默认 NMS 的 iou_thres 0.45 会把相邻行人误删。解决推理时把--iou-thres提到 0.6或者训练时用--agnostic-nms关闭类别间 NMS。代价是可能引入少量重复框需要按场景权衡。4.4 现象模型把雾团、路灯当车辆原因雾天里远处车灯形成的光晕和雾团形状类似车辆标注时如果没区分模型会学到错误特征。解决检查标注把纯光晕、无车身轮廓的区域标成背景不标。训练时加--rect矩形推理减少 padding 干扰同时提高hsv_v让模型不依赖亮度。4.5 现象验证集 mAP 波动大每次跑结果差很多原因雾天数据集通常偏小验证集样本少单次评估方差大。加上 YOLOV5 默认开启 mosaic每个 epoch 看到的样本组合不同。解决跑 3 次取平均或者把--seed固定。评估时用--augment开启 TTA能稳定 mAP 约 1-2 个点。数据集小于 2000 张时别太信单次 mAP看 loss 曲线更靠谱。5. 进阶雾天数据增强与模型验证的实操技巧训练跑通只是起点雾天检测真正的难点在于让模型对雾浓度变化鲁棒。这一章给两个具体技巧合成雾增强和分浓度验证。合成雾增强是最划算的手段。用大气散射模型给晴天图加雾能低成本扩充数据。核心是透射率和大气光两个参数import cv2 import numpy as np def add_fog(img, beta0.8, A0.9): # beta 雾浓度越大越浓A 大气光值0-1 h, w img.shape[:2] # 生成深度图这里用简单径向梯度模拟远处雾更浓 depth np.linspace(0.3, 1.0, h).reshape(-1, 1) depth np.repeat(depth, w, axis1) t np.exp(-beta * depth) # 透射率 t np.clip(t, 0.1, 1.0) # 防止除零 foggy img * t[..., None] A * 255 * (1 - t[..., None]) return np.clip(foggy, 0, 255).astype(np.uint8)beta控制雾浓度0.5 是薄雾1.2 是浓雾建议按 0.5/0.8/1.2 三档生成让模型见到不同浓度。A是大气光通常 0.8-0.95太高会过曝。这个函数只做演示真实场景深度图应该用单目深度估计网络生成效果更自然。生成后把新图和对应标签一起放进训练集标签不用改因为雾不影响目标位置。分浓度验证是检验鲁棒性的关键。把验证集按雾浓度分成薄、中、浓三组分别跑val.pypython val.py --data ./dataset/data.yaml --weights runs/train/fog_exp1/weights/best.pt --img 640 --task val如果薄雾 mAP 0.85、浓雾只有 0.5说明模型对浓雾泛化差回去补浓雾训练样本。我一般会画一张 mAP-雾浓度曲线比单个 mAP 数字有说服力得多。最后一个习惯每次改完超参或增强策略先跑 10 个 epoch 看趋势别一上来就 300 epoch。雾天数据小10 epoch 足够看出方向对不对省下的时间够你多试三组参数。这套流程我踩了太多坑才理顺希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表