☰
无人机车辆检测数据集实战:VOC/COCO/YOLO格式转换与YOLO11训练避坑指南
2026/9/30 3:31:49 网站建设 项目流程

简介:面向无人机场景车辆检测的实战型数据集资源,适合从事目标检测算法学习与落地的开发者、学生及科研人员使用,可解决无人机视角下车辆目标识别样本不足、标注格式不统一的问题。数据集包含1000张真实场景高质量图片,覆盖城市道路行驶、道边停车、停车场、小区车辆以及车辆遮挡、严重遮挡等多种复杂场景,类别划分为轿车car、货车van和巴士bus三类,采用labelimg标注,并提供VOC、COCO、YOLO三种主流格式标签,可直接用于YOLO等算法训练。资源包共1个PDF文件,约2MB,内含数据集基本情况介绍与获取方式,并附赠YOLO11一键训练脚本,支持GPU、CPU及Mac芯片多平台训练方案,同时提供博主训练结果日志供参考。目前已有261人学习下载,能帮助读者快速搭建无人机车辆检测训练流程,完成从数据准备到模型训练的全链路实践。

1. 无人机视角下的车辆检测:这份 1000 张图的数据集到底能不能直接开训

拿到一份无人机场景的车辆检测数据集,第一反应通常不是“图好不好看”,而是“标注格式能不能直接喂进训练脚本”。这份资源给的是 1000 张真实无人机视角图片,覆盖城市道路行驶车辆、道边停车、停车场、小区内部以及车辆遮挡和严重遮挡等场景,类别只划了轿车 car、货车 van、巴士 bus 三类。它解决的核心问题很具体:你手头有一个无人机车辆检测的项目要落地,但自己从零采集和标注的成本太高,尤其是遮挡样本和小目标样本,靠人工补既慢又容易漏。这份数据适合做无人机视觉感知方向的目标检测训练与验证,也适合作为通用车辆检测数据集的场景补充。需要提前说清楚的是,资源本身托管在网盘,下载到的是一个 PDF,里面写了数据集基本情况介绍和获取方式,不是直接给你一个压缩包,这一点后面会专门讲怎么处理。

2. 三种标签格式怎么选:VOC、COCO、YOLO 的转换逻辑与目录结构

2.1 为什么同一批图要同时给三种格式

很多人看到 VOC、COCO、YOLO 三套标签会觉得冗余,实际上一线做项目时,这三套格式对应的是三条不同的工具链。VOC 的 xml 是 labelimg 的原生输出,适合做标注复核和二次修改;COCO 的 json 是很多评测脚本和论文复现实验的默认输入;YOLO 的 txt 则是 YOLO11 训练脚本直接读取的格式。数据集同时提供三种,意味着你不需要自己写转换脚本,省掉的恰恰是最容易出错的坐标归一化和类别映射环节。

常见做法是:先用 VOC 的 xml 在 labelimg 里抽查几十张,确认框的位置和类别没错,再用 YOLO 的 txt 直接开训,COCO 的 json 留着做 mAP 评测或者换框架时用。这个顺序能帮你把标注质量问题挡在训练之前,而不是等 loss 不降了才回头查。

2.2 三种格式的目录组织与字段对照

一份组织规范的目标检测数据集,目录通常长这样:

drone_vehicle_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels_yolo/ │ ├── train/ │ ├── val/ │ └── test/ ├── annotations_voc/ │ └── *.xml ├── annotations_coco/ │ └── instances.json └── data.yaml

YOLO 的 txt 每行是class_id x_center y_center width height,全部归一化到 0 到 1 之间;VOC 的 xml 里是绝对像素坐标的xmin ymin xmax ymax;COCO 的 json 里是[x, y, width, height]加category_id。这三种表达方式在转换时最容易翻车的地方是坐标取整和边界裁剪,尤其是无人机图片里车辆贴着画面边缘的情况,取整方式不对会让框偏移一两个像素,小目标上这个误差占比不小。

2.3 用脚本快速校验三种格式是否对齐

在开训之前,我一般会跑一段校验脚本,确认同一张图在三种格式下的框数量和类别一致:

