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ón | Imágenes | Descripción |
|---|---|---|
| Entrenar | 6,471 | Imágenes aéreas etiquetadas que se utilizan 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 |
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).
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 🚀 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 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.
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.

Citas y agradecimientos#
Si utilizas el conjunto de datos VisDrone en tus trabajos 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 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 entrenamientofrom 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=1280con 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.yamlde 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.



