Ultralytics YOLO27:
No license

Dataset VisDrone#

Il dataset VisDrone è un benchmark su larga scala basato su immagini acquisite da droni, il cui sottoinsieme per il rilevamento (VisDrone2019-DET) offre 8.629 immagini aeree — 6.471 per il training, 548 per la validazione e 1.610 per il test-dev — annotate con 10 classi di oggetti per il rilevamento degli oggetti. È stato creato dal team AISKYEYE del Lab of Machine Learning and Data Mining della Tianjin University, in Cina.



Watch: How to Train Ultralytics YOLO on the VisDrone Dataset | Aerial Detection | Complete Tutorial 🚀

Il benchmark VisDrone completo comprende 288 clip video (261.908 fotogrammi) e 10.209 immagini statiche acquisite da telecamere montate su droni in 14 città diverse della Cina, con ambienti urbani e rurali, scenari poco affollati e affollati e condizioni meteorologiche e di illuminazione variabili. I suoi fotogrammi contengono oltre 2,6 milioni di bounding box annotati manualmente, con attributi aggiuntivi come visibilità della scena, classe dell'oggetto e occlusione. La configurazione Ultralytics VisDrone.yaml utilizza il sottoinsieme di immagini statiche VisDrone2019-DET di questo benchmark.

Funzionalità principali#

  • Oggetti piccoli e densi: le prospettive aeree rendono gli obiettivi piccoli e ravvicinati — le sole 548 immagini di validazione contengono 38.759 box etichettati, con una media di circa 70 oggetti per immagine.
  • Diversità delle scene: immagini provenienti da 14 città cinesi, che coprono ambienti urbani e rurali, giorno e notte e diverse condizioni meteorologiche.
  • Annotazioni dettagliate: oltre 2,6 milioni di box nell'intero benchmark, con attributi di occlusione e visibilità.
  • Suddivisioni predefinite: suddivisioni fisse train / val / test-dev (6.471 / 548 / 1.610 immagini) per una valutazione coerente.

Struttura del dataset#

La configurazione VisDrone di Ultralytics copre il sottoinsieme di immagini VisDrone2019-DET, suddiviso in tre parti:

SuddivisioneImmaginiDescrizione
Addestramento6,471Immagini aeree annotate utilizzate per addestrare il detector
Convalida548Immagini utilizzate per la valutazione durante lo sviluppo
Test-dev1,610Immagini riservate per la valutazione finale del modello addestrato

Una quarta suddivisione, test-challenge (1.580 immagini), è riservata alla competizione VisDrone e non viene scaricata; per questo l'intero set DET ammonta a 10.209 immagini.

Il dataset annota 10 classi di oggetti: pedone, persona, bicicletta, automobile, furgone, camion, triciclo, triciclo con tendalino, autobus e moto. VisDrone distingue pedone (una persona ferma o che cammina) da persona (una persona in qualsiasi altra postura).

Conversione automatica in YOLO

Al primo utilizzo, lo script di download converte le annotazioni originali di VisDrone nel formato YOLO, ignorando le regioni contrassegnate per essere ignorate (escludendo così anche la categoria inutilizzata "others").

Applicazioni#

Le scene dense e gli obiettivi minuscoli di VisDrone lo rendono un benchmark standard per il rilevamento di oggetti piccoli da prospettive aeree. Le applicazioni comuni includono:

  • Monitoraggio del traffico e conteggio dei veicoli da UAV
  • Analisi delle folle e sorveglianza per la sicurezza pubblica
  • Ispezione di infrastrutture e cantieri
  • Ricerca sulla computer vision per il rilevamento di oggetti piccoli in scene affollate

Per altri benchmark basati su immagini aeree, consulta il dataset xView incentrato sui satelliti o il dataset DOTA-v2 con box orientati.

YAML del dataset#

Il file VisDrone.yaml definisce la configurazione del dataset — i percorsi del dataset, i nomi delle classi e lo script automatico di download e conversione. È mantenuto nel repository Ultralytics all'indirizzo https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VisDrone.yaml.

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

# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset by Tianjin University
# Documentation: https://docs.ultralytics.com/datasets/detect/visdrone
# Example usage: yolo train data=VisDrone.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── VisDrone ← downloads here (~2 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: VisDrone # dataset root dir
train: images/train # train images (relative to 'path') 6471 images
val: images/val # val images (relative to 'path') 548 images
test: images/test # test-dev images (optional) 1610 images

# Classes
names:
  0: pedestrian
  1: people
  2: bicycle
  3: car
  4: van
  5: truck
  6: tricycle
  7: awning-tricycle
  8: bus
  9: motor

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

  from ultralytics.utils.downloads import download
  from ultralytics.utils import ASSETS_URL, TQDM

  def visdrone2yolo(dir, split, source_name=None):
      """Convert VisDrone annotations to YOLO format with images/{split} and labels/{split} structure."""
      from PIL import Image

      source_dir = dir / (source_name or f"VisDrone2019-DET-{split}")
      images_dir = dir / "images" / split
      labels_dir = dir / "labels" / split
      labels_dir.mkdir(parents=True, exist_ok=True)

      # Move images to new structure
      if (source_images_dir := source_dir / "images").exists():
          images_dir.mkdir(parents=True, exist_ok=True)
          for img in source_images_dir.glob("*.jpg"):
              img.rename(images_dir / img.name)

      for f in TQDM((source_dir / "annotations").glob("*.txt"), desc=f"Converting {split}"):
          img_size = Image.open(images_dir / f.with_suffix(".jpg").name).size
          dw, dh = 1.0 / img_size[0], 1.0 / img_size[1]
          lines = []

          with open(f, encoding="utf-8") as file:
              for row in [x.split(",") for x in file.read().strip().splitlines()]:
                  if row[4] != "0":  # Skip ignored regions
                      x, y, w, h = map(int, row[:4])
                      cls = int(row[5]) - 1
                      # Convert to YOLO format
                      x_center, y_center = (x + w / 2) * dw, (y + h / 2) * dh
                      w_norm, h_norm = w * dw, h * dh
                      lines.append(f"{cls} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}\n")

          (labels_dir / f.name).write_text("".join(lines), encoding="utf-8")

  # Download (ignores test-challenge split)
  dir = Path(yaml["path"])  # dataset root dir
  urls = [
      f"{ASSETS_URL}/VisDrone2019-DET-train.zip",
      f"{ASSETS_URL}/VisDrone2019-DET-val.zip",
      f"{ASSETS_URL}/VisDrone2019-DET-test-dev.zip",
      # f"{ASSETS_URL}/VisDrone2019-DET-test-challenge.zip",
  ]
  download(urls, dir=dir, threads=4)

  # Convert
  splits = {"VisDrone2019-DET-train": "train", "VisDrone2019-DET-val": "val", "VisDrone2019-DET-test-dev": "test"}
  for folder, split in splits.items():
      visdrone2yolo(dir, split, folder)  # convert VisDrone annotations to YOLO labels
      shutil.rmtree(dir / folder)  # cleanup original directory

