Dataset VisDrone#
El VisDrone Dataset es un conjunto de referencia de imágenes de drones a gran escala cuyo subconjunto de detección (VisDrone2019-DET) proporciona 8629 imágenes aéreas (6471 de entrenamiento, 548 de validación y 1610 de test-dev), anotadas con 10 clases de objetos para la object detection. 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 referente VisDrone completo comprende 288 videoclips (261 908 fotogramas) y 10 209 imágenes estáticas capturadas por cámaras montadas en drones en 14 ciudades diferentes de China, que abarcan entornos urbanos y rurales, escenas escasas y concurridas, y condiciones meteorológicas y de iluminación variadas. Sus fotogramas contienen más de 2,6 millones de bounding boxes anotadas manualmente, con atributos adicionales como la visibilidad de la escena, la clase de objeto y la oclusión. La configuración VisDrone.yaml de Ultralytics utiliza el subconjunto de imágenes estáticas VisDrone2019-DET de este referente.
Características clave#
- Objetos pequeños y densos: Los puntos de vista aéreos hacen que los objetivos sean diminutos y estén amontonados; las 548 imágenes de validación por sí solas contienen 38.759 cajas etiquetadas, un promedio de unos 70 objetos por imagen.
- Diversidad de escenas: Imágenes de 14 ciudades chinas que cubren ubicaciones urbanas y rurales, día y noche, y diferentes condiciones meteorológicas.
- Anotaciones enriquecidas: Más de 2,6 millones de cajas en todo el benchmark, con atributos de oclusión y visibilidad.
- Divisones predefinidas: Divisiones fijas de entrenamiento / validación / prueba (6.471 / 548 / 1.610 imágenes) para una evaluación consistente.
Estructura del dataset#
La configuración VisDrone de Ultralytics cubre el subconjunto de imágenes VisDrone2019-DET, dividido en tres partes:
| Split | Imágenes | Descripción |
|---|---|---|
| Entrenar | 6,471 | Imágenes aéreas etiquetadas usadas para entrenar el detector |
| Validación | 548 | Imágenes utilizadas para la evaluation 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, razón por la cual el conjunto completo DET 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 motor. 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, omitiendo las regiones marcadas como ignoradas (lo que también excluye la categoría "otros" no utilizada).
Aplicaciones#
Las densas escenas y los diminutos objetivos de VisDrone lo convierten en un referente estándar para la small-object detection desde puntos de vista aéreos. Las aplicaciones comunes incluyen:
- Monitorización del tráfico y conteo de vehículos desde UAVs
- Análisis de multitudes y vigilancia de seguridad pública
- Inspección de infraestructuras y obras de construcción
- Investigación en Computer vision sobre la detección de objetos pequeños en escenas abarrotadas
Para otros referentes de imágenes aéreas, consulta el xView dataset centrado en satélites o el DOTA-v2 dataset de cajas orientadas.
YAML del dataset#
El archivo VisDrone.yaml define la configuración del conjunto de datos: las rutas del conjunto de datos, los nombres de las clases y el script de descarga y conversión automática. 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 cerca de 2 GB — y requiere aproximadamente 4 GB de espacio libre en disco durante la extracción y conversión.
Para entrenar un modelo YOLO26n en el conjunto de datos VisDrone durante 100 epochs con un tamaño de imagen de 640, puedes utilizar los siguientes fragmentos de código. Para obtener una lista completa de los argumentos disponibles, consulta la página de Training 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 ejecuciones de entrenamiento de VisDrone en tu navegador, utiliza Ultralytics Platform.
Ejemplos de datos y anotaciones#
La muestra a continuación muestra una escena típica de VisDrone: una vista aérea sobre una carretera transitada donde los peatones y vehículos aparecen como objetivos pequeños y densamente empaquetados, muchos de ellos parcialmente ocluidos unos por otros.

Citas y agradecimientos#
Si utilizas el dataset VisDrone en tu investigación o trabajo de desarrollo, por favor 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}}Nos gustaría agradecer al equipo AISKYEYE del Laboratorio de Machine Learning y Data Mining de la Universidad de Tianjin, China, por crear y mantener el conjunto de datos VisDrone. Para obtener más información, visita el VisDrone Dataset GitHub repository.
FAQ#
VisDrone se utiliza para entrenar y evaluar detectores en imágenes capturadas por drones, donde los objetos son pequeños, densos y vistos desde arriba. Su combinación de perspectivas aéreas, escenas concurridas y condiciones variables lo convierte en un banco de pruebas estándar para el monitoreo de tráfico basado en UAV, análisis de multitudes e investigación en detección de objetos pequeños.
La configuración de VisDrone de Ultralytics contiene 8629 imágenes: 6471 para entrenamiento, 548 para validación y 1610 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 Dataset Structure 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 GitHub de Ultralytics y convierte las anotaciones al formato YOLO. La división de pruebas reservada de la competición no está incluida.Entrena un modelo YOLO26n en VisDrone durante 100 épocas 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 ver configuraciones detalladas, consulta la página de Training y los model training tips.
Los objetos en VisDrone son diminutos en relación con el fotograma (a menudo de solo unas pocas docenas de píxeles) y aparecen en grupos densos y muy ocluidos, lo que pone a prueba a los detectores ajustados en fotos a nivel del suelo. Entrenar y predecir a mayor resolución (por ejemplo,
imgsz=1280con un lote más pequeño) recupera objetivos pequeños, y la SAHI tiled inference divide las imágenes grandes para que los objetos pequeños ocupen una mayor parte de cada ventana de inferencia.El referente VisDrone completo abarca cinco tareas: detección de objetos en imágenes, detección de objetos en vídeos, seguimiento de un solo objeto, multi-object tracking y recuento de multitudes, a lo largo de 288 videoclips y 10 209 imágenes estáticas. La configuración
VisDrone.yamlde Ultralytics cubre únicamente la tarea de detección de imágenes (VisDrone2019-DET), descargando sus 6471 imágenes de entrenamiento, 548 de validación y 1610 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 Citations and Acknowledgments anterior.