Ultralytics YOLO27:
No license

Dataset VisDrone#

El dataset VisDrone es un benchmark de imágenes capturadas por drones a gran escala cuya parte de detección (VisDrone2019-DET) proporciona 8.629 imágenes aéreas — 6.471 de entrenamiento, 548 de validación y 1.610 de test-dev — anotadas con 10 clases de objetos para la detección de objetos. Fue creado por el equipo AISKYEYE del laboratorio de Machine Learning y minería de datos de la Universidad de Tianjin (China).



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

El benchmark completo de VisDrone consta de 288 clips de vídeo (261.908 fotogramas) y 10.209 imágenes estáticas capturadas por cámaras montadas en drones en 14 ciudades diferentes de China, con entornos urbanos y rurales, escenas despejadas y multitudinarias, y condiciones meteorológicas y de iluminación variadas. Sus fotogramas contienen más de 2,6 millones de cajas delimitadoras anotadas manualmente, con atributos adicionales como la visibilidad de la escena, la clase del objeto y la oclusión. La configuración VisDrone.yaml de Ultralytics utiliza la parte de imágenes estáticas VisDrone2019-DET de este benchmark.

Características principales#

  • Objetos pequeños y densos: las vistas aéreas hacen que los objetivos sean diminutos y estén muy agrupados; solo las 548 imágenes de validación contienen 38.759 cajas etiquetadas, una media de unos 70 objetos por imagen.
  • Diversidad de escenas: imágenes de 14 ciudades chinas que abarcan ubicaciones urbanas y rurales, de día y de noche, y distintas condiciones meteorológicas.
  • Anotaciones detalladas: más de 2,6 millones de cajas en todo el benchmark, con atributos de oclusión y visibilidad.
  • Divisiones predefinidas: divisiones fijas de entrenamiento / validación / test-dev (6.471 / 548 / 1.610 imágenes) para una evaluación coherente.

Estructura del dataset#

La configuración VisDrone de Ultralytics incluye la parte de imágenes VisDrone2019-DET, dividida en tres partes:

SubconjuntoImágenesDescripción
Entrenar6,471Imágenes aéreas etiquetadas utilizadas para entrenar el detector
Validación548Imágenes utilizadas para la evaluación durante el desarrollo
Test-dev1,610Imágenes reservadas para la evaluación final del modelo entrenado

Una cuarta división, test-challenge (1.580 imágenes), se reserva para la competición VisDrone y no se descarga, por lo que el conjunto DET completo suma 10.209 imágenes.

El dataset anota 10 clases de objetos: peatón, personas, bicicleta, coche, furgoneta, camión, triciclo, triciclo con toldo, autobús y moto. VisDrone distingue entre peatón (una persona de pie o caminando) y personas (una persona en cualquier otra postura).

Conversión automática a YOLO

En el primer uso, el script de descarga convierte las anotaciones originales de VisDrone al formato YOLO y omite las regiones marcadas para ignorarse (lo que también excluye la categoría "others", que no se utiliza).

Aplicaciones#

Las escenas densas y los objetivos diminutos de VisDrone lo convierten en un benchmark estándar para la detección de objetos pequeños desde vistas aéreas. Entre sus aplicaciones habituales se incluyen:

  • Monitorización del tráfico y recuento de vehículos desde UAV
  • Análisis de multitudes y vigilancia para la seguridad pública
  • Inspección de infraestructuras y obras
  • Investigación en visión artificial sobre la detección de objetos pequeños en escenas con elementos distractores

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

YAML del dataset#

El archivo VisDrone.yaml define la configuración del dataset: las rutas del dataset, los nombres de las clases y el script de descarga y conversión automáticas. Se mantiene en el repositorio de Ultralytics, en 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

Uso#

Descarga de ~2 GB

VisDrone se descarga automáticamente la primera vez que entrenas — tres archivos que suman unos 2 GB — y necesita aproximadamente 4 GB de espacio libre en disco durante la extracción y la conversión.