Utilizzo#

Download di circa 2 GB

VisDrone viene scaricato automaticamente al primo training — tre archivi per un totale di circa 2 GB — e richiede circa 4 GB di spazio libero su disco durante l'estrazione e la conversione.

Per addestrare un modello YOLO26n sul dataset VisDrone 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 Training 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 - dataset will auto-download on first run
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

Per etichettare altre immagini aeree e gestire nel browser le esecuzioni di training di VisDrone, usa Ultralytics Platform.

Dati ed esempi di annotazioni#

L'esempio seguente mostra una scena VisDrone tipica: una prospettiva aerea su una strada trafficata, dove pedoni e veicoli appaiono come obiettivi piccoli e densamente raggruppati, spesso parzialmente occlusi gli uni dagli altri.

Immagini aeree da drone del dataset VisDrone con rilevamento degli oggetti

Citazioni e ringraziamenti#

Se utilizzi il dataset VisDrone nella tua attività di ricerca o sviluppo, cita il seguente articolo:

Citazione
@ARTICLE{9573394,
  author={Zhu, Pengfei and Wen, Longyin and Du, Dawei and Bian, Xiao and Fan, Heng and Hu, Qinghua and Ling, Haibin},
  journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
  title={Detection and Tracking Meet Drones Challenge},
  year={2022},
  volume={44},
  number={11},
  pages={7380-7399},
  doi={10.1109/TPAMI.2021.3119563}}

Desideriamo ringraziare il team AISKYEYE del Lab of Machine Learning and Data Mining della Tianjin University, in Cina, per aver creato e mantenuto il dataset VisDrone. Per ulteriori informazioni, visita il repository GitHub del dataset VisDrone.

FAQ#

  • VisDrone viene utilizzato per addestrare e valutare i detector su immagini acquisite da droni, in cui gli oggetti sono piccoli, ravvicinati e osservati dall'alto. La combinazione di prospettive aeree, scene affollate e condizioni variabili lo rende un banco di prova standard per il monitoraggio del traffico basato su UAV, l'analisi delle folle e la ricerca sul rilevamento di oggetti piccoli.

  • La configurazione VisDrone di Ultralytics contiene 8.629 immagini: 6.471 per il training, 548 per la validazione e 1.610 per il test (test-dev). Tutte le suddivisioni condividono le stesse 10 classi: pedone, persona, bicicletta, automobile, furgone, camion, triciclo, triciclo con tendalino, autobus e moto. Consulta Struttura del dataset per la suddivisione completa.

  • VisDrone viene scaricato automaticamente al primo training con data="VisDrone.yaml" — non sono necessari passaggi manuali. Lo script recupera tre archivi (circa 2 GB) dagli asset delle release GitHub di Ultralytics e converte le annotazioni nel formato YOLO. La suddivisione test-challenge riservata alla competizione non è inclusa.

  • Addestra un modello YOLO26n su VisDrone 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="VisDrone.yaml", epochs=100, imgsz=640)

    Per configurazioni dettagliate, consulta la pagina Addestramento e i consigli per l'addestramento dei modelli.

  • Gli oggetti in VisDrone sono minuscoli rispetto al fotogramma — spesso misurano solo poche decine di pixel — e compaiono in gruppi densi e fortemente occlusi, mettendo in difficoltà i detector ottimizzati su fotografie scattate da terra. Addestrare ed eseguire previsioni a una risoluzione più alta (ad esempio imgsz=1280 con un batch più piccolo) consente di recuperare gli obiettivi piccoli, mentre l'inferenza a tasselli SAHI suddivide le immagini grandi in modo che gli oggetti piccoli occupino una porzione maggiore di ogni finestra di inferenza.

  • Il benchmark VisDrone completo comprende cinque attività — rilevamento degli oggetti nelle immagini, rilevamento degli oggetti nei video, tracking di un singolo oggetto, tracking di più oggetti e conteggio delle folle — distribuite su 288 clip video e 10.209 immagini statiche. La configurazione Ultralytics VisDrone.yaml copre solo l'attività di rilevamento nelle immagini (VisDrone2019-DET), scaricando le sue 6.471 immagini di training, 548 di validazione e 1.610 di test-dev.

  • Cita l'articolo "Detection and Tracking Meet Drones Challenge" (IEEE TPAMI, vol. 44, n. 11, 2022, DOI 10.1109/TPAMI.2021.3119563); la voce BibTeX completa si trova nella sezione Citazioni e ringraziamenti precedente.

Commenti