首页
/ Ultralytics xView 卫星目标检测数据集实战指南:从手动下载、GeoJSON 自动转换到 YOLO26 训练

Ultralytics xView 卫星目标检测数据集实战指南:从手动下载、GeoJSON 自动转换到 YOLO26 训练

2026-09-04 14:43:29作者:农烁颖Land

xView 是目前规模最大的公开卫星影像目标检测基准之一:60 个细粒度类别、100 万+ 目标实例、0.3 m 分辨率的 WorldView-3 遥感影像。本篇以 Ultralytics 官方数据集文档为核心,完整讲解 xView 的手动下载布局、xView.yaml 数据集配置、首次训练时的 GeoJSON 标注自动转换与 90/10 自动划分机制,并结合仓库源码剖析其底层实现,最终给出可直接运行的 YOLO26 训练代码与 CLI 命令。读完本文,你可以独立完成 xView 数据准备,并在卫星影像场景上训练出自己的检测模型。

数据集概览

xView 数据集由美国国家地理空间情报局(NGA)为 DIUx xView 2018 Challenge 发布,包含超过 1400 km² 的 0.3 m WorldView-3 影像,其中:

  • 目标实例总数超过 100 万
  • 60 个类别,覆盖飞机、车辆、铁路设备、船舶、工程设备和建筑;
  • 标注形式为水平边界框(bounding box);
  • 完整数据需手动下载约 20.7 GB

该数据集被创建用于推动四个计算机视觉前沿方向:

  1. 降低检测所需的最低分辨率;
  2. 提升学习效率;
  3. 发现更多目标类别;
  4. 改进细粒度类别的检测能力。

COCO 等地平视角基准不同,xView 面向俯视影像:目标更小、密度更高,对 目标检测 模型的定位精度提出了更苛刻的要求。

数据集结构与类别体系

xView 的影像为大尺寸 TIF 格式卫星场景。一个关键点:只有 847 张训练图附带公开标注,而 282 张竞赛验证图没有公开标签。因此 xView.yaml 配置会在首次使用时对已标注图像自动做 90/10 划分:

划分 图像数 说明
训练集 847 张的约 90% 首次运行时生成的 autosplit_train.txt 中列出的图像
验证集 847 张的约 10% autosplit_val.txt 中列出的图像,用于评估

60 个类别横跨多个细粒度层级,例如:Fixed-wing Aircraft(固定翼飞机)、Cargo Plane(货机)、Small Car(小型汽车)、Bus(公交车)、Locomotive(机车)、Maritime Vessel(船舶)、Excavator(挖掘机)、Building(建筑)、Aircraft Hangar(机库)、Storage Tank(储罐)等,完整清单见下文 Dataset YAML 一节。

另一个容易踩坑的细节:转换过程中,竞赛原始类别 ID(11–94)会被重映射为连续的 0–59 索引,保证与 YOLO 格式的类别编号一一对应(源码依据见 自动转换流程)。

手动下载与目录要求

xView 不会被自动下载。官方脚本中的自动下载 URL 已被注释,要求使用者自行操作:

  1. 在 xView 2018 Challenge 网站注册账号,人工下载 train_images.zip(约 15 GB)、train_labels.zipval_images.zip(约 5 GB);
  2. 将文件解压到 datasets/xView/,最终目录结构必须包含:
datasets/xView/
├── train_images/          # 847 张 TIF 卫星影像
├── val_images/             # 282 张 TIF 影像(无公开标签)
└── xView_train.geojson     # 边界框标注

首次训练时,Ultralytics 会自动将 GeoJSON 标注转换为 YOLO 格式,并把已标注图像按约 90/10 比例自动划分训练/验证集——无需手动转换。这一行为由 xView.yaml 中内嵌的 download: 脚本驱动(该脚本的注释明确要求:“Download and extract data manually to datasets/xView before running the train command”)。

Dataset YAML

数据集配置文件 xView.yaml 定义了数据集路径、60 个类别名称以及负责 GeoJSON 转换与自动划分的下载脚本,关键部分如下:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list
path: xView # dataset root dir
train: images/autosplit_train.txt # train images (relative to 'path') 90% of 847 train images
val: images/autosplit_val.txt # val images (relative to 'path') 10% of 847 train images

