资讯动态

机场目标检测数据集构建全流程:从坐标转换到遥感切图实战

发布时间:2026/10/18 7:42:51 来源:尧图企业网站定制
简介面向机场遥感目标检测的数据集内含1000张1024×1024可见光机场卫星/遥感图类别统一为机场解决遥感场景下目标检测标注数据稀缺的问题。所有图片均按Pascal VOC标准生成XML标签可直接用于YOLO系列、SSD、Faster R-CNN等主流算法训练与调优适合机场设施识别、遥感图像分析方向的算法工程师及高校学生使用。压缩包大小约469.42MB共收录2000余个文件其中1000张JPG图片、1000个XML标注文件和1个TXT说明文件图片与标注一一对应目录清晰解压后即可接入常见深度学习框架节省数据预处理时间。目前已有866人学习下载数据代表性较强可有效支撑模型在遥感场景下的性能验证。对于需要快速获取带标注数据集来完成课程设计、毕业设计或算法对比实验的读者这套机场目标检测数据提供了直接、可靠的数据支撑有助于将更多精力放在模型设计与效果优化上。1. 机场目标检测为什么必须单独建一套数据集做人工智能目标检测机场数据集是个常被忽略却又绕不开的领域。通用目标检测公开数据集里的飞机十有八九是自然视角下的客机照片拿去做停机坪监控或卫星遥感识别模型会直接翻车——你训练它认飞机侧面它没见过俯视的机翼形态也没见过停机坪上被阴影切碎的机身。这个标题指向的机场数据集把机场图片、卫星图、遥感图三种形态放在一起覆盖了从地面近景到高空俯视的完整视角跨度。直接用途是训练飞机、航站楼、跑道、停机坪这类机场目标的检测模型适合做机场智能监控、飞行区运行管理、遥感地物识别的人。先别急着堆模型。这类数据集的难点不在网络结构而在视角差异、目标尺度落差和标注一致性这三件事上这正是本文要拆开讲的地方。2. 读懂机场数据集里的三类图像与坐标标签从解析到划分拿到机场数据集的第一件事不是训练而是把目录结构和标签格式彻底读明白。目标检测项目里相当一部分时间耗在坐标转换和格式对齐上机场这类遥感数据尤其如此。标注格式可能是Pascal VOC的XML、COCO的JSON也可能直接就是YOLO的txt。不管哪种落到训练阶段前都要统一成一套格式否则后面每个环节都要为格式差异买单。2.1 机场图片、卫星图、遥感图三种形态各自适合什么任务同一个机场数据集里为什么要分机场图片、卫星图、遥感图因为它们对应的任务和检测难点完全不同。我一般会先把样本按形态拆开看分布而不是直接把所有文件混进同一个训练目录。图像形态拍摄视角目标尺寸特征典型检测任务工程注意点机场图片地面或近景目标大、纹理清晰车辆、人员、廊桥识别遮挡多、近大远小卫星图高分辨率俯视飞机约几十到百余像素飞机检测、停机位占用目标朝向任意遥感图大幅面高空成像目标可能只有几个像素机场设施普查、地物识别背景纹理复杂这三类图不能当成同一堆数据对待。卫星图和遥感图里的飞机是俯视轮廓机场图片里的飞机是侧视或斜视模型从这两种视角学到的特征表达完全不同。如果混在一起训练且不控制比例大概率是大目标的机场图片主导损失更新俯视小目标在验证集上几乎不收敛。这个视角差异是机场数据集区别于普通目标检测数据集的根本特征。2.2 用Python解析VOC标注并转成YOLO格式的txtVOC格式在遥感标注里很常见转YOLO格式的核心是坐标换算VOC的bndbox是像素左上右下坐标YOLO需要的是归一化中心点和宽高。下面这段脚本我几乎每个数据集都会用换成COCO格式原理也一样只是解析JSON的路径不同。import xml.etree.ElementTree as ET CLASSES [aircraft, terminal, runway, apron, vehicle] def voc2yolo(xml_path, out_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.findtext(width)) img_h int(size.findtext(height)) lines [] for obj in root.iter(object): cls obj.findtext(name) if cls not in CLASSES: continue box obj.find(bndbox) x1 float(box.findtext(xmin)) y1 float(box.findtext(ymin)) x2 float(box.findtext(xmax)) y2 float(box.findtext(ymax)) if x2 x1 or y2 y1: continue x_center (x1 x2) / 2 / img_w y_center (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{CLASSES.index(cls)} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))这段逻辑里有个关键点图像宽高要从XML的size节点取不要用cv2去读图再拿shape。原因是一些数据集可能做过缩放但没同步更新XML直接从XML取宽高才能保证坐标口径一致。CLASSES的顺序就是训练时类别ID的映射表这个顺序一旦确定就不能改否则模型输出的类别含义全乱。转换完成后我会顺手做一个反向检查把YOLO格式txt读回来把框画到图像上人工抽查30到50张。这一步不花多少时间但能避免大量坐标错位和类别错位问题。2.3 训练集划分与类别分布检查动手前的最后一道关口机场遥感数据集的划分不能直接对单张图片随机切分。常见错误是一张大图被切成几十个tile后同一张原始图的切块同时进了训练集和验证集导致验证指标虚高——模型其实已经见过这个场景的邻居区域了。正确做法是先按原始影像编号分组再按组划分。import os import random tiles [f for f in os.listdir(images) if f.endswith(.jpg)] # 假设文件名格式为源图ID_切块序号.jpg source_ids [f.rsplit(_, 1)[0] for f in tiles] unique_sources sorted(set(source_ids)) random.seed(42) random.shuffle(unique_sources) split int(len(unique_sources) * 0.8) train_sources set(unique_sources[:split]) val_sources set(unique_sources[split:]) train_files [f for f in tiles if f.rsplit(_, 1)[0] in train_sources] val_files [f for f in tiles if f.rsplit(_, 1)[0] in val_sources]参数上8:2是常规比例样本量大可以到9:1。划分完还要统计每个类别的实例数和目标尺寸分布。我会打印一个类别分布表再对框的宽高做直方图统计。如果发现某个类别的数量比另一个类别少一个数量级以上先不要急着训练回去补样本或考虑类别重加权否则训练出来的模型在稀有类别上很难看。3. 遥感大图切图与增强策略把机场数据集喂进网络的预处理链路机场数据集里的卫星图和遥感图通常是大尺寸影像直接喂进目标检测网络是不现实的。这里需要一套完整的预处理链路先把大图切成训练能吃下的tile再同步处理标签坐标最后叠加针对机场场景的数据增强。这一步做得好不好直接决定后续训练是顺利还是反复翻车。3.1 滑动窗口切图让超大尺寸遥感图能进网络训练常见做法是用滑动窗口加重叠率来切图。tile尺寸常见的是1024或1280stride取tile的一半保证相邻tile有重叠区域降低目标被切在边界上的概率。下面是一个最小实现加了边缘收尾处理避免漏掉右侧和下侧的内容。import cv2 import os def slide_crop(img_path, out_dir, tile1024, stride512): img cv2.imread(img_path) if img is None: return h, w img.shape[:2] name os.path.splitext(os.path.basename(img_path))[0] idx 0 y 0 while y tile h: x 0 while x tile w: crop img[y:y tile, x:x tile] cv2.imwrite(f{out_dir}/{name}_{x}_{y}.jpg, crop) idx 1 x stride y stride # 处理右侧和下侧边缘避免尾部内容被丢掉 for y in range(0, h - tile 1, stride): x w - tile crop img[y:y tile, x:x tile] cv2.imwrite(f{out_dir}/{name}_edge_{x}_{y}.jpg, crop) for x in range(0, w - tile 1, stride): y h - tile crop img[y:y tile, x:x tile] cv2.imwrite(f{out_dir}/{name}_edge_{x}_{y}.jpg, crop)参数上tile越大单个tile中的全局上下文越完整模型能看到更大的飞机和停机坪结构但显存压力也随之增大stride越小目标被切断的概率越低代价是tile数量变多、训练样本冗余增加。显存有限时优先保tile尺寸再考虑stride因为小目标在1024和640下的表现差距非常明显。切图的同时要把文件名规则固定下来比如“源图ID_x_y.jpg”后面标签同步和按源图划分都会用到这个规则。3.2 同步切标注标签跟着图像一起转只切图不切标签等于白切。标签同步要做两件事把原图坐标系下的框平移到tile坐标系再裁掉超出tile边界的部分最后用保留面积比过滤掉被切碎的残框。这个保留面积比是切图任务里很关键的阈值。def shift_and_filter(label_path, x0, y0, tile, src_w, src_h, out_path, keep_ratio0.3): keep [] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls, cx, cy, bw, bh map(float, parts) # 归一化坐标转回原图绝对像素坐标 x1 (cx - bw / 2) * src_w y1 (cy - bh / 2) * src_h x2 (cx bw / 2) * src_w y2 (cy bh / 2) * src_h # 与tile区域求交 ix1, iy1 max(x1, x0), max(y1, y0) ix2, iy2 min(x2, x0 tile), min(y2, y0 tile) if ix2 ix1 or iy2 iy1: continue inter_area (ix2 - ix1) * (iy2 - iy1) orig_area (x2 - x1) * (y2 - y1) if inter_area / orig_area keep_ratio: continue # 裁剪后的框重新归一化到tile坐标系 nx1, ny1 ix1 - x0, iy1 - y0 nx2, ny2 ix2 - x0, iy2 - y0 new_cx (nx1 nx2) / 2 / tile new_cy (ny1 ny2) / 2 / tile new_w (nx2 - nx1) / tile new_h (ny2 - ny1) / tile keep.append(f{int(cls)} {new_cx:.6f} {new_cy:.6f} {new_w:.6f} {new_h:.6f}) with open(out_path, w) as f: f.write(\n.join(keep))逻辑说明先反算绝对坐标求交后看保留面积比例低于阈值的直接丢弃。这里最容易踩的坑是用“中心点是否落在tile内”来做过滤——对横跨两个tile的长目标比如一架停着的宽体客机中心点在tile A时tile B就丢了整框两边都不完整。保留面积比0.3是经验值太低会把残缺框学进去太高会让大量边界目标被丢弃。3.3 机场场景的增强选择旋转、尺度抖动、Mosaic怎么配机场数据集与自然场景的增强策略有一个显著差异机场俯视图中的目标朝向任意。飞机在停机坪上可能朝任何一个方向所以旋转增强不是“锦上添花”而是直接对应真实分布。地面近景的机场图片则相反上下翻转通常不适用因为塔台视角和地面视角有固定的语义方向。import albumentations as A train_transform A.Compose([ A.RandomRotate90(p0.5), A.Rotate(limit45, p0.5, border_mode0), A.RandomSizedBBoxSafeCrop(height640, width640, erosion_rate0.1, p0.3), A.HueSaturationValue(hue_shift_limit10, sat_shift_limit20, val_shift_limit20, p0.3), A.RandomBrightnessContrast(brightness_limit0.2, contrast_limit0.2, p0.5), ], bbox_paramsA.BboxParams( formatalbumentations, label_fields[class_labels], ))参数说明RandomRotate90对卫星图和遥感图几乎是必选0.5的概率旋转不会过度扭曲空间关系Rotate的45度范围用于补充90度旋转覆盖不到的斜向停靠RandomSizedBBoxSafeCrop做尺度抖动模拟同一机场在不同轨道高度下的目标大小变化。这里不做仿射变换机场目标形状刚性强拉伸变形会破坏飞机机身的几何特征。Mosaic增强不要在albumentations里硬拼直接交给训练框架的mosaic参数后面训练配置章节会讲。增强配好之后最关键的一步是抽一批增强后的图出来人眼检查一次确认框和内容没有错位。4. 模型选型与最小训练基线机场目标检测从配置到评估预处理链路跑通之后下一步是选模型、调配置、建立评估基线。机场数据集的检测任务有几个固有特点目标刚性强、朝向任意、尺度跨越大、背景纹理与目标相近。模型选择不必追求最新但必须对“小目标密度高”这个约束有清晰认识因为机场遥感图里的飞机和车辆在整图里往往只占很小一块区域。4.1 检测器选型小目标密度高的场景下什么是关键约束常见的选择是YOLO系、FCOS这类anchor-free检测器以及RetinaNet这类anchor-based检测器。三者都能完成机场目标检测但在小目标场景下的取舍不同。检测器anchor机制小目标表现工程成熟度适用建议YOLO系anchor-based / 部分版本 anchor-free依赖输入分辨率和特征层高工具链完整首选工业落地友好FCOSanchor-free配合FPN表现稳定中适合研究性对比RetinaNetanchor-basedfocal loss处理难易样本好中正负样本极不平衡时考虑单纯讨论网络结构意义不大真正决定机场场景效果的是输入分辨率和特征金字塔的最低层。模型默认从P3层起步做检测输入1280时P3层特征图也才160×160左右再往下的小目标就会被下采样直接吞掉。如果目标只有几个像素要么提高输入分辨率要么扩展P2层要么用推理时切图再拼接的办法。密度方面停机坪上的飞机是密集排布的水平矩形框之间会有大量重叠NMS参数需要相应调整IoU阈值可以放到0.5到0.6不要用默认的0.7。4.2 一套可复现的训练配置用YOLO跑机场数据集的启动命令我一般会用YOLO系列做第一版基线因为它的生态足够成熟数据格式、训练日志、模型导出都顺畅。先把数据集的路径和类别写进yaml文件类别顺序必须和前面转换脚本里的CLASSES保持一致。# airport.yaml path: /data/airport_dataset train: images/train val: images/val names: 0: aircraft 1: terminal 2: runway 3: apron 4: vehicle然后启动训练。下面的命令是我在做机场遥感小目标检测时的常用起点重点在于明确imgsz和mosaic的配合。yolo detect train \ modelyolov8s.pt \ dataairport.yaml \ imgsz1280 \ epochs120 \ batch16 \ lr00.01 \ mosaic0.8 \ workers8参数说明imgsz1280是遥感小目标场景的常见选择显存不够就回退到1024不要低于960mosaic0.8让80%的训练轮次使用四图拼接能显著增加小目标在每张图里的密度但训练后期要关闭mosaic让模型适应真实单图分布对应的参数是close_mosaic10表示最后10轮关掉。batch大小在16的基础上根据显存上下调整如果batch减半学习率最好也相应下调否则收敛不稳定。训练日志里重点看loss曲线的下降趋势如果loss在前30轮还横着走优先检查预处理链路而不是换模型。4.3 评估口径看总mAP还是看AP_S机场场景的指标取舍通用目标检测习惯看mAP50和mAP50-95机场数据集要额外盯AP_S小目标平均精度。我用验证命令跑完评估后会先看三个数AP50、AP_S、以及混淆矩阵里的background误报比例。yolo detect val \ modelruns/train/exp/weights/best.pt \ dataairport.yaml \ imgsz1280指标解读上AP_S比总mAP更能反映机场遥感图的真实水平。如果AP50好看但AP_S很低说明模型学的是停机坪上那些大飞机的特征小目标基本没学会。混淆矩阵里还要看background列——如果大量预测框落在背景区域说明停机坪纹理被当成了目标这是遥感场景的典型误报来源后面避坑章节会详细说。评估时还要注意不同切图参数下训练出来的模型不能直接对比mAPtile尺寸变了目标尺度分布就变了对比就成了玄学。5. 机场数据集应用中的高频坑现象、原因、解决机场数据集看起来就是一个普通目标检测任务实际跑起来踩坑点相当密集。下面这几条是我在多个机场场景数据集中反复遇到的每一条都按现象、原因、解决三个层面记录。5.1 目标在切图边界被截断标签和图像不同步现象训练loss持续在低位震荡验证集图像上出现大量只有半个机身的预测框真实框坐标超出tile边界。原因切图脚本只切了图片没有同步处理标签或者过滤策略用了“中心点是否落在tile内”。中心点法对横跨两个tile的长目标完全不适用——目标在tile A和tile B各占一半两边都被判为“不在范围内”直接丢弃。解决用3.2节的bbox求交方法按保留面积比过滤保留面积阈值取0.3。检查方法也简单随机抽一个切好的目录同时打开tile和对应txt看框的坐标是否都在640或1024以内。5.2 小飞机在验证集上漏检严重现象大飞机和建筑物的mAP正常AP_S低到接近零验证集里小飞机一张都检不出来。原因遥感图里的飞机可能只有十几个像素模型默认的P3特征层经过32倍下采样后这个目标在特征图上连一个点都算不上还有人习惯把整张遥感图直接resize到640输入几个像素的目标一缩放就没了。解决imgsz提到1280训练和验证都用同一分辨率显存足够时用P2特征层推理阶段可以用SAHI这类先切后验的方案把大图切成小图逐个推理再NMS拼接小目标召回率会有肉眼可见的提升。5.3 验证集指标好、实拍全崩域差异问题现象训练集和验证集都是卫星图mAP在0.8以上放到真实机场监控相机上测试大量漏检甚至把廊桥阴影当成目标。原因训练验证按单张随机划分时同一张原始大图的tile同时进了训练和验证验证指标虚高同时三种图像形态混在一个数据集里近景大目标主导梯度更新俯视小目标学不到。解决按源图分组划分这个分割逻辑在2.3节已经实现评估时按机场图片、卫星图、遥感图分别跑一次验证分别看指标而不是看汇总值。如果某类形态的样本数量明显不足收集该形态的数据比盲上数据增强有用得多。5.4 停机坪纹理被误报成飞机现象验证集pr曲线看着在涨打开可视化结果发现混凝土停机坪、草地、屋顶被框成了飞机背景误报占了所有预测框里的四成。原因滑窗切图时很多tile只有停机坪地面纹理没有飞机但这些样本被当成背景压在了训练集里模型学到的所谓“飞机特征”实际上是停机坪上的边缘纹理和颜色块。解决切一些完全没有目标的机场背景图作为负样本单独加入训练集做难例挖掘——跑一遍验证集把置信度最高且与真实标注IoU低于0.1的预测框找出来把对应的tile加入下一轮训练。这个循环跑两轮背景误报会明显减少。5.5 类别序号错位改了yaml忘了重新映射现象训练日志里类别损失不降预测结果中飞机全部被标成航站楼。原因标注txt里的class id和data.yaml的names列表对不上。常见场景是数据集的标签从别的工具导出的class id从1开始计YOLO里从0开始计差了一位或者你自己在转换脚本里调整了CLASSES的顺序但忘了同步更新yaml。解决转格式时把类别映射表写死到配置文件里不要靠“记得”每次跑训练前先执行一次标签统计脚本打印每个class id出现的实例数一眼就能看出哪一类异常缺失。这个检查成本极低能省下好几个小时的排查时间。6. 进阶用半自动标注与难例挖掘自建机场数据集让数据滚动升级拿到别人整理好的机场数据集只是起步真正让模型效果稳健的是自建数据集的闭环能力。机场数据集的标注成本比通用数据集高原因是遥感图和卫星图上的目标太小人工标注要放大到很高倍数才能看清。常见做法是先用已有模型做预标注再人工修正把标注成本降下来。from ultralytics import YOLO model YOLO(runs/train/exp/weights/best.pt) # 对未标注的新图出预标注结果 results model.predict( sourcenew_images/, conf0.65, imgsz1280, save_txtTrue, save_confTrue, )这段输出的txt就是预标注标签。逻辑上高置信度样本可以直接进入人工确认环节低置信度样本单独放一批让人工仔细分辨是难例还是背景误报。预标注不是全自动入库必须有人确认否则会把模型的错误学进去形成自我强化的偏见。人工修正时只改错框和补漏框不重复画框速度会快很多。难例挖掘是提升机场检测效果最有效的一招。每次训练完把验证集里置信度高于0.6但IoU低于0.1的预测框当成hard negative把这些框对应位置切出来作为负样本加入下一轮训练。对AP_S偏低的情况把小飞机漏检的验证图像也收集起来按形态聚类再针对性地补数据。数据版本管理在这个方向值得认真做。我一般用一张manifest表记录每次数据集的变更版本号、图源、切图参数、增强策略、标注轮次、是否清洗。这样每次训练结果都有据可查切图参数调整前后指标不可直接对比对比时必须锁定同一数据处理流程。版本控制配合难例挖掘每轮训练都在把数据集的短板补上模型指标会逐步爬升而不是反复震荡。我自己的习惯是每做一期机场数据集先花一晚上把原始大图从头到尾快速浏览一遍再决定tile尺寸和增强策略标签到位后先跑统计脚本查类别分布和尺寸分布再进入训练和评估。版本记录从第一天就写哪怕只是本地一个txt。这个习惯帮我避开了大量重复劳动也让指标变化都能落到具体的数据变更上。希望今天这份拆解也能帮到你少走一些弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