Ultralytics YOLO27:

Dataset xView#

El dataset xView es uno de los mayores benchmarks de imágenes satelitales disponibles públicamente para la detección de objetos, con más de 1 millón de instancias de objetos de 60 clases anotadas con cajas delimitadoras en más de 1.400 km² de imágenes WorldView-3 de 0,3 m. Fue publicado para el Desafío DIUx xView 2018 por la Agencia Nacional de Inteligencia Geoespacial de EE. UU. (NGA) y requiere una descarga manual de unos 20,7 GB.

El dataset se creó para ampliar cuatro fronteras de la visión por ordenador:

  1. Reducir la resolución mínima para la detección.
  2. Mejorar la eficiencia del aprendizaje.
  3. Permitir descubrir más clases de objetos.
  4. Mejorar la detección de clases detalladas.

Basándose en benchmarks como COCO, xView se centra en imágenes aéreas, donde los objetos son mucho más pequeños y están más densamente agrupados que en las fotografías tomadas desde el suelo.

Descarga manual obligatoria

El dataset xView no se descarga automáticamente. Regístrate en el sitio web del Desafío DIUx xView 2018 para descargar train_images.zip (~15 GB), train_labels.zip y val_images.zip (~5 GB); después, extráelos en datasets/xView/ de modo que contenga:

datasets/xView/
├── train_images/          # 847 TIF satellite images
├── val_images/            # 282 TIF images (no public labels)
└── xView_train.geojson    # bounding-box annotations

En la primera ejecución del entrenamiento, Ultralytics convierte las anotaciones GeoJSON al formato YOLO y divide automáticamente las imágenes etiquetadas aproximadamente en una proporción 90/10 entre los conjuntos de entrenamiento y validación; no es necesaria ninguna conversión manual.

Características principales#

  • Clases detalladas: 60 clases de objetos que abarcan aeronaves, vehículos, material ferroviario, embarcaciones marítimas, equipos de construcción y edificios; muchas son pequeñas, poco frecuentes y visualmente similares.
  • Alta resolución: distancia de muestreo en el terreno de 0,3 m, obtenida de satélites WorldView-3.
  • Anotación densa: más de 1 millón de instancias de objetos en más de 1.400 km² de imágenes, todas etiquetadas con cajas delimitadoras horizontales.
  • Conversión automática: el script de descarga de Ultralytics convierte las etiquetas GeoJSON originales al formato YOLO y genera la división entre entrenamiento y validación en el primer uso.

Estructura del dataset#

Las imágenes de xView son grandes escenas satelitales en formato TIF, y solo las 847 imágenes de entrenamiento incluyen etiquetas públicas; el conjunto de validación del desafío, compuesto por 282 imágenes, no tiene ninguna. Por tanto, la configuración xView.yaml de Ultralytics divide automáticamente las imágenes etiquetadas en el primer uso:

SubconjuntoImágenesDescripción
Entrenar~90 % de 847Imágenes etiquetadas incluidas en autosplit_train.txt, generadas en la primera ejecución
Validación~10 % de 847Imágenes etiquetadas incluidas en autosplit_val.txt, utilizadas para la evaluación

Las 60 clases abarcan categorías detalladas como aeronave de ala fija, avión de carga, coche pequeño, autobús, locomotora, embarcación marítima, excavadora, edificio, hangar de aeronaves y tanque de almacenamiento; la lista completa se encuentra en el YAML del dataset que aparece a continuación. Durante la conversión, los identificadores de clase originales del desafío (11–94) se reasignan a índices contiguos del 0 al 59.

Aplicaciones#

Las clases detalladas y la perspectiva aérea de alta resolución de xView lo convierten en un benchmark estándar para entrenar y evaluar modelos de aprendizaje profundo en teledetección. Entre sus aplicaciones habituales se incluyen:

  • Reconocimiento militar y de defensa
  • Planificación y desarrollo urbanos
  • Monitorización medioambiental
  • Respuesta y evaluación ante catástrofes
  • Cartografía y gestión de infraestructuras

