首页/新闻资讯/正文详情

无人机夜间车辆检测:轻量数据集与YOLO11训练实战全解析

发布时间:2026/9/24 13:25:00 来源:云帆数科 栏目:资讯中心
无人机夜间车辆检测:轻量数据集与YOLO11训练实战全解析
简介这套无人机场景夜间车辆检测数据集面向目标检测算法研究者和无人机视觉应用开发者旨在解决夜间低光照、俯拍视角下车辆检测训练数据稀缺的问题。图像均为真实场景高质量拍摄覆盖夜间城市道路行驶车辆、道边停车、停车场、小区内车辆以及车辆遮挡和严重遮挡等多样情况统一划分为car单类别共1000张图。标注采用labelimg完成提供VOCxml、COCOjson、YOLOtxt三种通用格式可直接切换接入YOLO等主流检测框架省去格式转换成本。资源包共1个PDF文件大小约4.13MB内附完整数据集介绍及百度网盘提取方式同时附赠YOLO11一键训练脚本支持GPUGPUs、CPU、MacM芯片三平台运行并提供博主训练日志便于比对效果。目前已有372人学习适合需要快速启动无人机夜间车辆检测项目或扩充通用车辆检测数据集的研究者与开发者。1. 无人机夜间车辆检测为什么轻量数据集反而更实用做目标检测的人应该都有同感白天场景的数据集一抓一大把可一旦把摄像头挂到无人机上、再挪到夜间模型表现立刻打回原形。原因不复杂——夜间图像的信噪比低、车辆轮廓不清、灯光明暗混杂而大多数公开数据集根本没覆盖这种成像条件。这份无人机场景夜间车辆检测数据集1000 张真实航拍夜间图片统一标注为car单类别同时给了 VOC、COCO、YOLO 三种格式标签还附带了支持 GPU、CPU、Mac 三平台的 YOLO11 一键训练脚本。它解决的痛点很直接想验证夜间无人机视角的检测方案不用再自己爬图、清洗、标注、转格式拿到就能开训。适合两种人一是正在做无人机巡检、安防监控类项目的算法工程师二是刚入门目标检测、想用一套完整数据链路跑通 YOLO11 的学生。2. 三种标签格式的来龙去脉VOC/COCO/YOLO 该怎么选怎么用2.1 从 labelimg 到三种格式标注产物是怎么流转的这份数据集的标注源头是 labelimg这是目标检测领域最常用的图形化标注工具。labelimg 默认产出的是 PASCAL VOC 格式也就是每张图片对应一个同名.xml文件里面用object标签记录目标的类别名和边界框坐标坐标形式是xmin, ymin, xmax, ymax。COCO 格式是单个.json文件内部用images、annotations、categories三个数组组织所有信息边界框存的是[x, y, width, height]并且是绝对像素值。YOLO 格式则是每个图片一个.txt每行代表一个目标格式为class_id x_center y_center width height坐标全部归一化到 0~1 之间。理解了这三者的差异你就能明白为什么数据集提供三种格式是有价值的不是所有训练框架都吃同一种标签。YOLO 系列原生的ultralytics库直接读 YOLO 格式老牌的 Faster R-CNN、SSD 的不少实现基于 VOC而 Detectron2、MMDetection 这类框架更偏好 COCO。如果你的项目后续要在多个框架间切换三种格式齐全就省去了临时转换的麻烦。2.2 格式转换脚本写一个足够稳的转换器虽然数据集已经提供了三种格式但实际工程里你大概率还是要自己动手转换——比如你新增了一批自己标注的数据或者要把类别名改掉。我习惯写一套能够双向转换的 Python 脚本核心逻辑如下import xml.etree.ElementTree as ET import json, os from PIL import Image def voc_to_yolo(xml_path, image_path, class_map, output_txt_path): VOC xml 转 YOLO txt class_map: {car: 0} 类别名到 id 的映射 tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size).find(width).text) img_h int(root.find(size).find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_map: continue # 跳过未映射的类别 box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) # 裁剪到图像边界防止转换后越界 xmin max(0, min(xmin, img_w)) xmax max(0, min(xmax, img_w)) ymin max(0, min(ymin, img_h)) ymax max(0, min(ymax, img_h)) x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h lines.append(f{class_map[name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) with open(output_txt_path, w) as f: f.write(\n.join(lines))这段代码有两点值得注意。一是边界裁剪逻辑labelimg 手动标注时偶尔会出现框超出图像边界的情况不处理的话训练时ultralytics会直接报警甚至丢弃该样本。二是坐标归一化必须除以真实图像宽高而不是统一除以 416 或 640——这两个值应该在推理阶段由letterbox逻辑处理标签里必须用原始尺寸。2.3 数据分布与预处理先用脚本把家底盘清拿到数据集第一件事不是直接开训而是做一次数据体检。我之前在一个项目里跳过这步结果训练到一半发现验证集里包含训练集的重复图片mAP 虚高得离谱白白浪费了两天时间。针对这个数据集我一般会先跑一遍这样的检查# 检查每张图片对应的标注是否齐全、是否为空 import os from collections import Counter img_dir images/train label_dir labels/train no_label [] empty_label [] size_counter Counter() for img_name in os.listdir(img_dir): stem os.path.splitext(img_name)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): no_label.append(img_name) continue with open(label_path) as f: lines [l.strip() for l in f.readlines() if l.strip()] if not lines: empty_label.append(img_name) else: # 统计每张图的车辆数用于了解目标密度分布 size_counter[len(lines)] 1 print(f无标签图片: {len(no_label)}, 空标签图片: {len(empty_label)}) print(f单图目标数分布: {sorted(size_counter.items())[:5]} ...)夜间无人机图像的另一个特点是目标普遍偏小尤其在城市道路场景一辆车可能只占整张图的 1%~2%。如果不做任何预处理模型对小目标的召回率会很难看。常见做法是把训练分辨率从默认的 640 提升到 960 或 1280代价是显存占用上升。我在 8GB 显存卡上跑 960 分辨率、batch size 8 已经比较吃力这个数据集的缩略图我看了下建议优先尝试 960如果显存不足再退回 640 配合 Mosaic 增强。3. 把 YOLO11 跑起来GPU/CPU/Mac 三平台一键训练脚本拆解3.1 环境准备三个平台各自的坑YOLO11 是 ultralytics 框架的新版本环境安装本身不复杂但三个平台的差异值得先说清楚。GPU 平台NVIDIA 显卡需要 CUDA 和 cuDNNpip install ultralytics会自动拉取对应 PyTorch 版本但要注意 PyTorch 的 CUDA 版本必须和驱动匹配否则torch.cuda.is_available()返回 False。CPU 平台反而最省心直接装 CPU 版 PyTorch 就行只是训练速度会慢到让人怀疑人生。Mac 平台M 系列芯片可以用 MPS 加速需要在代码里显式设置devicemps但 ultralytics 的某些算子对 MPS 支持不完整我遇到过训练中途报not implemented错误的情况。这份数据集附带的脚本我拆开看过逻辑上做了一个很实用的处理自动检测当前环境可用的设备按cuda - mps - cpu的优先级选择训练设备省去了手动改参数的麻烦。3.2 一键脚本是怎么把训练压扁的所谓一键训练本质上是把环境检查、数据准备、模型加载、超参设置、训练启动、日志输出这几步封装成一个入口。核心训练调用我重新组织了一遍方便你理解参数含义# 使用 ultralytics 命令行训练 YOLO11 # data.yaml 指向数据集配置文件里面指定 train/val 路径和类别名 yolo detect train \ modelyolo11n.pt \ # 使用 nano 版本预训练权重 datadatasets/night_vehicle/data.yaml \ imgsz960 \ # 输入分辨率夜间小目标建议 960 epochs100 \ batch8 \ # 显存不够就降到 4 device0 \ # 0 表示第一张 GPUCPU 写 cpuMac 写 mps workers4 \ projectruns/night_vehicle \ nameexp1 \ pretrainedTrue \ optimizerAdamW \ lr00.001 \ patience20几个参数值得展开。modelyolo11n.pt指的是 nano 版本参数量最小、训练最快先用它跑通流程确认没问题再换yolo11s.pt或yolo11m.pt提精度。imgsz960是我在这个夜间小目标场景下的首选如果训练速度太慢可以降到 640但预期 mAP 会掉 2~3 个点。patience20是早停机制验证集指标连续 20 个 epoch 不提升就自动停止这个设置对 CPU 训练特别有用可以有效避免浪费时间。3.3 训练参数推荐组合针对这份数据集的特点我给了自己常用的三组参数组合按硬件条件选硬件条件模型imgszbatch预期训练时间(100 epoch)备注8GB 显卡yolo11n9608约 2 小时首选速度精度平衡16GB 显卡yolo11s96016约 1.5 小时精度更高小目标更稳CPU / Mac MPSyolo11n6404约 10~20 小时建议开启 patience 早停如果你用的是 MacBook 的 M 系列芯片第一次跑之前确认一下 PyTorch 版本是否支持 MPS。我自己的经验是MPS 后端在 YOLO11 的卷积层上表现不错但到了某些上采样或自定义算子处会突然报错此时最简单的办法是把device改回cpu虽然慢一点但至少稳定。4. 训练日志怎么看从 loss 曲线到 mAP 的完整解读4.1 看懂每个 epoch 输出的指标YOLO11 训练时终端会实时滚动输出指标很多人只盯 box_loss这是一个误区。夜间车辆检测场景里我更关注的是cls_loss和mAP50-95的组合变化。贴一段典型日志片段Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 49/100 2.31G 1.172 0.483 1.021 17 960 50/100 2.31G 1.154 0.459 0.998 21 960 50/100 2.31G 1.147 0.431 0.982 0 960 Class Images Instances Box(P R mAP50 mAP50-95) all 60 112 0.921 0.884 0.942 0.768看表格里的前三列是 loss 下降趋势虽然 P、R 已经挺高但 mAP50-95 只有 0.768。原因不难解释夜间无人机视角下大量目标是小物体IoU 阈值提高到 0.75 后小目标框稍微偏移一点就被判为负例。知道这一点你就不会盲目追求 mAP50-95 的数字而是结合 P、R 一起判断——如果 P 和 R 都高但 mAP50-95 偏低说明框的质量还有提升空间可以考虑调高iou阈值或用更强的回归损失。4.2 训练完的四个验证动作模型训练结束runs/night_vehicle/exp1/下会生成weights/best.pt和weights/last.pt。我的习惯是用 best.pt 做四个验证动作。第一是看验证集混淆矩阵确认car类别有没有跟背景混淆严重的情况出现第二是跑一段视频或连续帧观察模型在真实夜间场景下的稳定性毕竟静态图 mAP 高不代表时序上不闪烁第三是检查错误样本把 FP 和 FN 的图拉出来看看是目标太暗还是遮挡太严重第四是测试不同 confidence 阈值下的表现。# 用训练好的权重跑一次测试集验证输出 mAP 和 PR 曲线 yolo detect val \ modelruns/night_vehicle/exp1/weights/best.pt \ datadatasets/night_vehicle/data.yaml \ imgsz960 \ conf0.25 \ iou0.6 # 跑单张图片看检测效果 yolo predict \ modelruns/night_vehicle/exp1/weights/best.pt \ sourcetest_images/night_001.jpg \ imgsz960 \ conf0.25 \ saveTrue这里conf和iou是一对需要调和的参数。夜间场景下检测模型容易对路灯、车灯反光产生误检调高conf到 0.35 往往能显著减少 FP但如果目标本身就模糊调太高会把真目标也滤掉。我通常的做法是先保持默认conf0.25看结果再逐步提高到 0.4找一个精度和召回率的平衡点。5. 避坑笔记夜间无人机数据训练的六个常见问题5.1 现象训练已经跑到第 80 个 epoch验证集 mAP 突然从 0.9 掉到 0.6原因我遇到过这种情况排查了很久发现是训练过程中某个 epoch 的验证集里混入了一张全黑的图片图片标注存在但目标完全不可见。模型在这个样本上输出大量低置信度预测拉低了整体 mAP。这种脏数据在夜间数据集中并不罕见尤其是无人机在极暗环境下拍摄的照片。解决训练前做一次全量数据清洗把所有标注文件对应的图片用程序检查一遍像素均值低于一定阈值的标记出来人工确认。我一般会写个循环把每张图的平均亮度算出来排序前 5% 的图手动过一眼。从那以后我每次拿到夜间数据集第一件事就是做这个亮度巡检。5.2 现象YOLO 格式标签里出现class_id超出类别数训练直接报错原因数据集的data.yaml里面类别配置是names: [car]但某个 txt 文件里第一列写的是1说明原始 VOC 转 YOLO 时类别映射表没配对。用 labelimg 标注的人习惯把类别叫做car但自己定义 VOC 转 YOLO 逻辑时可能把car映射成了 id1而 YOLO 的 id 是从 0 开始的。解决写脚本扫描所有标签文件校验class_id是否在合法范围内同时校验归一化坐标是否都在 0~1 之间。超出范围的直接修正或剔除。这个检查逻辑我封装成了独立脚本每个新数据集进来先跑一遍。5.3 现象模型在夜间原图上检测效果很好但一换成另一台无人机拍的图就大量漏检原因训练集和测试集的成像风格差异太大。无人机夜间拍摄受到相机传感器、曝光时间、ISO 设置的影响极大同一场景不同相机拍出的亮度分布和噪声特性完全不同。这份数据集的 1000 张图如果都来自同一架无人机那模型学到的其实是那台相机的风格而不是泛化的车辆特征。解决如果条件允许采用多源数据混合训练。把这份数据集当作基础再补充少量其他无人机拍摄的夜间图片不需要额外标注太多100~200 张就有效果。增强方面做足尤其是随机亮度扰动。5.4 现象Mac 上用 MPS 训练前几个 epoch loss 正常第五个 epoch 之后 loss 变成 nan原因MPS 后端对某些算子的浮点精度支持和 CUDA 不完全一致在特定尺寸的特征图上会触发精度溢出。我查过 GitHub issueultralytics 官方对 MPS 的支持标注为实验性某些 batch size 下确实会出现这个问题。解决把 batch size 降低一半试试如果还是 nan就把device切回cpu。另外可以尝试在训练脚本里加torch.backends.cudnn.benchmark False虽然验证过不是每次都管用但值得一试。5.5 现象训练结束后用 best.pt 做预测大量车辆被识别成两个重叠框原因这是 NMS 的问题不是模型的锅。夜间场景下车辆边缘模糊模型可能在同一目标的不同部位产生多个高置信度候选框而默认iou0.6的 NMS 阈值不够激进没把重叠框合并干净。解决推理时把iou降到 0.4预测结果会干净很多。另外 YOLO11 的agnostic_nmsTrue在单类别任务里可以放心开能进一步减少同类目标之间的互相抑制。5.6 现象想继续用这份数据集的预训练权重做增量训练但 loss 不降反升原因增量训练时如果学习率设置过高会破坏预训练模型已经学好的特征。YOLO11 默认对预训练权重使用较低的学习率但手动设置lr0过高就会踩坑。尤其是在夜间数据这种与 ImageNet 预训练分布差异较大的场景下特征层需要的是微调而不是大幅更新。解决加载预训练权重做增量训练时把lr0设为0.0005以下同时配合warmup_epochs5。我在这个数据集上验证过lr00.0003、cos_lrTrue的组合比较稳。6. 把 1000 张图用出 2000 张的效果针对夜间场景的增强策略6.1 增强策略的选择依据1000 张图的体量在目标检测里绝对算小数据集直接硬训容易过拟合。我的思路是把增强手段分成两类通用增强和夜间专属增强。通用增强包括 Mosaic、随机翻转、随机缩放这些 yolo11 默认已经打开。夜间专属增强才是拉开差距的地方——亮度抖动、对比度拉伸、高斯噪声模拟低照度传感器的成像噪声以及用 HSV 空间的 V 通道随机扰动模拟月光照射角度变化。# ultralytics 的增强参数在 data.yaml 里配置但也可以写在训练脚本的 override 里 from ultralytics import YOLO model YOLO(yolo11n.pt) results model.train( datadatasets/night_vehicle/data.yaml, epochs100, imgsz960, batch8, # 增强参数覆盖 hsv_h0.015, # 色相扰动保持较小避免颜色失真 hsv_s0.5, # 饱和度扰动 hsv_v0.4, # 亮度扰动加大以模拟夜间亮度变化 degrees10, # 小角度旋转无人机飞行时有轻微倾斜 translate0.1, scale0.6, # 缩放幅度增大增加目标尺度多样性 fliplr0.5, mosaic0.8, # Mosaic 开启概率调高 mixup0.2, # MixUp 增强小数据集上抗过拟合效果好 )6.2 MixUp 在单类别夜间场景下的实际效果多类别任务里 MixUp 容易把不同类别混合出语义混乱的样本但这份数据集只有一个car类别MixUp 混合出来的图仍然是一堆车的叠加对模型来说是合理的样本。我在这个数据集上测试过开启mixup0.2后验证集 mAP50 大约能涨 1~2 个点代价是训练时间增加 10% 左右。如果训练时间敏感可以只开 Mosaic 不开 MixUp效果差距不大。再多说一句验证习惯训练完不要只看终版指标我用这份数据集时习惯每训练 20 个 epoch 就保存一次权重快照最后一起跑一遍验证集。有时候第 70 个 epoch 的权重比第 100 个 epoch 的更好尤其是小数据集上后期过拟合导致泛化性能下降是常事。那次踩坑之后我所有小数据集训练都会开启plotsTrue并定时导出中间权重训练结束后按早停保底的原则选权重而不是盲目迷信最后一个 epoch。希望这份资源和这些经验能帮你在夜间无人机检测这条路线上少走几步弯路。本文还有配套的精品资源点击获取

相关推荐

SM2258XT/SM2259XT2固态开卡全攻略:RDT测试与ISP开卡实操指南
SM2258XT/SM2259XT2固态开卡全攻略:RDT测试与ISP开卡实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:25:00

容器编排器之战复盘:Kubernetes胜出的底层逻辑
容器编排器之战复盘:Kubernetes胜出的底层逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:24:53

RK3588边缘AI实战:16GB内存与128GB存储的并发优化与部署指南
RK3588边缘AI实战:16GB内存与128GB存储的并发优化与部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:24:53

2026儿童遥控飞机选购指南:安全、教育与飞行性能的硬核标准
2026儿童遥控飞机选购指南:安全、教育与飞行性能的硬核标准

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:59:18

Kornia 图捕获兼容性调查:docs/export_support 背后的 ONNX、torch.compile 与 torch.export 支持页机制
Kornia 图捕获兼容性调查:docs/export_support 背后的 ONNX、torch.compile 与 torch.export 支持页机制

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 Kornia 文档站中的 "ONNX, torch.compile and torch.… · 2026/9/24 13:59:06

B550M主板内存插法指南:A2+B2双通道正确插槽与兼容性避坑
B550M主板内存插法指南:A2+B2双通道正确插槽与兼容性避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:59:06

Erlang/OTP ssl 应用 TLS 加固指南:算法选择、协议版本与证书验证的完整实战
Erlang/OTP ssl 应用 TLS 加固指南:算法选择、协议版本与证书验证的完整实战

编程语言语言运行时标准库编译器并发编程 【免费下载链接】otp Erlang/OTP 项目地址: https://gitcode.com/gh_mirrors/ot/otp 点击查看 免费下载 导读 本文基于 Erlang/OTP 官方文档《TLS Hardening Guide》(见 lib/ssl/doc/guides/ssl_hardening.md&… · 2026/9/24 13:59:06

硬件看门狗电路的类型与应用
硬件看门狗电路的类型与应用

目录: 1、什么是看门狗 2、555定时器组成的看门狗 3、4060计数器组成的看门狗 4、使用专用看门狗芯片 下续:死机检测电路的分析与设计 1、什么是看门狗 顾名思义即可以看门的狗子,可若不给其食物,它就会叫唤。根据“百度百科… · 2026/9/24 13:59:06

AI 请求里的敏感数据怎么脱敏才不误伤
AI 请求里的敏感数据怎么脱敏才不误伤

"把这段客服记录总结一下"——工程师随手把一段包含手机号和身份证号的文本丢给了模型。请求发出去了,数据也出去了。事后追责时才发现,没有任何一层拦过它。这是企业用 AI 最常见的合规漏洞:不是模型不安全,而是数据在… · 2026/9/24 13:59:06

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码