简介:面向无人机场景车辆检测的实战数据集,适合从事目标检测算法训练与落地的开发者、学生及科研人员使用,可解决无人机视角下车辆目标识别样本不足的问题。数据集包含1000张真实场景高质量图片,覆盖城市道路行驶车辆、道边停车、停车场、小区车辆以及车辆遮挡、严重遮挡等多种情形,类别划分为轿车car、货车van和巴士bus三类,采用labelimg标注,并提供VOC(xml)、COCO(json)、YOLO(txt)三种主流格式,可直接用于YOLO等算法训练。资源包为1个PDF文件,约2MB,内附数据集基本情况介绍与获取方式。随附YOLO11一键训练脚本,支持GPU(GPUs)、CPU及Mac(M芯片)多平台训练方案,并给出博主训练结果日志供参考。目前已有261人学习下载,可作为无人机场景通用车辆检测项目的数据补充与训练起点。
1. 无人机车辆检测数据集:1000 张图、三种标签格式与 YOLO11 一键训练到底怎么落地
拿到「无人机场景-目标检测-车辆检测数据集」这个标题,多数人第一反应是去找下载链接,但真正卡住工程进度的往往不是数据本身,而是标签格式对不上、训练脚本跑不通、换台机器就翻车。这个数据集的核心价值在于:1000 张无人机视角的车辆图像,同时提供 VOC、COCO、YOLO 三种标签格式,并且附带一套能在 GPU、CPU、Mac 三平台直接跑的 YOLO11 训练脚本。它解决的是从「拿到数据」到「跑出第一个可用模型」之间那段最磨人的路。适合两类人:一是做无人机视觉感知、小目标检测的算法工程师,想快速验证 YOLO11 在自己场景下的 baseline;二是刚接触目标检测的开发者,需要一个格式齐全、脚本现成、不挑硬件的练手项目。下面按「数据怎么用 → 脚本怎么跑 → 坑在哪 → 怎么调优」的顺序拆开讲。
2. 三种标签格式的差异与转换:VOC、COCO、YOLO 到底该用哪个
2.1 三种格式的坐标逻辑与适用场景
VOC 格式用xmin, ymin, xmax, ymax四个绝对像素值描述框,存在 XML 文件里,一张图一个 XML。它的好处是可读性强,标注工具支持最广,LabelImg、CVAT 都能直接导出。缺点是解析要写 XML 树遍历,批量处理时 IO 开销大。
COCO 格式把整份数据集的标注塞进一个 JSON,图像信息、类别、框坐标全在里面。框的坐标是[x, y, width, height],注意这里是绝对像素的左上角加宽高,不是归一化值。COCO 适合做多任务(检测、分割、关键点混在一起),也是很多预训练模型的默认输入格式,但单文件 JSON 在数据量大时解析慢,改一个框要重写整个文件。
YOLO 格式最简洁,每张图对应一个.txt,每行class_id x_center y_center width height,全部归一化到 0~1。它没有冗余信息,读取快,直接喂给 YOLO11 的 dataloader。缺点是脱离了图像尺寸就没法还原真实坐标,换分辨率时要重新算。
选哪个取决于你的下游任务。如果只是训 YOLO11,直接用 YOLO 格式,省去转换步骤。如果要拿这份数据去跑 MMDetection、Detectron2 或者做格式对比实验,COCO 更通用。VOC 适合作为中间交换格式,因为大多数标注工具都认它。
2.2 从 VOC 转 YOLO 的完整脚本与边界处理
实际拿到手的往往是 VOC,因为标注阶段用 LabelImg 最顺手。下面这个脚本把 VOC 的 XML 批量转成 YOLO 的 txt,处理了图像尺寸读取、类别映射、越界框裁剪三个容易翻车的点。
import os import xml.etree.ElementTree as ET from PIL import Image # 类别映射:根据你的数据集实际类别修改 CLASS_MAP = {"car": 0, "truck": 1, "bus": 2, "van": 3} def voc_to_yolo(xml_dir, img_dir, out_dir): os.makedirs(out_dir, exist_ok=True) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(".xml"): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) root = tree.getroot() # 用实际图像尺寸,不用 XML 里的 size,避免标注时尺寸写错 img_name = root.find("filename").text img_path = os.path.join(img_dir, img_name) with Image.open(img_path) as im: w, h = im.size lines = [] for obj in root.findall("object"): cls_name = obj.find("name").text.strip() if cls_name not in CLASS_MAP: continue 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) # 裁剪越界坐标,无人机图像边缘常有框超出画面 xmin, ymin = max(0, xmin), max(0, ymin) xmax, ymax = min(w, xmax), min(h, ymax) if xmax <= xmin or ymax <= ymin: continue # 裁剪后无效的框直接丢弃 xc = (xmin + xmax) / 2.0 / w yc = (ymin + ymax) / 2.0 / h bw = (xmax - xmin) / w bh = (ymax - ymin) / h lines.append(f"{CLASS_MAP[cls_name]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}") out_path = os.path.join(out_dir, xml_file.replace(".xml", ".txt")) with open(out_path, "w") as f: f.write("\n".join(lines)) voc_to_yolo("./annotations", "./images", "./labels")逻辑说明:先读图像真实尺寸而不是 XML 里的<size>,因为标注时尺寸字段经常是手填的,和实际图片对不上。越界裁剪这一步在无人机数据里特别重要,俯拍视角下车辆经常被画面边缘切掉,不裁剪会导致归一化坐标出现负数或大于 1,YOLO 训练时直接报错。类别映射用字典控制,没在字典里的类别跳过,避免引入无关标签。
参数说明:CLASS_MAP必须和你的data.yaml里的names顺序一致,否则类别 ID 错位,模型学出来的类别全是乱的。xc, yc, bw, bh保留 6 位小数足够,YOLO 内部会再处理。如果数据集里同一张图有多个类别,脚本会自动写多行,不需要额外处理。
2.3 COCO 与 YOLO 互转时最容易忽略的细节
COCO 转 YOLO 时,bbox字段是[x, y, w, h]绝对像素,转归一化要先除图像宽高。很多人直接拿annotations里的width, height去除,但 COCO 的images字段里记录的尺寸有时和实际文件不一致,尤其是经过裁剪增强后的数据。稳妥做法还是用 PIL 打开原图读尺寸。
另一个坑是 COCO 的category_id不连续。比如只有 car 和 bus 两类,category_id可能是 1 和 3,中间空了个 2。YOLO 要求类别 ID 从 0 连续递增,所以必须建一个category_id → 0-based index的映射表,不能直接把category_id当 YOLO 的 class_id 用。这个错误不会报错,但训练出来的模型会把类别 2 当成一个不存在的类,mAP 直接腰斩。
YOLO 转 COCO 相对少用,但做模型对比实验时需要。核心是把所有 txt 读进来,按图像分组,生成images、annotations、categories三个数组,注意annotation的id要全局唯一,image_id要和images里的id对应。写的时候用json.dump加indent=2,方便人工检查。
3. YOLO11 一键训练脚本在三平台上的跑通方法
3.1 环境配置:GPU、CPU、Mac 的依赖差异
YOLO11 通过 Ultralytics 包安装,核心命令是pip install ultralytics。但三平台的 PyTorch 安装方式不同,这是第一个分叉点。
GPU 平台(NVIDIA 显卡)需要装 CUDA 版的 PyTorch。先确认驱动支持的 CUDA 版本,用nvidia-smi看右上角的CUDA Version,然后去 PyTorch 官网找对应命令。常见的是pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121,cu121 对应 CUDA 12.1,按实际版本改。装完用torch.cuda.is_available()验证,返回True才算成功。
CPU 平台直接pip install torch torchvision,默认就是 CPU 版。训练速度会慢很多,1000 张图跑 100 epoch 在 CPU 上可能要几个小时,但验证流程完全没问题。
Mac 平台分两种:Intel 芯片用 CPU 版 PyTorch;Apple Silicon(M1/M2/M3)可以用 MPS 加速,安装命令和 CPU 版一样,但训练时指定device="mps"。MPS 的加速比纯 CPU 快,但不如 NVIDIA GPU,而且某些算子支持不完整,遇到报错就退回device="cpu"。
提示:三平台都建议用虚拟环境,conda 或 venv 都行。Ultralytics 依赖较多,全局安装容易和已有包冲突。
3.2 一键训练脚本的完整结构与参数含义
下面这个脚本封装了数据路径、模型选择、训练超参和平台判断,改几个变量就能跑。
import os import torch from ultralytics import YOLO # ========== 按实际情况修改 ========== DATA_YAML = "./dataset/data.yaml" # 数据集配置文件 MODEL_NAME = "yolo11n.pt" # n/s/m/l/x 按算力选 EPOCHS = 100 BATCH = 16 IMGSZ = 640 PROJECT = "./runs/train" NAME = "drone_vehicle" # =================================== def pick_device(): if torch.cuda.is_available(): return "0" # 第一块 GPU elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available(): return "mps" # Apple Silicon return "cpu" if __name__ == "__main__": device = pick_device() print(f"使用设备: {device}") model = YOLO(MODEL_NAME) results = model.train( data=DATA_YAML, epochs=EPOCHS, batch=BATCH, imgsz=IMGSZ, device=device, project=PROJECT, name=NAME, pretrained=True, optimizer="auto", lr0=0.01, lrf=0.01, warmup_epochs=3, patience=20, save=True, plots=True, ) metrics = model.val() print(f"mAP50: {metrics.box.map50:.4f}") print(f"mAP50-95: {metrics.box.map:.4f}")逻辑说明:pick_device()自动判断当前机器能用什么设备,避免手动改代码。model.train()里pretrained=True加载 COCO 预训练权重,1000 张图从零训容易过拟合,用预训练权重收敛更快。patience=20表示 20 个 epoch 验证指标不提升就早停,省时间。训练完自动跑model.val()输出 mAP,不用再单独写验证脚本。
参数说明:MODEL_NAME选yolo11n.pt最轻量,适合快速验证;如果 mAP 不够再换yolo11s.pt或yolo11m.pt,但显存占用和训练时间会上升。BATCH在 GPU 上可以设 16 或 32,CPU 和 Mac 上建议降到 8 或 4,否则内存吃紧。IMGSZ=640是 YOLO 默认值,无人机图像里车辆目标偏小,可以试 1024,但显存翻倍。lr0=0.01是初始学习率,配合lrf=0.01做余弦退火,如果 loss 震荡厉害就降到 0.005。
3.3 data.yaml 的写法与路径陷阱
YOLO11 靠data.yaml找数据和类别,格式如下:
path: ./dataset train: images/train val: images/val test: images/test names: 0: car 1: truck 2: bus 3: vanpath是数据集根目录,train/val/test是相对路径。常见翻车点是路径用了绝对路径但换机器后失效,或者train和val指向同一个目录导致验证指标虚高。1000 张图建议按 7:2:1 划分,即 700 训练、200 验证、100 测试。如果数据量少,至少保证验证集有 100 张以上,否则 mAP 波动大,看不出模型好坏。
另一个坑是names的顺序必须和标签里的 class_id 严格对应。前面 VOC 转 YOLO 时用的CLASS_MAP如果是{"car":0, "truck":1, "bus":2, "van":3},这里names就必须是同样的顺序。顺序错了不会报错,但模型会把 truck 认成 car,mAP 看着还行,实际全错。
4. 无人机车辆检测的避坑与排查:从 loss 不降到框全偏
4.1 训练 loss 不下降或震荡剧烈
现象:跑了几十个 epoch,box_loss和cls_loss几乎不动,或者上下大幅震荡。
原因通常有三个:学习率太大、数据标签有问题、预训练权重没加载上。先检查pretrained=True是否生效,看训练日志第一行有没有Transferred X/Y weights。如果没有,说明权重没加载,模型在从零学,收敛自然慢。学习率方面,lr0=0.01对 batch=16 是合理值,但如果 batch 降到 4 还用小学习率,梯度噪声大,loss 会震荡。可以试lr0=0.001配合cos_lr=True。
标签问题最隐蔽。用脚本抽查几张图的 txt,确认坐标都在 0~1 之间,类别 ID 没超范围。如果发现某张图的框全挤在左上角,大概率是 VOC 转 YOLO 时图像尺寸读错了,用了 XML 里的错误尺寸。
4.2 验证集 mAP 正常但实际推理框全偏
现象:训练日志里 mAP50 有 0.7 以上,但拿新图推理,框的位置明显偏移或者框住的是背景。
原因多半是训练和推理的预处理不一致。YOLO11 训练时默认做 letterbox 缩放,保持宽高比,填充灰边。推理时如果直接 resize 到 640×640 不填充,坐标映射就错了。用model.predict()时 Ultralytics 会自动处理 letterbox,但如果自己写推理代码,必须手动实现同样的缩放逻辑。
另一个可能是验证集和训练集分布差异太大。比如训练集全是白天图像,验证集混了夜间图,mAP 看着还行是因为验证集里白天占多数,但实际部署时夜间全翻车。检查方法是把验证集按场景分组,分别算 mAP,看哪个场景拖后腿。
4.3 小目标漏检严重
现象:大车能检出,远处的小车几乎全漏。
无人机俯拍图像里,车辆目标尺度差异极大,近处可能占 200×200 像素,远处只有 10×10。YOLO11 默认的 640 输入下,小目标经过 32 倍下采样后只剩几个像素,特征几乎消失。
解决方向有三个:一是提高输入分辨率到 1024 或 1280,让小目标保留更多像素;二是用yolo11m.pt或yolo11l.pt,大模型的 P3 检测头对小目标更友好;三是在数据层面做马赛克增强,Ultralytics 默认开启mosaic=1.0,把四张图拼成一张,变相增加小目标样本。如果还不够,可以试copy_paste增强,但需要额外配置。
4.4 Mac 上 MPS 报错或训练中断
现象:Apple Silicon 上device="mps"跑几个 epoch 后报RuntimeError: MPS backend out of memory或者算子不支持。
MPS 的显存管理和 CUDA 不同,它和系统内存共享,batch 设大了容易触发内存压力。先把BATCH降到 4 或 2,IMGSZ降到 512。如果还报算子不支持,通常是某个自定义层或损失函数用了 MPS 没实现的算子,直接退回device="cpu",虽然慢但稳定。Mac 上训练建议只做流程验证,正式训练还是用 GPU 机器。
4.5 类别不平衡导致某些类几乎检不出
现象:car 类 mAP 0.8,truck 类只有 0.1。
1000 张图里如果 car 占 90%,truck 只有几十个框,模型会偏向多数类。解决方法是先统计各类框数量,对少的类做过采样,或者用cls_pw参数给类别加权。Ultralytics 没有直接的类别权重参数,但可以在数据集层面复制含少类别的图像,或者用fraction参数控制采样比例。更彻底的做法是换 focal loss,但需要改源码,对新手不友好。
5. 把 1000 张图用透:小目标增强与训练策略的进阶技巧
1000 张图在目标检测里不算多,尤其无人机场景下小目标占比高,直接训很容易过拟合。我一般会做两件事:一是用 YOLO11 自带的增强参数把数据「撑大」,二是用分阶段训练策略先粗后精。
增强参数里,mosaic=1.0默认开启,但close_mosaic=10值得设,表示最后 10 个 epoch 关闭马赛克,让模型在真实分布上收尾,mAP 通常能涨 1~2 个点。scale=0.5允许随机缩放,模拟不同飞行高度。hsv_h=0.015, hsv_s=0.7, hsv_v=0.4做颜色扰动,应对不同光照。flipud=0.5和fliplr=0.5做上下左右翻转,无人机俯拍图像翻转后仍然合理,这个增强对车辆检测特别有效。
分阶段训练的做法是:先用yolo11n.pt在 640 分辨率下跑 50 epoch,快速看数据质量和类别分布;确认没问题后,换yolo11s.pt或yolo11m.pt,分辨率提到 1024,跑 100~150 epoch。第二阶段可以加载第一阶段的权重继续训,也可以从头训,后者更干净但更慢。我习惯从头训,因为第一阶段主要用来排查标签错误,权重质量一般。
验证时不要只看 mAP50,小目标检测要看 mAP50-95 和 mAP_s(小目标 mAP)。Ultralytics 的model.val()会输出metrics.box.map_s,如果这个值低于 0.1,说明小目标漏检严重,得回去调分辨率或换模型。另外,把验证集按目标尺寸分组,分别算 mAP,能更清楚看到模型在哪个尺度段最弱。
最后说一个我踩过的坑:1000 张图里如果有重复或高度相似的帧(无人机视频抽帧常见),训练集和验证集之间会泄漏,mAP 虚高。划分数据前先用感知哈希去重,或者按视频片段划分,同一段视频的帧只进训练集或只进验证集。这个习惯帮我省过好几次「上线就翻车」的后悔药。
希望帮到你。
本文还有配套的精品资源,点击获取