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:
| Subconjunto | Imágenes | Descripción |
|---|---|---|
| Entrenar | 6,471 | Imágenes aéreas etiquetadas utilizadas para entrenar el detector |
| Validación | 548 | Imágenes utilizadas para la evaluación durante el desarrollo |
| Test-dev | 1,610 | Imá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).
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 🚀 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 directoryUso#
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.
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.

Citas y agradecimientos#
Si utilizas el dataset VisDrone en tu trabajo de investigación o desarrollo, cita el siguiente artículo:
@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 entrenamientofrom 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.yamlde 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.