# Classes
names:
  0: Fixed-wing Aircraft
  1: Small Aircraft
  2: Cargo Plane
  3: Helicopter
  4: Passenger Vehicle
  5: Small Car
  6: Bus
  7: Pickup Truck
  8: Utility Truck
  9: Truck
  10: Cargo Truck
  11: Truck w/Box
  12: Truck Tractor
  13: Trailer
  14: Truck w/Flatbed
  15: Truck w/Liquid
  16: Crane Truck
  17: Railway Vehicle
  18: Passenger Car
  19: Cargo Car
  20: Flat Car
  21: Tank car
  22: Locomotive
  23: Maritime Vessel
  24: Motorboat
  25: Sailboat
  26: Tugboat
  27: Barge
  28: Fishing Vessel
  29: Ferry
  30: Yacht
  31: Container Ship
  32: Oil Tanker
  33: Engineering Vehicle
  34: Tower crane
  35: Container Crane
  36: Reach Stacker
  37: Straddle Carrier
  38: Mobile Crane
  39: Dump Truck
  40: Haul Truck
  41: Scraper/Tractor
  42: Front loader/Bulldozer
  43: Excavator
  44: Cement Mixer
  45: Ground Grader
  46: Hut/Tent
  47: Shed
  48: Building
  49: Aircraft Hangar
  50: Damaged Building
  51: Facility
  52: Construction Site
  53: Vehicle Lot
  54: Helipad
  55: Storage Tank
  56: Shipping container lot
  57: Shipping Container
  58: Pylon
  59: Tower

完整文件(含 60 类清单与内嵌 Python 下载脚本)见 ultralytics/cfg/datasets/xView.yaml。几个值得注意的配置细节:

  • train/val 指向 txt 文件而非目录:这是 Ultralytics 数据集配置支持的三种形式之一(目录、txt 文件列表、路径列表)。txt 由自动划分脚本生成,因此首次运行前这两个文件并不存在,check_det_dataset 检测到缺失后会触发 download 脚本来补齐(详见下文)。
  • 自动下载 URL 被刻意注释:脚本中保留了 train_labels.ziptrain_images.zipval_images.zip 三个 URL 注释,但 download(urls, dir=dir) 调用同样被注释掉,明确将下载行为留给人工完成——这是与 COCO 等可自动下载数据集的显著区别。
  • 脚本会重组目录:转换完成后,train_imagesval_images 会被重命名为 images/trainimages/val,与 train:/val: 字段指向的 images/autosplit_*.txt 布局对齐。

自动转换流程深入剖析

“首次训练自动完成标注转换与划分”是 xView 工作流的核心,其调用链在仓库中可完整追踪:

1. 触发点:check_det_dataset 执行内嵌脚本

训练入口 check_det_dataset(位于 ultralytics/data/utils.py)负责解析数据 YAML。当 val 路径不存在且 YAML 定义了 download 脚本、autodownload=True 时,框架会区分三种脚本类型执行:以 http 开头且以 .zip 结尾的按 URL 下载、以 bash 开头的执行 shell,其余按 Python 源码执行:

elif s.startswith("bash "):  # bash script
    subprocess.run(s.split(), check=True)
else:  # python script
    exec(s, {"yaml": data})

也就是说,xView.yaml 中 download: 字段下那段 Python 代码会在框架内部被 exec 执行,且共享变量 yaml 指向解析后的数据集字典。

2. GeoJSON 到 YOLO 标注:convert_labels

内嵌脚本的 convert_labels() 函数(xView.yaml)逐条遍历 GeoJSON 的 features

  • 读取每个目标的 bounds_imcoords"x1,y1,x2,y2" 像素坐标字符串)与 type_id
  • 通过一张 95 长的查找表 xview_class2index 将原始类别 ID 11–94 映射到 0–59,映射表中值为 -1 的条目表示该原始 ID 不纳入 60 类体系(例如被合并或剔除的类别):
# xView classes 11-94 to 0-59
xview_class2index = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, -1, 3, ...]
  • Image.open(image_file).size 读取每张 TIF 的真实宽高(按 image_id 缓存),再调用 xyxy2xywhn 完成坐标转换。该函数位于 ultralytics/utils/ops.py,核心逻辑是:clip=True 时先将边界框裁剪到图像范围内,再转换为归一化中心点+宽高格式:
