Ultralytics xView 卫星目标检测数据集实战指南:从手动下载、GeoJSON 自动转换到 YOLO26 训练
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。
该数据集被创建用于推动四个计算机视觉前沿方向:
- 降低检测所需的最低分辨率;
- 提升学习效率;
- 发现更多目标类别;
- 改进细粒度类别的检测能力。
与 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 已被注释,要求使用者自行操作:
- 在 xView 2018 Challenge 网站注册账号,人工下载
train_images.zip(约 15 GB)、train_labels.zip和val_images.zip(约 5 GB); - 将文件解压到
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.zip、train_images.zip、val_images.zip三个 URL 注释,但download(urls, dir=dir)调用同样被注释掉,明确将下载行为留给人工完成——这是与 COCO 等可自动下载数据集的显著区别。 - 脚本会重组目录:转换完成后,
train_images、val_images会被重命名为images/train、images/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.txt、autosplit_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.zip、val_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/train 与 images/val,并由 autosplit_*.txt 决定具体样本归属。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00