简介面向人工智能目标检测方向的学习者与研究者这是一套以卫星遥感图像为背景的飞机检测专用数据集。全部样本仅包含飞机一个类别图像为1024×1024高分辨率彩图共1000张JPG图片同时配齐1000份XML标注文件以边界框形式给出目标位置信息另有info.txt记录元数据整体压缩包约291.76MB。数据集文件总数为2000个JPEG与标注一一对应目录结构简洁便于接入TensorFlow SSD、YOLO、Faster R-CNN等常见检测框架也可直接用于模型训练、验证与泛化测试。已有633人学习下载适合需要单类别遥感目标检测训练数据、或希望针对复杂背景下小目标识别开展实验的初学者与算法开发者。1. 飞机卫星图3这个数据集遥感目标检测里最容易被低估的一类资源人工智能目标检测数据集飞机卫星图3这个标题看着像是一份普通的资源包但真正跑过遥感目标检测的人会知道它补的是整个链条里最缺的一环带可靠标注的卫星视角飞机样本。航拍和卫星图里的飞机目标和自然场景数据集里的猫狗完全是两回事——目标小、朝向任意、背景纹理复杂、同一架飞机在不同分辨率下长得都不一样。适合拿它做毕业设计、课题预研或者 YOLOv8 训练自己的数据集时的底料。它的核心价值不是有飞机图片而是省掉你从零开始采集和标注遥感样本的那几周时间。2. 拆解数据集的文件构成先看懂 JPEGImages、Annotations 和 ImageSets 再动手2.1 一个典型飞机卫星图数据集的三类核心文件拿到这份数据集第一件事不是急着训练而是把目录结构捋清楚。常见做法是延续 PASCAL VOC 的目录约定因为下游要转 YOLO、MMDetection 或者 Detectron2 都绕不开这套约定。你大概率会看到三个根目录JPEGImages/存放所有原始卫星/航拍图像。这里的图像一般已经做过裁剪和尺寸归一化而不是整幅大卫星图。整幅卫星图动辄几千乘几千像素直接送进检测网络显存直接爆炸所以数据集作者通常会按滑动窗口切好再手工筛选掉没有目标的切片。Annotations/每张图片对应的 XML 标注文件记录目标类别和边界框坐标。ImageSets/Main/划分训练集、验证集和测试集的文本文件每行一个不带扩展名的图片名。这个文件决定了你的训练集和验证集会怎么拆。如果你拿到的是已经转成 YOLO 格式的版本目录里会多出images/和labels/标注是 txt 文件而不是 XML。两种格式都有人用但原生的 VOC 格式信息更完整方便回溯检查。dataset/ ├── JPEGImages/ │ ├── plane_001.jpg │ ├── plane_002.jpg │ └── ... ├── Annotations/ │ ├── plane_001.xml │ ├── plane_002.xml │ └── ... └── ImageSets/ └── Main/ ├── train.txt ├── val.txt └── test.txt这个目录结构不是随便摆的ImageSets/Main/里的三个 txt 文件是数据划分的唯一入口。你改训练集和验证集的比例不是去挪图片而是重新生成这些 txt。不少人在这一步翻车图片和标注文件都齐全但训练脚本始终只用其中一个 txt 里的几十张图原因就是自己的图片名没写进对应 txt。2.2 标注文件里的关键字段bounding box 坐标和难例标记XML 标注文件的字段结构直接决定你后面写转换脚本的难度。一个有效标注通常长这样annotation folderJPEGImages/folder filenameplane_001.jpg/filename size width640/width height640/height depth3/depth /size object nameairplane/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin156/xmin ymin210/ymin xmax312/xmax ymax276/ymax /bndbox /object /annotation这里有两个字段需要额外留意。第一个是difficult值为 1 表示这个目标极难辨认训练时一般会过滤掉避免模型被噪声样本带偏。第二个是truncated表示目标是否被图像边界截断——卫星图里飞机停在机场边缘被裁掉一半的情况非常多这类样本在训练时会干扰回归损失转格式时建议单独统计一下数量。数据集的标注质量决定你后续少踩多少坑所以拿到手先别急着训练写个脚本把difficult1的样本挑出来看看占比是否异常。3. 把飞机卫星图数据跑进 YOLOv8格式转换脚本与训练前置步骤3.1 VOC 转 YOLO 的转换脚本目录映射与归一化坐标YOLOv8 默认使用class x_center y_center width height的归一化 txt 格式和 VOC XML 的绝对像素坐标完全不一样。转换脚本是每个跑遥感目标检测项目的人都绕不开的第一段代码。下面这段是我常用的转换逻辑可以直接抄import os import xml.etree.ElementTree as ET def xml_to_yolo(xml_path, class_names, img_width, img_height): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_names: continue if int(obj.find(difficult).text) 1: continue # 过滤难例防止训练被噪声样本干扰 bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) class_id class_names.index(name) x_center (xmin xmax) / 2.0 / img_width y_center (ymin ymax) / 2.0 / img_height box_width (xmax - xmin) / img_width box_height (ymax - ymin) / img_height lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}) return lines class_names [airplane] # 在图片名和宽高已知的前提下逐张调用把返回的 lines 写入同名 txt # 注意标签 txt 的文件名必须与图片文件名完全一致只是后缀不同这段脚本做的事情可以拆成四步解析 XML、过滤掉difficult样本、把边界框的绝对像素坐标归一化、把归一化结果写进 txt。最难绕的坑在x_center的计算上归一化公式的分母必须是当前图片的宽和高而不是整个数据集的统一尺寸。如果某个批次里图片尺寸是 640 乘 640另一个批次是 1024 乘 768混在一起按同一分母换算标注框全错位。转换前最好统一图片尺寸或者在脚本里按每张图的实际宽高动态取值。另外YOLOv8 的标签文件要求图片和标注 txt 放两个独立目录但同一个训练批次内图片名和标注根名必须严格对应。命名不匹配时模型不会报错只会静默丢掉没有标注的图片训练集直接缩水。3.2 数据集配置文件与首轮训练命令图片和标签都准备好之后还需要一个数据集描述文件YOLOv8 靠它找到图片路径和类别列表。文件内容是纯文本但路径写错会让训练进程直接中断# dataset.yaml path: /home/user/airplane_satellite/ train: images/train val: images/val test: images/test # 类别名必须和第 3.1 节转换脚本里的 class_names 顺序保持一致 nc: 1 names: 0: airplane配置好后训练命令没有太多花哨参数第一轮跑通最重要yolo detect train \ --model yolov8s.pt \ --data dataset.yaml \ --epochs 150 \ --imgsz 640 \ --batch 16 \ --workers 4 \ --project runs/airplane \ --name exp1这里的yolov8s.pt是预训练权重用它的意义是迁移学习而不是从零训练。遥感图像和 ImageNet 的自然图片分布差异很大但底层的纹理特征提取器依然有用。imgsz 640对大部分裁剪后的切片够用但如果你的数据里飞机目标小于 20 像素建议直接上 1024配合后面说的 anchor 调整。3.3 类别名和背景区域的处理遥感飞机检测有个容易忽略的差异点负样本。自然场景数据集通常每个目标都会有标注但卫星图切片里经常有大片停机坪、跑道、建筑物这些背景区域里没有飞机。YOLO 训练时背景区域由无标注的图片提供所以负样本图片必须保留在训练目录里不能只放有目标的图。很多人把没有目标的切片删掉结果模型在推理时对停机坪疯狂误报。4. 训练飞机卫星图模型的几个高频踩坑点小目标漏检、样本不平衡与过拟合4.1 小目标漏检成片卫星图飞机太小anchor 和 mosaic 要改飞机卫星图数据集里最常见的翻车现场是训练完 mAP 看着不错但一可视化停在跑道上的小飞机全部漏检。原因有两层。第一层是多数卫星图切片中飞机目标只占全图面积的 1% 不到默认的 anchor 尺寸偏大。第二层是 mosaic 增强把四张图拼接后小目标被进一步缩小梯度信号被大目标稀释。解决这一步的常见做法是按 41 或 31 的宽高比重新聚类 anchor。YOLOv8 的聚类工具会自动统计标注框的分布yolo detect anchors --data dataset.yaml --imgsz 640如果聚类出来的 anchor 最大值仍然偏大直接调高输入分辨率。我在实际项目中通常把imgsz从 640 提到 960配合关闭 mosaic 的最后 10 个 epochyolo detect train \ --model yolov8s.pt \ --data dataset.yaml \ --epochs 150 \ --imgsz 960 \ --batch 12 \ --close_mosaic 10close_mosaic 10的意思是最后 10 轮不用 mosaic 增强让模型在小目标尺度上做最终精细拟合这是小目标场景里很关键的一手调整。4.2 类别不平衡与难例之间的取舍飞机卫星图数据集如果标注了多种类别比如客机、战斗机、直升机那类别不平衡几乎不可避免。停机坪上客机数量远大于直升机模型会倾向于把一切长得像飞机的东西都判成客机。常见的处理思路有三种一是按类别数量做采样权重对少数类过采样二是把少数类单独抽出来做一次微调三是干脆把多类问题归并成单类飞机目标检测。第三种在遥感场景里最实用——如果你的项目只需要知道哪里有飞机就没必要让模型去区分机型类别合并能直接拉高不少召回率。4.3 白天和黑夜样本混在一起先看光照分布卫星图数据集的来源多样同一个机场的白天、黄昏、夜间红外成像差异巨大。如果混在一起训练模型的收敛速度会明显变慢因为同样一架飞机在不同光照下的特征分布差异比不同飞机的差异还大。我一般会先做一次光照分布统计把图片转成灰度图算均值方差按亮度分桶。如果数据量充足优先按光照分桶训练多个模型推理时按输入图像的亮度走对应模型如果数据量有限至少保证训练集和验证集里光照比例的分布一致否则验证集里某个时段的 mAP 会坍到个位数。4.4 可视化检查标注框找错标和漏标标注框检查几乎每次都很痛苦但绕不过去。用 matplotlib 把标注框画回原图肉眼翻一遍重点看三类异常框比飞机大一圈、框只框住飞机一半、一整片停机坪没有任何标注。前两类是标注精度问题最后一类是漏标会直接把模型带偏。import cv2 import numpy as np import xml.etree.ElementTree as ET image cv2.imread(plane_001.jpg) tree ET.parse(plane_001.xml) for obj in tree.getroot().findall(object): bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2) cv2.putText(image, obj.find(name).text, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(check_plane_001.jpg, image)这段脚本没有任何玄学成分就是最笨的检查方式但在目标检测数据集上它比任何自动校验工具都可靠。自动校验工具只能查出格式错误查不出语义错误——框画在飞机旁边但没框住飞机格式上完全合法。4.5 训练集验证集同源图像的坑按地块而不是按文件名随机拆这是整套流程里最容易翻车但最晚被发现的坑。卫星图数据集在制作时经常把同一片机场切成很多张 640 的切片这些切片之间有大量重叠区域。如果按文件名随机切分训练集和验证集同一架飞机会同时出现在两边验证集的评估结果虚高部署后效果断崖式下跌。正确的切分方式是按空间位置分桶。数据集文件名通常带行列号你在写ImageSets/Main/的划分脚本时要保证来自同一位置的行列号落在同一个集合里。如果文件名没有空间信息就按原图来源分组一组一张大图的所有切片必须同进同出。5. 用漏检率和误检率做验收可视化抽检与置信度阈值调整模型训练完下一步是把验证结果落到图上做人工复核。只看训练日志里的 mAP 是不够的遥感场景里 mAP 0.85 的模型可能在飞机密集的停机坪上漏掉一半目标。常见的做法是写一个批量预测脚本把预测框画回原图然后按漏检率抽样统计。yolo detect predict \ --model runs/airplane/exp1/weights/best.pt \ --source val_images \ --conf 0.25 \ --save-txt \ --save-conf \ --project runs/airplane \ --name val_predict--conf 0.25是默认置信度阈值但卫星图场景下可以往下压。飞机目标本身比较小模型对它的置信度天然偏低--conf 0.25可能直接过滤掉大量弱响应。建议用一组不同阈值做对比画一条漏检率和误检率的折线。阈值越低漏检越少但误检越多对机场里到底有没有飞机这种用途宁可误检也不能漏检。我实际做的时候会把阈值放到 0.1 以下再人工筛查。验证脚本画完图之后还有一个检查项值得做统计所有验证图片里预测框面积的中位数与标注框面积的中位数做对比。如果预测框整体偏小说明模型倾向于框住飞机的一部分而非整体常见原因是在close_mosaic阶段学习率没有降下来模型对目标的边界回归不充分如果预测框普遍偏大多半是训练集里混入了带大余白的标注框。最后收一个我自己的习惯每次拿到新的飞机卫星图数据集第一件事永远是跑 3.1 节那个转换脚本加 4.4 节那个可视化脚本先让标注框可视化结果过一遍眼睛再开始任何训练。这两个脚本一共不到一百行但能帮你快速判断这份数据集值不值得继续投入时间。如果可视化结果里框位普遍不准再强的训练配置也只是在垃圾数据上洗牌。目标检测项目里数据集的真实质量永远比模型的调参空间更值钱希望帮到你。本文还有配套的精品资源点击获取