Ultralytics YOLO27:
Get Started
No license

Dataset VisDrone#

Il dataset VisDrone è un benchmark su larga scala basato su immagini riprese da droni, il cui sottoinsieme per il rilevamento (VisDrone2019-DET) fornisce 8.629 immagini aeree — 6.471 per l'addestramento, 548 per la convalida e 1.610 per il test-dev — annotate con 10 classi di oggetti per il rilevamento degli oggetti. È stato creato dal team AISKYEYE del laboratorio di Machine Learning e data mining della Tianjin University, in Cina.



Guarda: Come addestrare Ultralytics YOLO sul dataset VisDrone | Rilevamento aereo | Tutorial completo 🚀

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

Funzionalità principali#

  • Oggetti piccoli e ravvicinati: le riprese dall'alto rendono gli oggetti molto piccoli e affollati: le sole 548 immagini di convalida contengono 38.759 riquadri etichettati, in media circa 70 oggetti per immagine.
  • Diversità delle scene: immagini da 14 città cinesi, con ambienti urbani e rurali, di giorno e di notte, e in condizioni meteorologiche diverse.
  • Annotazioni dettagliate: oltre 2,6 milioni di riquadri nel benchmark completo, con attributi di occlusione e visibilità.
  • Suddivisioni predefinite: split fissi 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:

SubsetImmaginiDescrizione
Addestra6,471Immagini aeree etichettate usate per addestrare il rilevatore
Validazione548Immagini usate per la valutazione durante lo sviluppo
Test-dev1,610Immagini messe da parte per la valutazione finale del modello addestrato

Un quarto split, test-challenge (1.580 immagini), è riservato alla competizione VisDrone e non viene scaricato; per questo il set DET completo conta 10.209 immagini.

Il dataset annota 10 classi di oggetti: pedone, persone, bicicletta, automobile, furgone, camion, triciclo, triciclo con tenda, autobus e motociclo. VisDrone distingue pedestrian (una persona in piedi o che cammina) da people (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 come ignorate (ed escludendo così anche la categoria "others", non utilizzata).

Applicazioni#

Le scene affollate e i bersagli minuscoli di VisDrone lo rendono un benchmark standard per il rilevamento di oggetti piccoli da riprese aeree. Le applicazioni comuni includono:

  • Monitoraggio del traffico e conteggio dei veicoli con UAV
  • Analisi della folla e sorveglianza per la sicurezza pubblica
  • Ispezione di infrastrutture e cantieri
  • Ricerca sulla computer vision per rilevare oggetti piccoli in scene affollate

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

YAML del dataset#

Il file VisDrone.yaml definisce la configurazione del dataset: percorsi del dataset, nomi delle classi e script automatico per il download e la 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 ~2 GB

VisDrone viene scaricato automaticamente la prima volta che esegui l'addestramento: tre archivi per un totale di circa 2 GB. Durante l'estrazione e la conversione servono circa 4 GB di spazio libero su disco.

Per addestrare un modello YOLO26n sul dataset VisDrone per 100 epoche con una dimensione immagine di 640, puoi usare 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

# Carica un modello
model = YOLO("yolo26n.pt")  # carica un modello preaddestrato (consigliato per l'addestramento)

# Addestra il modello: il dataset verrà scaricato automaticamente alla prima esecuzione
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

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

Dati di esempio e annotazioni#

L'esempio seguente mostra una tipica scena VisDrone: una ripresa aerea su una strada trafficata, dove pedoni e veicoli appaiono come bersagli piccoli e ravvicinati, molti dei quali parzialmente occlusi gli uni dagli altri.

Immagini aeree da drone del dataset VisDrone con rilevamento degli oggetti

Citazioni e ringraziamenti#

Se usi il dataset VisDrone nelle tue 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 laboratorio di Machine Learning e 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.

Domande frequenti#

  • VisDrone viene usato per addestrare e valutare i rilevatori su immagini riprese da droni, in cui gli oggetti sono piccoli, ravvicinati e osservati dall'alto. La combinazione di riprese aeree, scene affollate e condizioni variabili lo rende un banco di prova standard per il monitoraggio del traffico con UAV, l'analisi della folla e la ricerca sul rilevamento di oggetti piccoli.

  • La configurazione VisDrone di Ultralytics contiene 8.629 immagini: 6.471 per l'addestramento, 548 per la convalida e 1.610 per il test (test-dev). Tutti gli split condividono le stesse 10 classi: pedone, persone, bicicletta, automobile, furgone, camion, triciclo, triciclo con tenda, autobus e motociclo. Consulta Struttura del dataset per la ripartizione completa.

  • VisDrone viene scaricato automaticamente la prima volta che esegui l'addestramento con data="VisDrone.yaml": non è necessario alcun passaggio manuale. Lo script scarica tre archivi (circa 2 GB) dagli asset delle release GitHub di Ultralytics e converte le annotazioni nel formato YOLO. Lo split test-challenge, riservato alla competizione, non è incluso.

  • Addestra un modello YOLO26n su VisDrone per 100 epoche con una dimensione immagine di 640:

    Esempio di addestramento
    from ultralytics import YOLO
    
    # Carica un modello
    model = YOLO("yolo26n.pt")  # carica un modello preaddestrato (consigliato per l'addestramento)
    
    # Addestra il modello
    results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

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

  • Gli oggetti in VisDrone sono minuscoli rispetto all'inquadratura — spesso misurano solo poche decine di pixel — e compaiono in gruppi fitti e fortemente occlusi, mettendo in difficoltà i rilevatori ottimizzati su foto scattate a livello del suolo. Addestrare ed eseguire le predizioni a una risoluzione più elevata (ad esempio imgsz=1280 con un batch più piccolo) aiuta a recuperare i bersagli piccoli; l'inferenza a tasselli SAHI suddivide le immagini grandi in riquadri, così gli oggetti piccoli occupano una porzione maggiore di ciascuna finestra di inferenza.

  • Il benchmark VisDrone completo comprende cinque attività — rilevamento di oggetti nelle immagini, rilevamento di oggetti nei video, tracciamento di un singolo oggetto, tracciamento di più oggetti e conteggio della folla — su 288 clip video e 10.209 immagini statiche. La configurazione Ultralytics VisDrone.yaml copre solo l'attività di rilevamento nelle immagini (VisDrone2019-DET) e scarica le relative 6.471 immagini di addestramento, 548 di convalida 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 qui sopra.

Commenti