y[..., 0] = ((x1 + x2) / 2) / w  # x center
y[..., 1] = ((y1 + y2) / 2) / h  # y center
y[..., 2] = (x2 - x1) / w       # width
y[..., 3] = (y2 - y1) / h       # height
  • 每行以 cls x y w h 六位小数写入 labels/train/<image_id>.txt。脚本还做了两层防御:单图标注转换失败只打印 WARNING 并跳过该条标注,不会中断整体流程;对缺失图像(注释指出 1395.tif 实际缺失)直接跳过。

3. 自动划分:autosplit

脚本最后调用 autosplit(定义于 ultralytics/data/split.py),它:

  • 默认权重为 (0.9, 0.1, 0.0),即 90% 训练、10% 验证、0% 测试,正好对应 xView.yaml 中 train:/val: 的 90/10 描述;
  • random.seed(0) 固定随机种子,保证每次生成的划分结果可复现
  • 将分配结果写入 autosplit_train.txtautosplit_val.txt(及 autosplit_test.txt),每行格式为 ./images/train/xxxx.tif(相对 images/ 的路径)。写入前会先删除已有的同名 txt 文件,避免重复累积。

因此首次训练日志中会依次出现:GeoJSON 加载与转换进度条、图像目录重命名、Autosplitting images from ... 信息。第二次训练时 val 路径已存在,脚本不再触发,直接复用既有划分。

训练 YOLO26

在手动解压数据到 datasets/xView/ 后,标注转换与划分自动完成,即可开始训练。以 100 个 epoch、图像尺寸 640 为例:

Python

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="xView.yaml", epochs=100, imgsz=640)

CLI

# Start training from a pretrained *.pt model
yolo detect train data=xView.yaml model=yolo26n.pt epochs=100 imgsz=640

两点实践提示:

  • data="xView.yaml" 会先按裸数据集名解析(check_det_dataset 支持将 xView 自动补全为 xView.yaml),并优先在框架内置的 cfg/datasets/ 目录中查找,无需把 YAML 拷贝到工作目录;
  • 60 个细粒度类别中大量小目标(Small Car、Motorboat、Shipping Container 等)对输入分辨率敏感,可根据显存适当上调 imgsz 以获得更好的细粒度定位效果。所有可调参数的完整清单见 训练模式文档

典型应用场景

xView 的细粒度类别与高分辨率俯视视角,使其成为遥感 深度学习 模型训练与评测的标准基准之一,常见落地方向包括:

  • 军事与国防侦察;
  • 城市规划与开发;
  • 环境监测;
  • 灾害响应与评估;
  • 基础设施测绘与管理。

若需要其他俯视影像基准,可参考面向无人机的 VisDrone 数据集,或使用旋转框的 DOTA-v2 数据集

引用与致谢

如果在研究或开发中使用了 xView 数据集,请引用以下论文(Lam et al., arXiv:1802.07856, 2018):

@misc{lam2018xview,
      title={xView: Objects in Context in Overhead Imagery},
      author={Darius Lam and Richard Kuzma and Kevin McGee and Samuel Dooley and Michael Laielli and Matthew Klaric and Yaroslav Bulatov and Brendan McCord},
      year={2018},
      eprint={1802.07856},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

感谢美国国防部创新单元(DIU)与 xView 数据集创建者对计算机视觉研究社区的贡献。

常见问题

如何下载并搭建 xView 数据集? xView 需要手动下载:在 xView 2018 Challenge 网站注册后下载 train_images.zip(约 15 GB)、train_labels.zipval_images.zip(约 5 GB),共约 20.7 GB,解压到 datasets/xView/ 并保证目录结构含 train_images/val_images/xView_train.geojson。首次训练时 Ultralytics 自动完成 GeoJSON 到 YOLO 格式的转换与 90/10 划分。

xView 有多少图像和类别? 847 张带标注训练图 + 282 张无公开标签的验证图,均为 WorldView-3 卫星 0.3 m 分辨率影像;标注覆盖 60 个类别、100 万+ 目标实例。由于只有训练集标签公开,xView.yaml 自动将 847 张已标注图像按约 90/10 划分为训练与验证集。

转换后的 YOLO 标注保存在哪里? 转换脚本将每张图像的标注写入 datasets/xView/labels/train/<image_id>.txt,每行一条 cls cx cy w h(归一化坐标)。图像目录随后被重排为 images/trainimages/val,并由 autosplit_*.txt 决定具体样本归属。

登录后查看全文
热门项目推荐
相关项目推荐