Ultralytics YOLO27:

Dataset xView#

Il dataset xView è uno dei più grandi benchmark di immagini satellitari disponibili pubblicamente per il rilevamento degli oggetti, con oltre 1 milione di istanze di oggetti appartenenti a 60 classi, annotate con riquadri di delimitazione in più di 1.400 km² di immagini WorldView-3 da 0,3 m. È stato rilasciato per la sfida DIUx xView 2018 dalla U.S. National Geospatial-Intelligence Agency (NGA) e richiede un download manuale di circa 20,7 GB.

Il dataset è stato creato per ampliare quattro frontiere della visione artificiale:

  1. Ridurre la risoluzione minima per il rilevamento.
  2. Migliorare l'efficienza dell'apprendimento.
  3. Consentire l'individuazione di un numero maggiore di classi di oggetti.
  4. Migliorare il rilevamento delle classi a granularità fine.

Sulla scia di benchmark come COCO, xView è rivolto alle immagini aeree, in cui gli oggetti sono molto più piccoli e densamente raggruppati rispetto alle fotografie scattate da terra.

Download manuale obbligatorio

Il dataset xView non viene scaricato automaticamente. Registrati sul sito della sfida DIUx xView 2018 per scaricare train_images.zip (~15 GB), train_labels.zip e val_images.zip (~5 GB), quindi estraili in datasets/xView/ in modo che contenga:

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

Al primo avvio dell'addestramento, Ultralytics converte le annotazioni GeoJSON nel formato YOLO e suddivide automaticamente le immagini annotate, in proporzione approssimativa 90/10, in set di addestramento e convalida: non è necessaria alcuna conversione manuale.

Funzionalità principali#

  • Classi a granularità fine: 60 classi di oggetti che includono aeromobili, veicoli, materiale rotabile ferroviario, imbarcazioni marittime, attrezzature da costruzione ed edifici; molte sono piccole, rare e visivamente simili.
  • Alta risoluzione: distanza di campionamento al suolo di 0,3 m, acquisita dai satelliti WorldView-3.
  • Annotazioni dense: oltre 1 milione di istanze di oggetti distribuite su più di 1.400 km² di immagini, tutte etichettate con riquadri di delimitazione orizzontali.
  • Conversione automatica: lo script di download di Ultralytics converte le etichette GeoJSON originali nel formato YOLO e genera la suddivisione tra addestramento e convalida al primo utilizzo.

Struttura del dataset#

Le immagini xView sono grandi scene satellitari in formato TIF e solo le 847 immagini di addestramento sono distribuite con etichette pubbliche; il set di convalida della sfida, composto da 282 immagini, ne è privo. La configurazione xView.yaml di Ultralytics suddivide quindi automaticamente le immagini annotate al primo utilizzo:

SuddivisioneImmaginiDescrizione
Addestramento~90% di 847Immagini annotate elencate in autosplit_train.txt, generate alla prima esecuzione
Convalida~10% di 847Immagini annotate elencate in autosplit_val.txt, utilizzate per la valutazione

Le 60 classi comprendono categorie a granularità fine come aeromobile ad ala fissa, aereo cargo, automobile piccola, autobus, locomotiva, imbarcazione marittima, escavatore, edificio, hangar per aeromobili e serbatoio di stoccaggio; l'elenco completo è riportato nel file YAML del dataset qui sotto. Durante la conversione, gli ID delle classi originali della sfida (11–94) vengono rimappati su indici contigui 0–59.

Applicazioni#

Le classi a granularità fine e la prospettiva aerea ad alta risoluzione di xView ne fanno un benchmark standard per l'addestramento e la valutazione di modelli di deep learning nel telerilevamento. Le applicazioni comuni includono:

  • Ricognizione militare e per la difesa
  • Pianificazione e sviluppo urbano
  • Monitoraggio ambientale
  • Risposta e valutazione dei danni in caso di calamità
  • Mappatura e gestione delle infrastrutture