import os import xml.etree.ElementTree as ET import json # 校验 VOC 与 YOLO 标签数量是否一致 def count_voc_boxes(xml_path): tree = ET.parse(xml_path) root = tree.getroot() return len(root.findall('object')) def count_yolo_boxes(txt_path): with open(txt_path, 'r') as f: lines = [l for l in f.readlines() if l.strip()] return len(lines) voc_dir = 'annotations_voc' yolo_dir = 'labels_yolo/train' mismatch = [] for xml_file in os.listdir(voc_dir): if not xml_file.endswith('.xml'): continue stem = os.path.splitext(xml_file)[0] txt_file = stem + '.txt' voc_count = count_voc_boxes(os.path.join(voc_dir, xml_file)) yolo_path = os.path.join(yolo_dir, txt_file) if not os.path.exists(yolo_path): mismatch.append((stem, voc_count, 'missing')) continue yolo_count = count_yolo_boxes(yolo_path) if voc_count != yolo_count: mismatch.append((stem, voc_count, yolo_count)) print(f'不一致样本数: {len(mismatch)}') for item in mismatch[:10]: print(item)

这段脚本的逻辑很直接:遍历 VOC 目录下的每个 xml,找到同名的 YOLO txt,比较object节点数量和 txt 行数。参数上你只需要改voc_dir和yolo_dir两个路径。如果输出不一致样本数为 0,说明两套标签是对齐的;如果不为 0,优先检查是不是有图片没有对应标签,或者标注时漏标了某个类别。这个检查花不了两分钟,但能避免训练到一半发现标签错位。

提示:无人机图片里车辆遮挡严重时,标注人员容易把被遮挡车辆漏掉,校验脚本能帮你把这类问题提前暴露出来。

3. YOLO11 一键训练脚本怎么跑:GPU、CPU、Mac 三平台的参数差异

3.1 训练脚本的核心结构与 data.yaml 配置

一键训练脚本的价值在于把环境判断、路径拼接和训练参数都封装好了,你只需要确认data.yaml写对。YOLO11 的data.yaml通常包含训练集、验证集路径和类别名:

path: ./drone_vehicle_dataset train: images/train val: images/val test: images/test names: 0: car 1: van 2: bus

这里path是数据集根目录,train和val是相对路径。类别顺序必须和 YOLO txt 里的class_id严格对应,0 是 car、1 是 van、2 是 bus,顺序错了模型会把货车认成轿车。常见做法是先把data.yaml里的路径改成绝对路径跑一次,确认能读到图之后再换回相对路径,避免因为工作目录不同导致找不到文件。

3.2 GPU、CPU、Mac 三平台的启动命令与关键参数

一键脚本一般会暴露几个入口参数,我按平台拆开说。GPU 平台是最常见的,启动命令类似:

python train_yolo11.py --data data.yaml --epochs 100 --imgsz 640 --batch 16 --device 0

--device 0指定第一块 GPU,--batch 16在 8GB 显存上比较稳,--imgsz 640是无人机图片常用的输入尺寸。如果你的显存只有 6GB,把 batch 降到 8,或者把 imgsz 降到 512,先保证能跑起来。

CPU 平台适合没有独显的机器做小规模验证:

python train_yolo11.py --data data.yaml --epochs 50 --imgsz 416 --batch 4 --device cpu

CPU 训练速度慢是客观事实,1000 张图跑 50 轮可能要几个小时,所以 imgsz 和 batch 都要压小,目的是验证流程通不通,不是追求精度。

Mac 平台(M 芯片)走的是 MPS 后端:

python train_yolo11.py --data data.yaml --epochs 100 --imgsz 640 --batch 8 --device mps

M 芯片的显存是统一内存,batch 给 8 到 16 一般没问题,但如果同时开着浏览器和 IDE,内存吃紧会直接报错,训练前把不用的应用关掉。

3.3 训练日志里该盯哪几个指标

脚本跑起来之后,日志里最该关注的是box_loss、cls_loss和mAP50。box_loss下降说明框的位置在收敛,cls_loss下降说明类别判断在变好,mAP50是最终你拿去汇报的指标。无人机车辆检测里,巴士 bus 因为尺寸大、特征明显,mAP 通常最高;轿车 car 数量多但小目标多,mAP 会低一些;货车 van 介于两者之间。如果训练到 30 轮左右cls_loss还在震荡,大概率是学习率偏大或者标注里有类别混淆,先回去抽查 van 和 car 的标注边界。

注意:一键脚本里的默认学习率是按通用数据集调的,无人机小目标场景可以适当调低,常见做法是从 0.01 降到 0.005 再观察几轮。

4. 避坑与排查:从 PDF 到可训练数据的五个真实翻车点

