Ultralytics YOLO27:
No license

Conjunto de datos VisDrone#

El conjunto de datos VisDrone es un benchmark a gran escala de imágenes capturadas con drones. Su subconjunto de detección (VisDrone2019-DET) proporciona 8.629 imágenes aéreas —6.471 para entrenamiento, 548 para validación y 1.610 para test-dev— anotadas con 10 clases de objetos para la detección de objetos. Lo creó el equipo AISKYEYE del laboratorio de aprendizaje automático y minería de datos de la Universidad de Tianjin, China.



Ver: Cómo entrenar Ultralytics YOLO con el conjunto de datos VisDrone | Detección aérea | Tutorial completo 🚀

El benchmark VisDrone completo 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 distintas de China. Abarca entornos urbanos y rurales, escenas poco concurridas y abarrotadas, 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 el subconjunto 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 aparezcan muy juntos: 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 entornos urbanos y rurales, de día y de noche, y con 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.
  • Particiones predefinidas: Particiones fijas de entrenamiento / validación / test-dev (6.471 / 548 / 1.610 imágenes) para una evaluación coherente.

Estructura del conjunto de datos#

La configuración VisDrone de Ultralytics cubre el subconjunto de imágenes VisDrone2019-DET, dividido en tres partes:

DivisiónImágenesDescripción
Entrenar6,471Imágenes aéreas etiquetadas que se utilizan 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

Hay una cuarta partición, test-challenge (1.580 imágenes), que se reserva para la competición VisDrone y no se descarga; por eso el conjunto DET completo suma 10.209 imágenes.

El conjunto de datos 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 como ignoradas (lo que también excluye la categoría «others», que no se utiliza).

Aplicaciones#

La densidad de las escenas y el diminuto tamaño de los objetivos de VisDrone lo convierten en un benchmark de referencia para la detección de objetos pequeños desde vistas aéreas. Entre las aplicaciones habituales se incluyen:

  • Seguimiento del tráfico y recuento de vehículos con 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 abarrotadas

Para consultar otros benchmarks de imágenes aéreas, echa un vistazo al conjunto de datos xView, centrado en imágenes de satélite, o al conjunto de datos DOTA-v2, con cajas orientadas.

YAML del conjunto de datos#

El archivo VisDrone.yaml define la configuración del conjunto de datos: las rutas, 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 comprimidos que ocupan en total unos 2 GB— y necesita unos 4 GB de espacio libre en disco durante la extracción y la conversión.

Para entrenar un modelo YOLO26n con el conjunto de datos VisDrone durante 100 épocas y con un tamaño de imagen de 640, puedes utilizar los siguientes fragmentos de código. Consulta la página de entrenamiento del modelo para ver la lista completa de argumentos disponibles.

Ejemplo de entrenamiento
from ultralytics import YOLO

# Cargar un modelo
model = YOLO("yolo26n.pt")  # Carga un modelo preentrenado (recomendado para el entrenamiento)

# Entrena el modelo: el conjunto de datos se descargará automáticamente en la primera ejecución
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 desde el navegador, utiliza Ultralytics Platform.

Datos de ejemplo y anotaciones#

El ejemplo siguiente muestra una escena típica de VisDrone: una vista aérea de una carretera transitada en la que peatones y vehículos aparecen como objetivos pequeños y muy juntos, muchos de ellos parcialmente ocultos unos por otros.

Imágenes aéreas del conjunto de datos VisDrone capturadas con drones para la detección de objetos

Citas y agradecimientos#

Si utilizas el conjunto de datos VisDrone en tus trabajos 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 agradecer al equipo AISKYEYE del laboratorio de aprendizaje automático y minería de datos de la Universidad de Tianjin, China, la creación y el mantenimiento del conjunto de datos VisDrone. Para obtener más información, visita el repositorio de VisDrone en GitHub.

Preguntas frecuentes#

  • VisDrone se utiliza para entrenar detectores y evaluar su rendimiento con imágenes capturadas por drones, en las que los objetos son pequeños, aparecen muy juntos y se ven desde arriba. La combinación de vistas aéreas, escenas abarrotadas y condiciones variadas lo convierte en un banco de pruebas de referencia 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). Las tres particiones comparten las mismas 10 clases: peatón, personas, bicicleta, coche, furgoneta, camión, triciclo, triciclo con toldo, autobús y moto. Consulta Estructura del conjunto de datos para ver el desglose completo.

  • VisDrone se descarga automáticamente la primera vez que entrenas con data="VisDrone.yaml"; no hace falta realizar ningún paso manual. El script descarga tres archivos comprimidos (unos 2 GB) desde los recursos de la versión de Ultralytics en GitHub y convierte las anotaciones al formato YOLO. No se incluye la partición test-challenge reservada para la competición.

  • 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
    
    # Cargar un modelo
    model = YOLO("yolo26n.pt")  # Carga un modelo preentrenado (recomendado para el entrenamiento)
    
    # Entrenar el modelo
    results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

    Para ver configuraciones detalladas, consulta la página de entrenamiento y los consejos para entrenar modelos.

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

  • El benchmark VisDrone completo abarca cinco tareas —detección de objetos en imágenes, detección de objetos en vídeos, seguimiento de un 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 cubre solo 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 está en la sección Citas y agradecimientos anterior.

Comentarios