Para consultar otros benchmarks de imágenes aéreas, visita el dataset VisDrone, centrado en drones, o el dataset DOTA-v2, basado en cajas orientadas.

YAML del dataset#

El archivo xView.yaml define la configuración del dataset: las rutas del dataset, los nombres de las 60 clases y el script de descarga que convierte las anotaciones GeoJSON y genera la división automática. Se mantiene en el repositorio de Ultralytics, en https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/xView.yaml.

ultralytics/cfg/datasets/xView.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# DIUx xView 2018 Challenge dataset https://challenge.xviewdataset.org by U.S. National Geospatial-Intelligence Agency (NGA)
# --------  Download and extract data manually to `datasets/xView` before running the train command.  --------
# Documentation: https://docs.ultralytics.com/datasets/detect/xview
# Example usage: yolo train data=xView.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── xView ← downloads here (20.7 GB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
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

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import json
  from pathlib import Path
  import shutil

  import numpy as np
  from PIL import Image

  from ultralytics.utils import TQDM
  from ultralytics.data.split import autosplit
  from ultralytics.utils.ops import xyxy2xywhn

  def convert_labels(fname=Path("xView/xView_train.geojson")):
      """Convert xView GeoJSON labels to YOLO format (classes 0-59) and save them as text files."""
      path = fname.parent
      with open(fname, encoding="utf-8") as f:
          print(f"Loading {fname}...")
          data = json.load(f)

      # Make dirs
      labels = path / "labels" / "train"
      shutil.rmtree(labels, ignore_errors=True)
      labels.mkdir(parents=True, exist_ok=True)

      # 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, -1, 4, 5, 6, 7, 8, -1, 9, 10, 11,
                           12, 13, 14, 15, -1, -1, 16, 17, 18, 19, 20, 21, 22, -1, 23, 24, 25, -1, 26, 27, -1, 28, -1,
                           29, 30, 31, 32, 33, 34, 35, 36, 37, -1, 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, -1, 46,
                           47, 48, 49, -1, 50, 51, -1, 52, -1, -1, -1, 53, 54, -1, 55, -1, -1, 56, -1, 57, -1, 58, 59]

      shapes = {}
      for feature in TQDM(data["features"], desc=f"Converting {fname}"):
          p = feature["properties"]
          if p["bounds_imcoords"]:
              image_id = p["image_id"]
              image_file = path / "train_images" / image_id
              if image_file.exists():  # 1395.tif missing
                  try:
                      box = np.array([int(num) for num in p["bounds_imcoords"].split(",")])
                      assert box.shape[0] == 4, f"incorrect box shape {box.shape[0]}"
                      cls = p["type_id"]
                      cls = xview_class2index[int(cls)]  # xView class to 0-59
                      assert 59 >= cls >= 0, f"incorrect class index {cls}"

                      # Write YOLO label
                      if image_id not in shapes:
                          shapes[image_id] = Image.open(image_file).size
                      box = xyxy2xywhn(box[None].astype(float), w=shapes[image_id][0], h=shapes[image_id][1], clip=True)
                      with open((labels / image_id).with_suffix(".txt"), "a", encoding="utf-8") as f:
                          f.write(f"{cls} {' '.join(f'{x:.6f}' for x in box[0])}\n")  # write label.txt
                  except Exception as e:
                      print(f"WARNING: skipping one label for {image_file}: {e}")

  # Download manually from https://challenge.xviewdataset.org
  dir = Path(yaml["path"])  # dataset root dir
  # urls = [
  #     "https://d307kc0mrhucc3.cloudfront.net/train_labels.zip",  # train labels
  #     "https://d307kc0mrhucc3.cloudfront.net/train_images.zip",  # 15G, 847 train images
  #     "https://d307kc0mrhucc3.cloudfront.net/val_images.zip",  # 5G, 282 val images (no labels)
  # ]
  # download(urls, dir=dir)

  # Convert labels
  convert_labels(dir / "xView_train.geojson")

  # Move images
  images = Path(dir / "images")
  images.mkdir(parents=True, exist_ok=True)
  Path(dir / "train_images").rename(dir / "images" / "train")
  Path(dir / "val_images").rename(dir / "images" / "val")

  # Split
  autosplit(dir / "images" / "train")

