简介:这是一份面向计算机视觉初学者与算法工程师的无人机目标检测与跟踪数据集,针对无人机监控、安全检查、航拍等场景下的识别与追踪需求,提供可直接用于模型训练的真实图像样本。压缩包共10113个文件,包含3371张jpg图像、3371个txt标签与3371个xml标签,jpg用于模型输入,txt提供YOLO格式边界框坐标,xml记录更详细的目标位置与类别信息,整体约144.55MB,覆盖大中小多种尺度、不同角度与环境条件。目前已有2576人学习下载。数据集可直接接入YOLO系列框架训练检测模型,也可结合deepsort等算法实现连续帧间的无人机轨迹跟踪,帮助读者完成从数据读取、标签解析到模型训练与跟踪验证的完整流程,是开展无人机视觉研究、课程实验与项目原型的实用基础资源。
1. drone 无人机数据集:目标检测与跟踪任务里,它到底能省掉哪几步
拿到drone-AI_make.zip这个数据集时,我第一反应不是急着解压看图片,而是先想清楚一件事:它要解决的是无人机视角下的目标检测与跟踪,而不是普通地面摄像头那套逻辑。无人机航拍带来的俯视角度、尺度剧烈变化、运动模糊、背景杂乱,会让很多在 COCO 上刷高分的模型直接翻车。这个数据集的价值就在于,它把「无人机看世界」的成像特性固化进了样本里,让你不用从零去爬航拍视频、逐帧标注、再清洗。
它适合三类人:一是做无人机视觉感知的算法工程师,想快速验证 YOLO 系列或跟踪器在航拍场景的迁移效果;二是做巡检、安防、农业监测的落地团队,需要一个小规模但场景对口的训练集来跑通流程;三是学生或转行者,想找一个能完整走完「标注格式转换 → 训练 → 评估 → 跟踪推理」闭环的数据集。如果你手里只有通用数据集,模型在无人机画面里往往会把地面的人车和空中的鸟、飞行器混在一起,而这份数据集的类别分布和视角分布,恰好能帮你把这类混淆压下去。
2. 拆开 drone-AI_make.zip:目录结构、标注格式与选型判断
2.1 先看目录再动手,别急着写 dataloader
拿到压缩包后,我一般先做一次「不动代码的侦察」。解压到一个干净目录,用tree或find看层级,重点确认三件事:图片放在哪、标注放在哪、有没有划分文件。常见的 drone 数据集组织方式有两种:一种是images/和labels/平行存放,文件名一一对应;另一种是按train/val/test分好,每个子集里再分 images 和 labels。前者需要你自己写划分脚本,后者可以直接喂给 YOLO 的data.yaml。
# 解压后先看两层目录,不要一上来就递归全部文件 unzip -q drone-AI_make.zip -d drone-AI_make cd drone-AI_make find . -maxdepth 2 -type d | sort # 统计图片和标注数量,判断是否配对完整 find . -name "*.jpg" -o -name "*.png" | wc -l find . -name "*.txt" | wc -l这段命令的逻辑是:先控制解压深度,避免压缩包里嵌套多层导致路径混乱;再用find统计图片和 txt 数量。如果两者数量差距超过 5%,大概率存在无标注图片或标注丢失,需要先清洗。参数上,-maxdepth 2只看到二级目录,足够判断结构;-q让解压安静执行,避免刷屏。
2.2 标注格式决定你后面走哪条路
drone 类数据集常见标注格式有四种:YOLO txt(class x_center y_center w h,归一化)、COCO json、VOC xml、以及跟踪用的 MOT 格式(frame id x y w h conf)。drone-AI_make.zip从命名看大概率是面向检测与跟踪的混合标注,你需要打开一个标注文件确认列数和数值范围。
| 格式 | 典型文件 | 关键字段 | 适用任务 |
|---|---|---|---|
| YOLO txt | 0001.txt | class, x, y, w, h(0~1) | 检测训练 |
| COCO json | annotations.json | bbox, category_id, image_id | 检测+评估 |
| VOC xml | 0001.xml | xmin, ymin, xmax, ymax | 检测转换 |
| MOT txt | gt.txt | frame, id, x, y, w, h | 多目标跟踪 |
判断方法很简单:用head看前几行,如果每行 5 个数值且后四个都在 0 到 1 之间,就是 YOLO 格式;如果每行 6 个以上且第一列是帧号,就是跟踪格式。选型上,如果你只做检测,优先转成 YOLO 格式,因为训练链路最短;如果要做跟踪,保留 MOT 格式并额外生成检测所需的图片序列。
2.3 类别分布和场景标签,决定你要不要重采样
无人机数据集最容易出现的问题是类别极度不平衡:天空背景占大半,小目标密集但样本少。我一般会写个脚本统计每个类别的框数量,再决定是否过采样或做 mosaic 增强。
import os from collections import Counter label_dir = "drone-AI_make/labels" counter = Counter() for name in os.listdir(label_dir): if not name.endswith(".txt"): continue with open(os.path.join(label_dir, name)) as f: for line in f: parts = line.strip().split() if parts: counter[parts[0]] += 1 print("类别分布:", counter.most_common()) # 如果某类少于总框数 5%,训练时就要考虑 copy-paste 或重采样这段代码遍历所有标注文件,按类别 ID 累计框数。参数上,parts[0]是类别索引,most_common()按数量降序输出。逻辑说明:只有先知道长尾有多长,才能决定后续是用YOLOv8的cls权重加权,还是直接在数据层做平衡。常见做法是,少于 5% 的类别在data.yaml里单独调高cls损失权重,或者用离线增强把样本补到 10% 以上。
3. 把 drone 数据集转成 YOLO 可训练格式:脚本、参数与验证
3.1 从 VOC 或 COCO 转 YOLO 的完整脚本
很多 drone 数据集原始标注是 VOC xml 或 COCO json,直接扔给 YOLO 会报格式错误。我一般写一个统一转换脚本,把两种格式都归一到 YOLO txt。核心是坐标归一化:x_center = (xmin + xmax) / 2 / width,y_center = (ymin + ymax) / 2 / height,w = (xmax - xmin) / width,h = (ymax - ymin) / height。
import os import json import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_path, img_dir, out_dir, class_map): tree = ET.parse(xml_path) root = tree.getroot() img_name = root.find("filename").text img_path = os.path.join(img_dir, img_name) w, h = Image.open(img_path).size lines = [] for obj in root.findall("object"): cls = obj.find("name").text if cls 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) xc = (xmin + xmax) / 2 / w yc = (ymin + ymax) / 2 / h bw = (xmax - xmin) / w bh = (ymax - ymin) / h lines.append(f"{class_map[cls]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}") out_path = os.path.join(out_dir, os.path.splitext(img_name)[0] + ".txt") with open(out_path, "w") as f: f.write("\n".join(lines)) # class_map 示例:{"drone": 0, "bird": 1, "person": 2}逻辑说明:先读图片真实宽高,再做归一化,避免用错尺寸导致框偏移。参数上,class_map必须和后续data.yaml的names顺序完全一致,否则类别会错位。:.6f保留六位小数,是 YOLO 官方推荐的精度,太少会丢框,太多没必要。转换完成后,务必抽查几张可视化,确认框和物体对齐。
3.2 生成 data.yaml 与训练/验证划分
YOLO 训练依赖一个data.yaml,里面写清楚路径、类别数和类别名。划分比例我一般用 8:1:1,但如果数据集本身有连续帧,必须按视频片段划分,不能随机打散,否则相邻帧同时出现在训练和验证集里,指标会虚高。
# data.yaml path: ./drone-AI_make train: images/train val: images/val test: images/test nc: 3 names: ["drone", "bird", "person"]参数说明:path是数据集根目录,train/val/test是相对路径。nc必须等于names长度。如果类别里有drone和uase无人机展金鹰奖这类长尾词对应的细分类,建议合并成大类,否则样本太少训不动。划分脚本可以用sklearn.model_selection.train_test_split,但记得先按视频 ID 分组再分。
3.3 用 YOLOv8 跑通第一轮训练的命令与参数
格式转好后,先用小模型和少量 epoch 验证链路,别一上来就上大模型。我一般用yolov8n.pt跑 10 个 epoch,确认 loss 能降、mAP 不是 0。
yolo detect train \ data=./drone-AI_make/data.yaml \ model=yolov8n.pt \ epochs=10 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=5 \ project=drone_runs \ name=baseline参数说明:imgsz=640是无人机小目标检测的常用输入尺寸,再小会丢小框,再大显存吃紧。batch=16根据显存调整,8G 显存可以降到 8。lr0=0.01是初始学习率,如果 loss 震荡就降到 0.001。patience=5表示 5 个 epoch 没提升就早停。跑完后看drone_runs/baseline/results.csv,重点看metrics/mAP50是否在上升。
4. 检测之外还要跟踪:drone 数据集在 MOT 流程里的接法
4.1 检测结果怎么喂给跟踪器
目标跟踪不是单独训一个模型就完事,常见做法是「检测 + 关联」。用 YOLO 逐帧检测,再把框和 ID 传给 ByteTrack 或 OC-SORT。drone 数据集如果自带 MOT 标注,你可以直接评估跟踪指标;如果没有,就用检测结果自己构建轨迹。
from ultralytics import YOLO import numpy as np model = YOLO("drone_runs/baseline/weights/best.pt") results = model.track( source="drone-AI_make/videos/test.mp4", tracker="bytetrack.yaml", conf=0.3, iou=0.5, persist=True ) # persist=True 保证帧间 ID 延续,conf 太低会引入假框,太高会断轨逻辑说明:model.track内部先检测再关联,persist=True让跟踪器记住上一帧状态。参数上,conf=0.3是无人机小目标的经验值,地面场景可以到 0.5;iou=0.5控制 NMS 重叠阈值,密集小目标可以降到 0.4。如果发现 ID 频繁跳变,先检查检测框是否抖动,再调跟踪器的track_high_thresh。
4.2 跟踪场景下的数据增强要注意什么
检测增强和跟踪增强不是一回事。跟踪要求帧间一致性,所以随机裁剪、随机翻转不能逐帧独立做,否则同一目标在相邻帧里位置突变,跟踪器直接懵。我一般对跟踪任务只用色彩抖动和轻微缩放,且同一段视频用同一组参数。
# 跟踪增强示例:按视频片段统一增强,而不是按帧 import cv2 import random def augment_clip(frames, brightness=0.2): delta = random.uniform(-brightness, brightness) out = [] for f in frames: img = f.astype(np.float32) + delta * 255 out.append(np.clip(img, 0, 255).astype(np.uint8)) return out参数说明:brightness=0.2表示亮度浮动 ±20%,再大可能让目标纹理丢失。逻辑上,同一片段用同一个delta,保证帧间光照一致。常见坑是直接套用检测的mosaic,结果跟踪 ID 全乱,血泪经验就是跟踪任务别开 mosaic。
4.3 评估跟踪效果:MOTA、IDF1 怎么看
跟踪评估常用 MOTA 和 IDF1。MOTA 综合漏检、误检和 ID 切换,IDF1 更关注 ID 保持能力。无人机场景里,ID 切换往往比漏检更致命,所以 IDF1 低于 0.5 就要回头查关联逻辑。
| 指标 | 含义 | 无人机场景经验阈值 |
|---|---|---|
| MOTA | 综合跟踪精度 | > 0.4 可用 |
| IDF1 | ID 保持能力 | > 0.5 较好 |
| ID Sw. | ID 切换次数 | 越低越好 |
| Frag | 轨迹碎片数 | 高说明检测不稳 |
如果 IDF1 低但 MOTA 还行,通常是检测框抖动导致关联失败,解决办法是加卡尔曼滤波平滑,或者提高检测置信度阈值。
5. 避坑与排查:drone 数据集训练跟踪时最容易翻车的 5 个点
5.1 现象:训练 loss 正常但 mAP 一直是 0
原因:类别索引错位。data.yaml的names顺序和标注文件里的 class id 不一致,模型学的是错类别。解决:用脚本重新核对每个类别的 id 映射,确保names[0]对应标注里的 0。
5.2 现象:小目标检测框大量漏检
原因:输入尺寸太小或 anchor 不匹配。无人机小目标在 640 下可能只有几个像素。解决:把imgsz提到 1280,或者用yolov8x这类大模型,同时开启close_mosaic让最后几轮用原图微调。
5.3 现象:跟踪 ID 频繁跳变
原因:检测框抖动或conf阈值过低。解决:先可视化检测结果,如果框在目标边缘跳动,提高conf到 0.4 以上,并在跟踪器里调大track_buffer。
5.4 现象:验证集指标远高于测试集
原因:随机划分导致相邻帧泄漏。解决:按视频 ID 或时间戳划分,确保同一段视频只出现在一个子集里。这个坑在无人机连续航拍数据里极其常见。
5.5 现象:训练到一半显存爆了
原因:batch太大或imgsz太高。解决:用batch=8加accumulate=2模拟大 batch,或者开启amp=True混合精度。别硬扛,显存不够就降尺寸,后悔药是没有的。
6. 进阶技巧:用 drone 数据集做半自动标注与难例挖掘
当你把 baseline 跑通后,真正拉开差距的是难例挖掘。我一般用训练好的模型对未标注的无人机视频做推理,把低置信度但高 IoU 的框挑出来,人工确认后加入训练集。这样一轮一轮迭代,比盲目加数据有效得多。
from ultralytics import YOLO import os model = YOLO("drone_runs/baseline/weights/best.pt") results = model.predict( source="drone-AI_make/unlabeled", conf=0.15, # 故意放低,捞回疑似目标 iou=0.6, save_txt=True, save_conf=True ) # 然后按 conf 排序,优先标注 0.15~0.35 之间的框参数说明:conf=0.15是为了召回更多疑似目标,save_conf=True保存置信度方便排序。逻辑是:高置信度框模型已经会了,低置信度框才是边界样本。把 0.15 到 0.35 之间的框导出成待标注列表,人工过一遍,通常能提升 3 到 5 个点的 mAP。
另一个技巧是「检测引导跟踪标注」:先用检测模型逐帧出框,再用跟踪器串成轨迹,人工只需修正 ID 切换点,比逐帧画框快十倍。这套流程在无人机巡检项目里我反复用过,省下来的时间够你多跑几轮实验。
最后说个习惯:每次改完数据或参数,先跑 1 个 epoch 看 loss 和可视化,别等 100 个 epoch 跑完才发现标注错了。这个习惯帮我省过至少一周的无效训练。希望帮到你。
本文还有配套的精品资源,点击获取