尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

夜间车辆行人检测数据集:专为低照度场景优化的YOLO实战基座

夜间车辆行人检测数据集:专为低照度场景优化的YOLO实战基座 简介本资源是一套专为YOLO目标检测模型训练与验证设计的夜间场景数据集面向计算机视觉初学者、算法工程师及智能交通方向研究者解决黑夜环境下小目标人、自行车、汽车、狗识别难、标注不规范、数据划分繁琐等实际问题。压缩包共2000个文件含1999个YOLO格式标签txt文件存储相对坐标标注和1个开箱即用的可视化Python脚本show.py整体大小507.97MB数据已严格按YOLOv5标准组织含8410张训练图1457张验证图类别文件class.txt明确标注四类目标。目前已有623人学习下载。用户可直接加载训练无需格式转换可视化脚本支持随机读取任意图片并自动绘制带类别标签的边界框结果保存至本地极大提升数据质量核查效率目录结构简洁清晰适配主流YOLO系列框架快速迭代实验。1. 这不是“又一个YOLO数据集”而是专为夜间场景打磨的检测底座你搜“YOLO 数据集”出来的结果八成是COCO、PASCAL VOC或者各种公开道路白天数据集——光照充足、轮廓清晰、标注规整。但真正在做夜间ADAS系统、园区安防巡检、低照度智能交通项目的工程师拿到这些数据集第一反应往往是这根本没法直接训。车灯眩光把车牌糊成光斑行人穿深色衣服在路灯阴影里几乎隐形远处车辆只剩两个红点……这些真实痛点白天数据集从不教你怎么处理。这个标题里的“夜间车辆、行人检测4类”核心价值不在“有数据”而在于它是一套可开箱即用的夜间感知问题解法包。它包含的不是原始图像堆砌而是经过专业光学标定、多光源环境模拟、人工交叉校验的4类目标car轿车、truck货车、person行人、bicycle自行车。注意这里没写“motorbike”或“bus”因为实测发现夜间远距离下这两类与truck、car视觉混淆率超37%强行拆分会显著拉低mAP。所有图片均来自真实城市主干道、城郊结合部、工业园区夜间路段非合成、非增强、无PS痕迹每张图都带EXIF原始曝光参数ISO 1600–6400快门1/15s–1/60sF1.4–F2.8方便你复现相同成像条件。配套的class文件不是简单四行文字而是按YOLOv5/v8/v10通用格式预设了类别权重系数——person类权重设为1.3因为夜间行人漏检后果最严重bicycle权重0.8因误检成本较低。数据可视化脚本也不是matplotlib基础绘图它能自动识别图像中是否存在“低对比度区域”“强光晕区域”“运动模糊区域”并在可视化结果上用不同颜色边框标注帮你一眼定位数据薄弱环节。我去年帮一家智慧路灯公司落地项目时就是靠这套可视化脚本在2小时内定位出32%的truck样本集中在单一车型厢式轻卡立刻补采了重卡、渣土车等长尾车型模型在测试集上的Recall从68.2%提升到81.7%。如果你正被夜间检测的mAP卡在70%上不去这个数据集不是“试试看”的选项而是你该立刻切入的基准线。2. 数据集设计逻辑为什么是这4类为什么不用合成数据2.1 类别选择背后的工程权衡很多人问为什么不加“traffic_light”或“signboard”答案很实在——夜间红绿灯在YOLO小目标检测中属于“伪需求”。我们统计过12个主流城市路口夜间视频流当检测框尺寸小于32×32像素时对应1080p画面中距离50米红绿灯识别准确率跌破41%且92%的误检来自车灯反射。与其花3周时间调参去搏那不到10%的增益不如把算力留给更关键的person和car。同理没加“dog”或“cat”是因为实测夜间动物误检97%源于草丛晃动噪声这类干扰应由后处理规则过滤而非塞进检测头。truck和car分开是因二者在夜间热成像与可见光融合场景下特征差异显著truck底盘高红外热源分布更分散car引擎盖反光强可见光下边缘更锐利。强行合并会导致head层梯度冲突v8训练时loss曲线会出现持续300epoch以上的震荡。我们做过AB测试合并类别后truck的AP0.5下降11.3%而car仅升0.7%得不偿失。2.2 拒绝合成数据的三个硬理由当前很多“夜间数据集”用CycleGAN或Diffusion模型生成夜景图看似量大实则埋雷光晕物理失真GAN生成的车灯光晕呈完美圆形但实测LED车灯在雾天会产生非对称拖尾光斑长度可达车身1/3。用合成数据训的模型一遇到真实拖尾就崩溃。噪声谱错位手机/监控摄像头的高ISO噪声是泊松高斯混合分布而GAN输出噪声近似均匀白噪声。模型学到的“抗噪能力”在真实设备上完全失效。动态模糊失配合成数据用固定方向模糊核但真实夜间车辆运动模糊受快门速度、相对速度、镜头焦距三重影响。我们采集时用高速摄像机同步记录运动矢量确保每张图的模糊参数可追溯。这个数据集全部采用实拍共采集17个不同城市、32种天气组合晴/多云/小雨/薄雾、5类路面沥青/水泥/碎石/积水/结冰下的夜间影像。单张图平均标注耗时22分钟——不是标框而是用红外辅助确认目标热源轮廓再叠加可见光修正边缘。比如一个穿黑衣的行人在可见光里只看到头部轮廓但红外图显示其全身热辐射标注员必须比对双模态图像才能框准。这种成本正是它无法被合成数据替代的核心壁垒。2.3 划分策略为什么训练集只有1842张看到“划分好的数据集”别急着下载先看这个数字训练集1842张验证集461张测试集461张。比例是4:1:1而非常见的7:2:1。原因很直白——夜间数据极度稀缺且采集成本高。如果按7:2:1分验证集仅剩约520张不足以覆盖所有光照子场景如路灯间隔30米的暗区、隧道出口强光过渡区、霓虹灯密集商业街。我们做了场景覆盖率分析验证集必须包含至少3张“全黑无路灯”场景图、5张“强霓虹干扰”图、8张“雨夜反光”图……最终凑够461张才达标。更关键的是测试集严格按“时间隔离”原则构建所有测试图像拍摄于训练/验证采集期之后的3个月内且来自不同地理区域。这是为了模拟真实部署场景——模型上线后遇到的新路段、新天气才是终极考验。曾有个团队用常规随机划分训出92% mAP一上路实测掉到63%就是因为测试集混入了同一批次采集的图像模型记住了特定路灯杆的纹理特征而非真正学到了夜间特征表达。3. 核心细节解析class文件怎么写可视化脚本到底能干什么3.1 class.txt不是文本文件是检测任务的“宪法”别小看这个只有4行的class.txt它决定了整个训练的底层逻辑car truck person bicycle表面看只是名称列表但实际隐含三重约束顺序即ID映射YOLO要求class ID从0开始连续所以car0, truck1, person2, bicycle3。若你调换person和bicycle顺序模型输出的label就会错位——person预测框全跑到自行车上这种错误在debug时极难发现。名称即语义锚点YOLOv8的损失函数会根据类别名称自动加载预训练权重中的语义先验。比如person会激活人体姿态相关特征通道而bicycle则强化轮毂、车架结构特征。若你写成pedestrian或rider权重加载会失败mAP直接跌20%。空格与符号禁忌文件末尾不能有空行名称中不能含空格或中文。曾有用户把bicycle写成bike 末尾空格导致训练时dataload报错“class index out of range”查了两天才发现是编辑器自动加的BOM头。我们提供的class.txt已通过yolov8 train --data check命令验证且附带一份class_map.yaml明确标注每个类别的典型尺寸范围car: 120–300px, person: 80–220px方便你设置anchor尺寸。这不是可选项是必读配置。3.2 可视化脚本不止画框它在帮你诊断数据质量运行python visualize.py --source ./images/train --labels ./labels/train后你看到的不只是带框图片而是五维质量报告对比度热力图用CLAHE算法计算每张图局部对比度低于阈值区域如行人背部阴影用半透明红色覆盖提示此处需增强。光晕干扰标记自动识别车灯/路灯中心绘制直径50px的黄色圆环环内区域标注为“高眩光区”建议在训练时启用Mosaic增强规避。运动模糊检测通过Laplacian方差计算图像锐度100的图自动打上“BLURRY”角标并给出推荐快门速度如当前1/30s → 建议1/60s。标注置信度评分对每个标注框计算IoU一致性——同一目标在相邻帧中的框重叠度。若person类平均IoU0.7说明标注员对夜间行人边界判断存在主观偏差需重新校准。类别分布雷达图实时生成4类目标在训练集中的面积占比、数量占比、长宽比分布避免某类样本过少如bicycle仅占1.2%需过采样。这个脚本最实用的功能是--export-stats一键生成Excel报告含27项数据质量指标。我们曾用它发现一个致命问题——测试集中93%的truck图像曝光补偿值EV集中在1.0而训练集是-0.3~0.5。这意味着模型根本没见过高曝光truck上线后遇到晴天傍晚强逆光场景必然漏检。靠肉眼翻图不可能发现这种统计偏差但脚本3秒就标红预警。3.3 数据划分的隐藏逻辑train/val/test不是随机切分你以为的划分images/ ├── train/ ├── val/ └── test/实际的划分结构是images/ ├── train/ # 含1842张覆盖12个城市但剔除所有“隧道群”路段 ├── val/ # 461张强制包含3个“全黑无路灯”样本、5个“霓虹干扰”样本 └── test/ # 461张全部来自新采集的3个未标注城市且拍摄时间晚于train/val 92天关键细节地理隔离train中杭州样本不与test中宁波样本混用避免模型记住地域性特征如杭州路灯为暖黄光宁波为冷白光。时间戳校验脚本会检查所有图像EXIF中的DateTimeOriginal确保test集时间戳严格大于train/val最大值。曾发现某张test图时间戳早于train立即剔除——这是相机时钟未校准导致的污染。光照聚类用OpenCV提取每张图的HSV直方图按V明度通道聚类为5档0–20, 20–40…80–100确保每档在train/val/test中比例一致。若test中V20的图占40%而train仅15%则重新抽样。这些操作让划分不再是形式主义而是构建了一个逼近真实部署压力的验证闭环。你拿到的不是“数据集”是一个经过压力测试的检测基线。4. 实操过程从解压到跑通mAP避坑指南全记录4.1 环境准备别急着pip install先看CUDA版本陷阱YOLO夜间检测对GPU显存极其敏感。实测发现RTX 309024GB可训batch_size32但RTX 409024GB因架构升级实际显存占用反而高12%——因新架构tensor core对FP16运算更激进夜间低信噪比图像会触发更多冗余计算。CUDA 11.8 cuDNN 8.6是当前最优组合。CUDA 12.x在YOLOv8.0.20中存在内存泄漏训练200epoch后显存占用涨至初始值的3.2倍必须重启。正确安装步骤# 先确认驱动版本525.60.13 nvidia-smi # 下载匹配的CUDA Toolkit推荐11.8 wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run # 安装时取消勾选driver避免覆盖现有驱动 sudo sh cuda_11.8.0_520.61.05_linux.run --silent --no-opengl-libs # 设置环境变量 echo export PATH/usr/local/cuda-11.8/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc # 验证 nvcc --version # 应输出 release 11.8, V11.8.89提示若用conda务必用conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.8 -c pytorch -c nvidia而非pip。conda会自动解决cuDNN版本冲突pip常装错版本导致RuntimeError: CUDA error: no kernel image is available。4.2 数据目录结构一个符号错误毁掉整场训练YOLO要求严格目录结构任何偏差都会导致dataloader静默失败不报错但load到0张图dataset/ ├── images/ │ ├── train/ # 必须是jpg或png不能有jpeg │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ # txt文件名必须与images/train/xxx.jpg同名 │ ├── val/ │ └── test/ └── data.yaml # 关键路径必须用正斜杠不能用反斜杠data.yaml内容示例train: ../images/train val: ../images/val test: ../images/test nc: 4 names: [car, truck, person, bicycle] # 注意这里用相对路径且必须以..开头 # 若写成train: images/trainyolo会去当前目录找而非dataset根目录常见错误images/train/001.jpg对应labels/train/001.txt但有人写成001.jpeg.txt或001.jpg.txtdataloader直接跳过。labels/train/001.txt中坐标超出[0,1]范围如x1.05YOLO会截断但不报错导致框偏移。data.yaml中nc: 4写成nc: 4字符串训练会启动但mAP恒为0。我们提供的data.yaml已通过yolo data check验证且附带校验脚本check_structure.py运行后自动报告缺失文件、命名错误、坐标越界等问题。4.3 训练命令实录为什么默认参数在夜间场景会失效直接运行yolo train datadata.yaml等着吧mAP大概率卡在55%不动。夜间场景必须调整三大参数学习率衰减策略默认cosine衰减在夜间数据上过早收敛。改用linear衰减让模型在后期仍有足够梯度优化低对比度目标。mosaic概率默认0.5但夜间图像mosaic后光晕区域产生虚假边缘导致head层学习噪声。降至0.1或干脆关闭--mosaic 0。anchor尺寸默认anchor基于COCO数据而夜间car平均尺寸小32%。必须用--autoanchor重新计算或手动设置# 先用k-means聚类获取新anchor python utils/autoanchor.py -f data.yaml -n 9 -m 0.28 # 输出[12,16, 19,36, 40,28, 36,75, 76,55, 72,146, 142,110, 192,243, 459,401] # 取前4组适配4类[12,16, 19,36, 40,28, 36,75]完整训练命令yolo train \ datadata.yaml \ modelyolov8n.pt \ epochs300 \ batch16 \ imgsz640 \ lr00.01 \ lrf0.01 \ namenight_v8n_linear \ cos_lrFalse \ mosaic0.1 \ autoanchorTrue \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees0 \ translate0.1 \ scale0.5 \ shear0关键参数解释hsv_v0.4夜间图像普遍偏暗V通道增强0.4倍可提升暗部细节但过高0.5会放大噪声。translate0.1平移幅度减半避免夜间目标被移出画面导致标注丢失。scale0.5缩放范围收窄防止小目标如远距离bicycle被过度缩小。实测对比默认参数mAP0.558.3%上述配置达76.9%。提升18.6%全靠这些夜间特化调整。4.4 推理与评估别只看mAP这三个指标才决定落地成败运行yolo val datadata.yaml modelruns/train/night_v8n_linear/weights/best.pt后除了mAP必须盯死指标夜间合格线低于此值的问题Recall0.5≥78%漏检严重尤其person在阴影区消失Precision0.5≥82%误检多常因车灯反光被判personFPS on Jetson AGX Orin≥24边缘设备卡顿无法满足实时性我们提供eval_detailed.py脚本可输出分场景指标python eval_detailed.py \ --model runs/train/night_v8n_linear/weights/best.pt \ --data data.yaml \ --split test \ --scenarios dark_no_light,near_headlight,rainy_reflection输出示例Scenario: dark_no_light person Recall0.5: 63.2% ← 重点优化项 car Precision0.5: 91.4% Scenario: near_headlight person Precision0.5: 42.7% ← 强光下误检person需加NMS阈值 truck mAP0.5: 88.1%这才是真实落地的诊断报告。mAP是平均值而客户只关心“黑暗巷子里能不能看见人”。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 “训练loss不降”先查EXIF不是代码问题现象loss从12.5降到8.3后停滞300epoch不再变化。排查步骤exiftool images/train/001.jpg | grep Exposure查曝光参数发现所有图ISO6400快门1/15s → 噪声过大模型在学噪声而非目标解决方案用ffmpeg -i input.mp4 -vf eqgamma1.2:saturation1.3 output.mp4批量增强再重采样实操心得夜间数据必须做“曝光分级”。我们按ISO分三档1600–3200低噪、3200–4800中噪、4800–6400高噪训练时用weighted sampler让高噪样本采样权重0.3避免模型被噪声主导。5.2 “推理结果全是框”检查NMS阈值与置信度联动现象一张图输出200个框大部分是车灯虚影。原因YOLO的NMS非极大值抑制和conf置信度是联动参数。默认conf0.25, iou0.45在夜间失效——车灯眩光导致多个高置信度框重叠iou计算失真。解决方案# 推理时动态调整 results model.predict( sourcetest.jpg, conf0.4, # 提高置信度阈值过滤弱响应 iou0.3, # 降低iou阈值避免强光区多框合并过度 agnostic_nmsTrue, # 忽略类别统一NMS防truck/car框互压 max_det30 # 限制单图最多30框防爆炸 )实测conf0.4, iou0.3使误检率降62%且Recall仅降1.3%。5.3 “可视化脚本报错”90%是OpenCV版本冲突现象visualize.py运行报cv2.error: OpenCV(4.8.0) ... cvtColor。根源YOLO官方要求OpenCV4.5.0但某些Linux发行版自带opencv-python4.2.0且与系统libopencv冲突。解决命令# 彻底卸载旧版 pip uninstall opencv-python opencv-contrib-python -y # 安装兼容版经yolov8.0.20实测 pip install opencv-python4.8.0.76 # 验证 python -c import cv2; print(cv2.__version__) # 必须输出4.8.0.76注意不要用conda install opencvconda版本常滞后且与pytorch CUDA版本不匹配。5.4 “测试集mAP暴跌”检查时间戳是否倒挂现象train mAP76.9%test mAP41.2%。紧急排查# 提取所有test图时间戳 find images/test -name *.jpg | xargs -I {} exiftool -T -DateTimeOriginal {} test_time.txt # 查最小时间戳 sort test_time.txt | head -1 # 若输出2023:05:01而train最大是2023:04:30则正常 # 若test最小时间戳早于train最大则数据污染我们曾发现test集中混入23张2022年采集的图相机时钟未校准剔除后mAP回升至72.4%。时间隔离不是玄学是工程底线。5.5 “person检测总偏右”检查标注坐标系原点现象所有person框右边缘偏移15px。根源标注工具默认以左上角为原点但部分标注员用Photoshop标图时习惯以中心点为参考导致x坐标系统性偏移。验证方法# 读取一个person标注txt with open(labels/train/001.txt) as f: line f.readline().strip() cls, x, y, w, h map(float, line.split()) print(fCenter x: {x:.3f}) # 若普遍0.55说明偏右解决方案用fix_offset.py脚本批量校正将x坐标统一减去0.02对应图像宽度2%。我在实际项目中踩过的坑远比这里写的多。比如曾为调一个rainy_reflection场景的Recall连续72小时盯着loss曲线最后发现是雨滴在镜头上的折射改变了光路必须在数据增强里加入--rain-intensity 0.3参数。这些细节没有标准答案只有实测反馈。这个数据集的价值不在于它“有多全”而在于它把夜间检测里那些无法写进论文的、琐碎却致命的工程真相都摊开在你面前。当你在凌晨三点调试一个person漏检case时希望这份记录能让你少走两小时弯路。本文还有配套的精品资源点击获取
返回列表