4.1 下载到的是 PDF 不是压缩包

现象:兴冲冲点开资源,发现只有一个 PDF 文件,里面没有图片和标签。 原因:数据集体积大,托管在网盘,PDF 只是介绍文档和获取入口。 解决:先通读 PDF 里的数据集基本情况介绍,按里面写的获取方式拿到真正的数据包,再解压到工作目录。不要试图把 PDF 当数据集直接喂给脚本。

4.2 解压后目录层级多了一层

现象:data.yaml里写的images/train读不到图,报No images found。 原因:压缩包解压后多套了一层同名文件夹,实际路径变成了drone_vehicle_dataset/drone_vehicle_dataset/images/train。 解决:用find . -name "*.jpg" | head确认图片真实位置,把data.yaml的path指到正确的那一层,或者把内层文件夹整体移出来。

4.3 类别顺序和标签对不上

现象:训练出来的模型把货车识别成轿车,mAP 看着不低但实际用不了。 原因:data.yaml里names的顺序和 YOLO txt 里class_id的映射不一致。 解决:随便抽一张图,用标注工具打开对应的 txt,看class_id是 0 还是 1,再和data.yaml对照。改names顺序比重标一遍快得多。

4.4 Mac 上跑 MPS 报内存不足

现象:训练刚启动就崩,提示MPS backend out of memory。 原因:M 芯片统一内存被其他应用占用,或者 batch 给太大。 解决:先把 batch 降到 4,imgsz 降到 416,关掉浏览器和多余应用再试。如果还不行,临时切到 CPU 跑通流程,确认数据没问题再回 MPS。

4.5 验证集 mAP 虚高但实际漏检严重

现象:mAP50跑到 0.9 以上,但拿新拍的无人机图去测,遮挡车辆基本检不出来。 原因:验证集和训练集来自同一批场景,分布太接近,模型过拟合了。 解决:从 1000 张里手动留出几十张遮挡最严重的图单独做测试集,不参与训练。如果这份数据里严重遮挡样本本身就不多,考虑做马赛克增强或者复制粘贴增强来补。

5. 把 1000 张图用出 3000 张的效果:小目标增强与训练结果验证

1000 张图在目标检测里不算大,尤其是无人机视角下车辆像素占比小,直接训容易欠拟合。我一般会做两件事:一是开 YOLO11 自带的马赛克增强和混合增强,二是针对小目标单独调 anchor 或者用更高分辨率的输入。马赛克增强在 YOLO11 里默认是开的,但mosaic概率可以手动调,常见做法是从 1.0 降到 0.5 再观察,因为无人机图片背景本来就复杂,过度拼接反而引入噪声。

验证环节不要只看mAP50,我习惯把训练好的权重拿几张典型图跑一遍推理,肉眼确认三类车的框有没有漏、有没有串类。下面这段推理脚本可以直接抄:

from ultralytics import YOLO # 加载训练好的权重 model = YOLO('runs/detect/train/weights/best.pt') # 对单张无人机图片推理 results = model.predict( source='test_images/drone_001.jpg', imgsz=640, conf=0.25, # 置信度阈值,遮挡场景可降到 0.2 iou=0.45, # NMS 的 IoU 阈值 save=True ) # 打印每个框的类别和置信度 for box in results[0].boxes: cls_id = int(box.cls[0]) conf = float(box.conf[0]) print(f'类别: {model.names[cls_id]}, 置信度: {conf:.3f}')

conf和iou这两个参数是推理阶段最值得调的。无人机车辆遮挡严重时,conf从 0.25 降到 0.2 能多召回一些被遮挡的车,但误检也会增加;iou调低会让重叠框保留更多,适合车辆密集的停车场场景。我的习惯是先在验证集上扫一遍conf从 0.1 到 0.5,看召回和误检的平衡点在哪,再定最终值。

还有一个容易被忽略的点:训练日志里博主提供的参考结果只能当参照,不能当基准。你的硬件、随机种子、数据划分比例只要有一项不同,最终指标就会有波动。我踩过的坑是直接拿别人的 mAP 去汇报,结果自己复现时差了五个点,被问得下不来台。从那以后我每次拿到新数据集,都强制先跑一轮小 epoch 的基线,把 loss 曲线和 mAP 曲线存下来,再决定要不要调参。希望这份无人机车辆检测数据集和 YOLO11 训练脚本,能帮你把无人机视觉感知的项目少走一段弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询