Uso#

Descarga manual de 20,7 GB

El entrenamiento espera que la descarga manual descrita anteriormente se extraiga en datasets/xView/; después, la conversión de anotaciones y la división entre entrenamiento y validación se ejecutan automáticamente.

Para entrenar un modelo con el dataset xView durante 100 épocas y con un tamaño de imagen de 640, puedes utilizar los siguientes fragmentos de código. Para consultar la lista completa de argumentos disponibles, visita la página de entrenamiento del modelo.

Ejemplo de entrenamiento
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)

Para etiquetar imágenes satelitales adicionales y gestionar las ejecuciones de entrenamiento de xView desde el navegador, utiliza Ultralytics Platform.

Datos de ejemplo y anotaciones#

El ejemplo siguiente muestra una escena típica de xView: imágenes aéreas de alta resolución en las que objetos pequeños, como vehículos y edificios, están anotados con cajas delimitadoras, lo que ilustra por qué la detección de objetos en imágenes satelitales exige una localización detallada.

Imágenes satelitales aéreas del dataset xView con detección de objetos

Citas y agradecimientos#

Si utilizas el dataset xView en tu trabajo de investigación o desarrollo, cita el siguiente artículo:

Cita
@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}
}

Nos gustaría reconocer la contribución de la Unidad de Innovación de Defensa (DIU) y de los creadores del dataset xView a la comunidad de investigación en visión por ordenador. Para obtener más información, visita el sitio web del dataset xView.

Preguntas frecuentes#

  • El dataset xView es un benchmark de imágenes satelitales publicado para el Desafío DIUx xView 2018 por la Agencia Nacional de Inteligencia Geoespacial de EE. UU., que proporciona más de 1 millón de instancias de objetos de 60 clases detalladas en imágenes WorldView-3 de 0,3 m. Permite investigar la detección de objetos pequeños, poco frecuentes y detallados en vistas aéreas, objetivos mucho más difíciles que los de las fotografías tomadas desde el suelo.

  • xView requiere una descarga manual: regístrate en el sitio web del Desafío DIUx xView 2018, descarga train_images.zip (~15 GB), train_labels.zip y val_images.zip (~5 GB) —unos 20,7 GB en total— y extráelos en datasets/xView/ siguiendo la estructura que se muestra en el aviso de la parte superior de esta página. En la primera ejecución del entrenamiento, Ultralytics convierte automáticamente las anotaciones GeoJSON al formato YOLO y crea la división entre entrenamiento y validación.

  • xView contiene 847 imágenes de entrenamiento etiquetadas y 282 imágenes de validación sin etiquetas públicas, todas capturadas por satélites WorldView-3 con una resolución de 0,3 m. Las anotaciones abarcan más de 1 millón de instancias de objetos de 60 clases. Como solo son públicas las etiquetas de entrenamiento, la configuración xView.yaml de Ultralytics divide las 847 imágenes etiquetadas aproximadamente en una proporción 90/10 entre los conjuntos de entrenamiento y validación; consulta Estructura del dataset para obtener más información.

  • Entrena un modelo YOLO26n con xView durante 100 épocas y con un tamaño de imagen de 640:

    Ejemplo de entrenamiento
    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)

    Para consultar los argumentos y ajustes detallados, visita la página de entrenamiento del modelo.

  • Cita el artículo «xView: Objects in Context in Overhead Imagery» (Lam et al., arXiv:1802.07856, 2018); la entrada BibTeX completa se encuentra en la sección Citas y reconocimientos anterior.

Comentarios