拓冰建站拓冰建站
首页 / 资讯中心 / 正文

真实夜间行人检测数据集:1000张低光图像+YOLO11专用训练方案

简介本资源是面向计算机视觉工程师与AI算法学习者的夜间行人目标检测专用数据集聚焦低光照、遮挡等复杂监控场景下的检测难点可直接用于公共场所夜间安防系统开发或作为通用行人检测数据集的夜间场景补充。资源以PDF文档形式交付共1个文件6.09MB内含1000张真实街景与道路场景夜间图像配套高精度VOCXML、COCOJSON、YOLOTXT三格式标注均经labelimg人工校验同时提供适配GPU集群、普通CPU及MacM系列芯片的YOLO11一键训练脚本并附博主实测训练日志供效果参考与参数调优。目前已有1643人学习下载内容组织清晰涵盖数据集介绍、标注说明、多平台训练方案与百度网盘获取路径显著降低夜间检测任务的数据准备与模型验证门槛。1. 夜间行人检测不是调亮图片就能解决的1000张真实低光场景图三格式标签YOLO11跨平台一键训练脚本专治监控项目里“黑夜里看不见人”的玄学翻车你有没有遇到过这种现场客户指着监控回放说“人明明站在路灯下为什么AI没框出来”——你回去调亮度、改对比度、加直方图均衡模型在白天数据上mAP 0.85一到22点后就掉到0.3以下。这不是模型不行是数据不对。这份夜间行人检测数据集不是拿PS调色后的“伪夜景”而是实打实从城市路口、地下车库、老城区窄巷、高速匝道口采集的1000张原生低光图像有LED路灯频闪导致的运动模糊有车灯强光造成的局部过曝周边死黑有雨雾天红外热成像与可见光融合失败后的边缘断裂还有穿深色衣服背光站立时几乎与背景融为一体的“视觉消失”样本。它不提供“理想化夜间数据”只提供你部署时真正会撞上的坑。VOC/COCO/YOLO三格式开箱即用YOLO11训练脚本已预置针对低光场景的增强策略非简单HSV调整而是基于Retinex理论的自适应照度分解局部对比度恢复且明确支持M系列Mac芯片非Rosetta转译、多卡GPU并行nccl后端、纯CPU轻量训推一体。如果你正卡在安防项目交付前夜或者想补全自己目标检测数据集里的夜间盲区这份资源不是“又一个数据集”而是你调试日志里那句loss stuck at 4.2, no recall on dark pedestrians的后悔药。2. 为什么必须用真实夜间数据从标注质量、光照建模到YOLO11适配的三层硬逻辑2.1 真实夜间≠暗一点的白天低光图像的物理退化特性决定了标注必须重来很多人以为把COCO行人子集调暗就能当夜间数据用这是典型误区。真实夜间图像存在三类不可逆退化信噪比坍塌CMOS传感器在低照度下读出噪声read noise和暗电流噪声dark current主导导致像素值分布呈泊松高斯混合而非均匀衰减动态范围压缩路灯/车灯形成10^4:1的亮度比ISP自动曝光会牺牲暗部细节保亮部不溢出造成阴影区纹理完全丢失色度失真单色LED光源如5700K白光导致RGB通道响应严重不均R通道信噪比常比B通道高3dB以上。这份数据集所有图像均来自工业级星光级IPC海康DS-2CD3T47G2-L原始RAW未经过ISP pipeline处理保留了上述退化特征。标注时采用labelimg的多尺度ROI校验模式先用默认缩放查看整体再强制放大至200%检查遮挡边界如雨衣帽檐下人脸轮廓、再切到灰度通道确认暗部行人腰带/反光条等弱纹理区域是否被框准。每张图标注耗时平均4.7分钟远超白天行人标注的1.2分钟确保在YOLO11的Anchor匹配阶段不会因GT框偏移引发梯度爆炸。2.2 VOC/COCO/YOLO三格式不是简单转换格式差异直接决定训练稳定性很多开源转换脚本把VOC转YOLO时直接取bndbox四值除以图像宽高这在夜间数据上会致命——因为低光图像常含大量无效黑边IPC自动增益导致的顶部/底部噪声条纹若未裁切就直接归一化YOLO的x_center可能落在0.003这种极小值触发Sigmoid饱和区梯度趋近于零。本数据集的三格式生成严格遵循VOC XML保留原始分辨率size字段精确到像素object中difficult设为1标识低光难例COCO JSONimages[].height/width为裁切后有效尺寸annotations[].bbox经cv2.threshold二值化后计算连通域质心修正避免暗部小目标被误判为噪声YOLO TXT使用yolo_anchors_v11.py专用脚本生成该脚本先对图像做CLAHE预处理clipLimit2.0, tileGridSize(8,8)再运行k-means聚类得到适配夜间小目标的anchor尺寸最终输出anchors: [ [12,18], [24,36], [48,72] ]比标准YOLOv8的[10,13]等更细长适配行人竖向结构。提示YOLO格式的classes.txt中第0类固定为person但第1类预留occluded_person严重遮挡行人训练时可通过--class-weights 1.0,2.5提升难例权重这是夜间检测的关键技巧。2.3 YOLO11不是YOLOv8魔改版它针对低光场景重构了损失函数与数据增强链YOLO11并非营销名词而是作者基于YOLOv8主干改进的定制版本核心改动在三个模块Loss设计将CIoU Loss替换为LowLight-IoU该损失在IoU0.3时引入照度感知权重w 1 0.5 * (1 - mean_luminance)使模型在暗区更关注定位精度Backbone增强在C2f模块后插入LLA-AttentionLow-Light Adaptive Attention该注意力仅对图像YUV空间的Y通道亮度做通道加权避免UV色度噪声干扰Augmentation Pipeline放弃常规的RandomBrightnessContrast改用RetinexAug基于单尺度Retinex的照度估计反射分量增强实测在测试集上将小目标召回率提升11.3%。训练脚本train_yolo11.sh中关键参数已预设# 针对夜间数据的超参组合非默认值 python train.py \ --data data/night_person.yaml \ # 已内置valid路径指向val_dark_subset/ --cfg models/yolov8n_ll.yaml \ # 含LLA-Attention的配置 --weights yolov8n.pt \ # 使用COCO预训练权重非ImageNet --batch 32 \ # M1 Mac需设为16GPU可设64 --img 640 \ # 640是夜间小目标最优尺寸实验验证 --epochs 150 \ # 前50轮冻结backbone防过拟合 --lr0 0.01 \ # 初始学习率比标准高20%补偿低信噪比 --name night_yolo11_v1这段命令的--img 640是血泪经验试过320漏检严重、1280显存爆满且mAP不升反降640在保持72fps推理速度的同时对15px以下暗部行人框召回率达89.2%测试集统计。3. 三平台训练不是口号GPU/CPU/Mac实测配置与环境隔离方案3.1 GPU多卡训练NCCL后端避坑与显存优化实战YOLO11脚本默认启用torch.distributed.launch但直接跑--nproc_per_node4常因NCCL超时失败。根本原因是夜间数据增强RetinexAug涉及大量CPU密集型计算若num_workers0会导致GPU等待I/O。实测有效配置# 正确启动方式Ubuntu 22.04 CUDA 12.1 PyTorch 2.1 export NCCL_ASYNC_ERROR_HANDLING1 export NCCL_IB_DISABLE1 # 关闭InfiniBand多数服务器无IB export PYTHONPATH${PYTHONPATH}:/path/to/yolo11 # 启动命令注意--workers0 python -m torch.distributed.launch \ --nproc_per_node4 \ --master_port29501 \ train.py \ --data data/night_person.yaml \ --cfg models/yolov8n_ll.yaml \ --weights \ # 空字符串表示从头训练夜间数据不宜用COCO权重 --batch 128 \ # 总batch128每卡32 --img 640 \ --epochs 150 \ --workers 0 \ # 关键所有增强在主进程完成 --name dist_train_gpu4注意--workers 0会使单卡吞吐下降约35%但多卡同步成功率从42%提升至100%。若需更高吞吐应改用torch.utils.data.DataLoader的persistent_workersTruepin_memoryTrue组合但需重写datasets/night_dataset.py中的__getitem__方法。3.2 CPU轻量训练如何让i5-1135G7跑通完整训练流程CPU训练不是备选方案而是嵌入式部署前的必经验证。本数据集提供train_cpu.sh脚本核心是两级降采样策略数据级加载时对图像做cv2.resize(img, (320, 320))非训练时resize避免每次IO重复计算模型级使用models/yolov8n_cpu.yaml其中将C2f模块的c2通道数从64减至32SPPF层kernel size从[5,9,13]改为[3,5,7]。启动命令# i5-1135G7实测16GB内存 python train.py \ --data data/night_person_cpu.yaml \ # 指向320x320预处理数据 --cfg models/yolov8n_cpu.yaml \ --weights \ --batch 16 \ # CPU batch上限 --img 320 \ # 输入尺寸匹配预处理 --epochs 200 \ # 需更多轮次补偿精度损失 --device cpu \ --name cpu_train实测耗时约18小时最终val mAP0.50.632比GPU版低4.1个百分点但在树莓派4B上推理速度达8.2fps满足边缘需求。3.3 M系列Mac训练Metal后端适配与内存泄漏修复M芯片用户常遇到RuntimeError: Metal out of memory根源是PyTorch 2.0的Metal后端未正确释放中间tensor。解决方案分两步编译定制PyTorch从源码构建时添加-DUSE_METALON -DMETAL_ARCHarm64并打补丁修复metal_allocator.mm中的deallocate逻辑训练脚本注入内存管理在train.py的train_one_epoch循环末尾插入# 修复Metal内存泄漏仅M系列Mac if torch.backends.mps.is_available(): torch.mps.empty_cache() # 强制清空缓存 import gc gc.collect() # 触发Python垃圾回收启动命令需指定MPS设备# M1 Pro实测32GB统一内存 python train.py \ --data data/night_person.yaml \ --cfg models/yolov8n_ll.yaml \ --weights yolov8n.pt \ --batch 16 \ # M系列最大安全batch --img 640 \ --epochs 150 \ --device mps \ # 关键非cuda或cpu --name m1_train提示首次运行前执行xcode-select --install安装Command Line Tools否则Metal编译会失败。4. 避坑夜间行人检测训练中90%失败源于这5个隐蔽陷阱4.1 现象训练初期loss剧烈震荡±30%50轮后突然崩溃原因夜间图像的像素值集中在[0,30]区间8bit而YOLO11的默认归一化/255.0导致输入张量均值≈0.05标准差≈0.03远低于正常图像的均值0.45/标准差0.23。BN层统计量失效引发梯度爆炸。解决在datasets/night_dataset.py中重写__getitem__添加自适应归一化# 替换原归一化代码 mean_val img.mean() std_val img.std() img (img - mean_val) / (std_val 1e-8) # 防止除零 # 再进行后续增强4.2 现象验证集mAP停滞在0.4左右但训练集loss持续下降原因数据集中的“严重遮挡行人”如全身在阴影中仅露头部被错误标注为person而非occluded_person模型学到用头部特征泛化却无法检测完整躯干。解决运行tools/check_occlusion.py脚本该脚本基于HSV空间的V通道直方图峰度kurtosis判断遮挡程度kurtosis 1.2 → 标记为occluded_personkurtosis 2.8 → 保留person中间值人工复核。执行后重新生成YOLO标签python tools/gen_yolo_labels.py --occlusion-thresh 1.24.3 现象Mac上训练到第87轮时CUDA error实际是Metal报错原因M系列芯片的Unified Memory在长时间训练中产生碎片PyTorch Metal后端无法自动整理。解决在训练脚本中加入内存整理钩子# 在train.py的main()函数开头添加 if torch.backends.mps.is_available(): # 每20轮强制整理内存 if epoch % 20 0 and epoch 0: torch.mps.synchronize() torch.mps.empty_cache()4.4 现象CPU训练时worker进程频繁退出日志显示BrokenPipeError原因RetinexAug中的cv2.createCLAHE对象在多进程间无法共享导致子进程初始化失败。解决将CLAHE创建移至__getitem__内部并设置clipLimit2.0避免动态计算def __getitem__(self, idx): # ... 加载图像 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) yuv cv2.cvtColor(img, cv2.COLOR_BGR2YUV) yuv[:,:,0] clahe.apply(yuv[:,:,0]) img cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR) return img, label4.5 现象YOLO格式标签中出现负坐标如-0.002 0.345 0.123 0.456原因labelimg在极暗图像上手动标注时鼠标微抖导致框左上角超出图像边界XML中保存为负值转换脚本未做截断。解决运行tools/fix_neg_coords.py# 该脚本遍历所有txt文件将x,y,w,h映射到[0,1]区间 for line in lines: cls, x, y, w, h map(float, line.strip().split()) x max(0.0, min(1.0, x)) # 强制截断 y max(0.0, min(1.0, y)) w max(0.001, min(1.0, w)) # w/h不低于0.001防NaN h max(0.001, min(1.0, h)) # 重写文件...5. 验证不是看mAP用三类夜间专项指标检验模型是否真能落地5.1 构建夜间专属验证集从原始1000张中拆出200张“地狱模式”子集通用验证集如COCO val对夜间检测毫无意义。本数据集提供val_dark_subset/目录包含200张极端场景图低照度组80张图像平均亮度158bit无任何人工光源强干扰组70张含车灯眩光、霓虹广告牌反射、雨滴拖影结构缺失组50张仅可见行人头部/手部/反光条躯干完全融入背景。验证脚本val_night.py输出三类指标指标计算方式合格线说明Dark-Recall0.5低照度组中IoU≥0.5的召回率≥0.75衡量暗部检测鲁棒性Glare-mAP0.5:0.95强干扰组的mAP0.5~0.95步长0.05≥0.52衡量抗干扰能力Partial-F1结构缺失组的F1-scoreprecision/recall调和≥0.68衡量部件级推理能力提示运行命令python val_night.py --data data/night_person.yaml --weights runs/train/night_yolo11_v1/weights/best.pt --task val_dark_subset结果自动写入val_dark_subset/results.txt。5.2 可视化诊断用Grad-CAM定位模型到底在看什么夜间检测失败常因模型关注错误区域如把路灯当行人。用tools/gradcam_night.py生成热力图# 加载模型时启用hook model attempt_load(runs/train/night_yolo11_v1/weights/best.pt) target_layers [model.model[-2]] # 指向Detect层前的卷积 cam GradCAM(modelmodel, target_layerstarget_layers) # 对单张暗图生成热力图 rgb_img cv2.imread(val_dark_subset/001.jpg)[:, :, ::-1] # BGR→RGB input_tensor preprocess_image(rgb_img) # 归一化to_tensor grayscale_cam cam(input_tensorinput_tensor, targetsNone) # 叠加热力图到原图重点看暗区是否高亮实测发现未用RetinexAug的模型在暗区热力值0.1而YOLO11模型在行人衣领反光处热力值达0.83证明其真正学到了低光特征。5.3 推理速度压测在目标硬件上实测FPS与功耗模型精度再高部署时掉帧就等于失败。提供tools/benchmark_hw.py脚本支持三类设备GPU记录torch.cuda.Event时间戳输出avg_latency_ms与max_latency_msCPU用time.perf_counter()测单帧统计100帧的P99延迟Mac调用psutil.sensors_battery()获取功耗M系列芯片特有。关键参数# benchmark_hw.py中预设配置 config { gpu: {warmup: 10, repeat: 100, batch_size: 1}, cpu: {warmup: 5, repeat: 50, threads: 4}, # 绑定到性能核 mac: {warmup: 8, repeat: 80, mps: True} }实测某安防NVRIntel Xeon E3-1230 GTX 1050 Ti上YOLO11在1080p视频流中达23.7 FPSP99延迟42ms满足实时分析需求。6. 进阶技巧用夜间数据集微调通用模型三步榨干COCO预训练权重的价值6.1 第一步冻结backbone只训练neck与head冷启动阶段通用模型如YOLOv8n在COCO上训练了300轮其backbone已具备强大特征提取能力但neckFPN/PAN和headDetect针对白天数据优化。夜间检测首要任务是让neck学会融合低光多尺度特征。操作# 修改train.py中的freeze逻辑 def freeze_backbone(model): for name, param in model.named_parameters(): if model.0 in name or model.1 in name or model.2 in name: # backbone层 param.requires_grad False else: param.requires_grad True # neck head可训练启动命令加--freeze 0冻结前0层即不冻结但代码中强制冻结backbone。此阶段用--epochs 30学习率设为--lr0 0.001比全训低10倍实测可使Dark-Recall0.5从0.31提升至0.58。6.2 第二步解冻backbone最后两层注入低光先验完全解冻backbone易导致灾难性遗忘。精准策略是只解冻C2f模块的最后两个cv2卷积层负责高层语义并在其后插入LLA-Attention# 在models/yolov8n_ll.yaml中定义 - [-1, 1, C2f, [512, True, 2]] # 原始C2f - [-1, 1, LLAAttention, []] # 新增低光注意力训练时用--unfreezepct 0.1解冻10%参数学习率回调为--lr0 0.0005。此阶段重点优化模型对暗部纹理的敏感度。6.3 第三步用知识蒸馏对齐白天-夜间特征分布夜间数据量少1000张直接训容易过拟合。借鉴YOLO11论文中的DistillLoss用COCO预训练模型teacher的neck输出作为监督信号约束student夜间模型的对应层输出# loss计算伪代码 teacher_feat teacher_neck(x) # teacher的FPN输出 student_feat student_neck(x) # student的FPN输出 distill_loss mse_loss(student_feat, teacher_feat) * 0.3 # 权重0.3 total_loss main_loss distill_loss在train.py中启用--distill标志即可激活。实测此步骤使Glare-mAP0.5:0.95提升6.2个百分点且验证集loss曲线更平滑。从那以后我每次接手夜间检测项目第一件事就是用tools/val_night.py跑一遍地狱验证集如果Dark-Recall0.5低于0.7宁可重标50张图也不调参——因为数据缺陷永远比算法缺陷更难debug。这份资源最珍贵的不是1000张图而是它逼你直面真实世界的光学限制而不是在PS调亮的幻觉里调参。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门