Per altri benchmark di immagini aeree, consulta il dataset VisDrone, incentrato sui droni, oppure il dataset DOTA-v2 con riquadri orientati.

YAML del dataset#

Il file xView.yaml definisce la configurazione del dataset: i percorsi del dataset, i 60 nomi delle classi e lo script di download che converte le annotazioni GeoJSON e genera la suddivisione automatica. È mantenuto nel repository di Ultralytics all'indirizzo 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")

Utilizzo#

Download manuale di 20,7 GB

L'addestramento presuppone che il download manuale descritto sopra sia stato estratto in datasets/xView/; la conversione delle annotazioni e la suddivisione tra addestramento e convalida vengono quindi eseguite automaticamente.

Per addestrare un modello sul dataset xView per 100 epoche con una dimensione delle immagini pari a 640, puoi utilizzare i seguenti frammenti di codice. Per un elenco completo degli argomenti disponibili, consulta la pagina Addestramento del modello.

Esempio di addestramento
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)

Per etichettare ulteriori immagini satellitari e gestire le esecuzioni di addestramento di xView nel browser, utilizza Ultralytics Platform.

Dati ed esempi di annotazioni#

L'esempio seguente mostra una scena xView tipica: immagini aeree ad alta risoluzione in cui piccoli oggetti come veicoli ed edifici sono annotati con riquadri di delimitazione, illustrando perché il rilevamento degli oggetti nelle immagini satellitari richiede una localizzazione a granularità fine.

Immagini satellitari aeree del dataset xView con rilevamento degli oggetti

Citazioni e ringraziamenti#

Se utilizzi il dataset xView nel tuo lavoro di ricerca o sviluppo, cita il seguente articolo:

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

Desideriamo ringraziare la Defense Innovation Unit (DIU) e i creatori del dataset xView per il loro prezioso contributo alla comunità di ricerca sulla visione artificiale. Per ulteriori informazioni, visita il sito web del dataset xView.

FAQ#

  • Il dataset xView è un benchmark di immagini satellitari rilasciato per la sfida DIUx xView 2018 dalla U.S. National Geospatial-Intelligence Agency, con oltre 1 milione di istanze di oggetti appartenenti a 60 classi a granularità fine in immagini WorldView-3 da 0,3 m. Supporta la ricerca sul rilevamento di oggetti piccoli, rari e a granularità fine nelle viste aeree, che sono obiettivi molto più difficili rispetto a quelli nelle fotografie scattate da terra.

  • xView richiede un download manuale: registrati sul sito della sfida DIUx xView 2018, scarica train_images.zip (~15 GB), train_labels.zip e val_images.zip (~5 GB), per un totale di circa 20,7 GB, quindi estraili in datasets/xView/ seguendo la struttura mostrata nell'avviso nella parte superiore di questa pagina. Al primo avvio dell'addestramento, Ultralytics converte automaticamente le annotazioni GeoJSON nel formato YOLO e crea la suddivisione tra addestramento e convalida.

  • xView contiene 847 immagini di addestramento annotate e 282 immagini di convalida prive di etichette pubbliche, tutte acquisite dai satelliti WorldView-3 a una risoluzione di 0,3 m. Le annotazioni coprono oltre 1 milione di istanze di oggetti distribuite su 60 classi. Poiché solo le etichette di addestramento sono pubbliche, la configurazione xView.yaml di Ultralytics suddivide le 847 immagini annotate, in proporzione approssimativa 90/10, in set di addestramento e convalida; per i dettagli, consulta Struttura del dataset.

  • Addestra un modello YOLO26n su xView per 100 epoche con una dimensione delle immagini pari a 640:

    Esempio di addestramento
    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)

    Per informazioni dettagliate sugli argomenti e sulle impostazioni, consulta la pagina Addestramento del modello.

  • Cita l'articolo "xView: Objects in Context in Overhead Imagery" (Lam et al., arXiv:1802.07856, 2018); la voce BibTeX completa si trova nella sezione Citazioni e ringraziamenti qui sopra.

Commenti