Para entrenar un modelo YOLO26n con el dataset VisDrone durante 100 épocas y con un tamaño de imagen de 640, puedes utilizar los siguientes fragmentos de código. Para consultar una lista completa de los 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 - dataset will auto-download on first run
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

Para etiquetar imágenes aéreas adicionales y gestionar las ejecuciones de entrenamiento de VisDrone en tu navegador, utiliza Ultralytics Platform.

Datos de ejemplo y anotaciones#

El ejemplo siguiente muestra una escena típica de VisDrone: una vista aérea sobre una carretera concurrida donde los peatones y los vehículos aparecen como objetivos pequeños y muy agrupados, muchos de ellos parcialmente ocluidos por otros.

Imágenes aéreas capturadas por drones del dataset VisDrone con detección de objetos

Citas y agradecimientos#

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

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

Queremos reconocer al equipo AISKYEYE del laboratorio de Machine Learning y minería de datos de la Universidad de Tianjin (China) por crear y mantener el dataset VisDrone. Para obtener más información, visita el repositorio de VisDrone Dataset en GitHub.

Preguntas frecuentes#

  • VisDrone se utiliza para entrenar y evaluar detectores con imágenes capturadas por drones, donde los objetos son pequeños, están muy agrupados y se observan desde arriba. Su combinación de vistas aéreas, escenas multitudinarias y condiciones variadas lo convierte en un banco de pruebas estándar para la monitorización del tráfico con UAV, el análisis de multitudes y la investigación sobre detección de objetos pequeños.

  • La configuración VisDrone de Ultralytics contiene 8.629 imágenes: 6.471 para entrenamiento, 548 para validación y 1.610 para pruebas (test-dev). Todas las divisiones comparten las mismas 10 clases: peatón, personas, bicicleta, coche, furgoneta, camión, triciclo, triciclo con toldo, autobús y moto. Consulta Estructura del dataset para ver el desglose completo.

  • VisDrone se descarga automáticamente la primera vez que entrenas con data="VisDrone.yaml"; no se requieren pasos manuales. El script obtiene tres archivos (unos 2 GB) de los recursos de las versiones de Ultralytics en GitHub y convierte las anotaciones al formato YOLO. La división test-challenge reservada para la competición no está incluida.

  • Entrena un modelo YOLO26n con VisDrone 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="VisDrone.yaml", epochs=100, imgsz=640)

    Para consultar configuraciones detalladas, ve a la página de entrenamiento y a los consejos para entrenar modelos.

  • Los objetos de VisDrone son diminutos en relación con el fotograma — a menudo solo tienen unas pocas decenas de píxeles — y aparecen en grupos densos y muy ocluidos, lo que supone un desafío para los detectores ajustados con fotografías tomadas a nivel del suelo. Entrenar y predecir con una resolución mayor (por ejemplo, imgsz=1280, con un batch más pequeño) permite recuperar objetivos pequeños, y la inferencia en mosaico con SAHI divide las imágenes grandes para que los objetos pequeños ocupen una mayor parte de cada ventana de inferencia.

  • El benchmark completo de VisDrone abarca cinco tareas — detección de objetos en imágenes, detección de objetos en vídeos, seguimiento de un solo objeto, seguimiento de múltiples objetos y recuento de multitudes — en 288 clips de vídeo y 10.209 imágenes estáticas. La configuración VisDrone.yaml de Ultralytics solo incluye la tarea de detección en imágenes (VisDrone2019-DET) y descarga sus 6.471 imágenes de entrenamiento, 548 de validación y 1.610 de test-dev.

  • Cita el artículo «Detection and Tracking Meet Drones Challenge» (IEEE TPAMI, vol. 44, n.º 11, 2022, DOI 10.1109/TPAMI.2021.3119563); la entrada BibTeX completa se encuentra en la sección Citas y agradecimientos anterior.

Comentarios