VisDrone-Datensatz#
Der VisDrone-Datensatz ist ein umfangreicher Benchmark für Drohnenaufnahmen. Seine Teilmenge zur Objekterkennung (VisDrone2019-DET) umfasst 8.629 Luftbilder – 6.471 Trainings-, 548 Validierungs- und 1.610 Test-dev-Bilder – mit Annotationen für 10 Objektklassen zur Objekterkennung. Erstellt wurde der Datensatz vom AISKYEYE-Team am Institut für maschinelles Lernen und Data Mining der Tianjin-Universität in China.
Ansehen: So trainierst du Ultralytics YOLO mit dem VisDrone-Datensatz | Erkennung aus der Luft | Vollständiges Tutorial 🚀
Der vollständige VisDrone-Benchmark umfasst 288 Videoclips (261.908 Einzelbilder) und 10.209 Standbilder, die mit drohnenmontierten Kameras in 14 verschiedenen Städten Chinas aufgenommen wurden. Die Aufnahmen zeigen städtische und ländliche Umgebungen, wenig und stark frequentierte Szenen sowie unterschiedliche Wetter- und Lichtverhältnisse. Die Einzelbilder enthalten insgesamt über 2,6 Millionen manuell annotierte Begrenzungsrahmen mit zusätzlichen Attributen wie Sichtbarkeit der Szene, Objektklasse und Verdeckung. Die Ultralytics-Konfiguration VisDrone.yaml verwendet die Teilmenge der Standbilder VisDrone2019-DET aus diesem Benchmark.
Wichtige Funktionen#
- Kleine, dicht gedrängte Objekte: Aus der Luft betrachtet sind die Ziele winzig und liegen dicht beieinander – allein die 548 Validierungsbilder enthalten 38.759 markierte Rahmen, also durchschnittlich etwa 70 Objekte pro Bild.
- Vielfältige Szenen: Aufnahmen aus 14 chinesischen Städten, die städtische und ländliche Gebiete, Tag und Nacht sowie unterschiedliche Wetterbedingungen abdecken.
- Umfangreiche Annotationen: Über 2,6 Millionen Rahmen im gesamten Benchmark, ergänzt um Angaben zu Verdeckung und Sichtbarkeit.
- Festgelegte Splits: Feste Trainings-, Validierungs- und Test-dev-Splits (6.471 / 548 / 1.610 Bilder) ermöglichen eine einheitliche Auswertung.
Datensatzstruktur#
Die Ultralytics-Konfiguration für VisDrone umfasst die Bildteilmenge VisDrone2019-DET, die in drei Teile unterteilt ist:
| Aufteilung | Bilder | Beschreibung |
|---|---|---|
| Trainieren | 6,471 | Beschriftete Luftbilder, die zum Trainieren des Detektors verwendet werden |
| Validierung | 548 | Bilder, die während der Entwicklung zur Auswertung verwendet werden |
| Test-dev | 1,610 | Zurückgehaltene Bilder zur abschließenden Auswertung des trainierten Modells |
Ein vierter Split, test-challenge (1.580 Bilder), bleibt für den VisDrone-Wettbewerb zurückgehalten und wird nicht heruntergeladen. Deshalb umfasst der vollständige DET-Satz insgesamt 10.209 Bilder.
Der Datensatz annotiert 10 Objektklassen: Fußgänger, Personen, Fahrräder, Autos, Lieferwagen, Lastwagen, Dreiräder, Dreiräder mit Verdeck, Busse und Motorräder. VisDrone unterscheidet zwischen pedestrian (einer stehenden oder gehenden Person) und people (einer Person in jeder anderen Körperhaltung).
Beim ersten Verwenden konvertiert das Downloadskript die ursprünglichen VisDrone-Annotationen ins YOLO-Format und überspringt als ignoriert markierte Bereiche (wodurch auch die nicht verwendete Kategorie „others“ ausgeschlossen wird).
Anwendungsfälle#
Die dicht bevölkerten Szenen und winzigen Ziele machen VisDrone zu einem Standardbenchmark für die Erkennung kleiner Objekte aus der Luft. Zu den typischen Anwendungsbereichen gehören:
- Verkehrsüberwachung und Fahrzeugzählung mit UAVs
- Menschenmengenanalyse und Überwachung für die öffentliche Sicherheit
- Inspektion von Infrastruktur und Baustellen
- Forschung im Bereich Computer Vision zur Erkennung kleiner Objekte in unübersichtlichen Szenen
Weitere Benchmarks für Luftbilder findest du im satellitenorientierten xView-Datensatz oder im Datensatz mit orientierten Rahmen DOTA-v2.
YAML-Datei des Datensatzes#
Die Datei VisDrone.yaml definiert die Datensatzkonfiguration – die Datensatzpfade, Klassennamen und das Skript für den automatischen Download und die Konvertierung. Sie wird im Ultralytics-Repository unter https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VisDrone.yaml gepflegt.
# 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 directoryVerwendung#
VisDrone wird beim ersten Training automatisch heruntergeladen – drei Archive mit insgesamt etwa 2 GB – und benötigt während des Entpackens und der Konvertierung ungefähr 4 GB freien Speicherplatz.
Um ein YOLO26n-Modell mit dem VisDrone-Datensatz 100 Epochen lang und einer Bildgröße von 640 zu trainieren, kannst du die folgenden Codebeispiele verwenden. Eine umfassende Übersicht der verfügbaren Argumente findest du auf der Seite zum Training von Modellen.
from ultralytics import YOLO
# Ein Modell laden
model = YOLO("yolo26n.pt") # ein vortrainiertes Modell laden (für das Training empfohlen)
# Modell trainieren – der Datensatz wird beim ersten Ausführen automatisch heruntergeladen
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)Um zusätzliche Luftbilder zu beschriften und VisDrone-Trainingsläufe im Browser zu verwalten, nutze die Ultralytics-Plattform.
Beispieldaten und Annotationen#
Das folgende Beispiel zeigt eine typische VisDrone-Szene: eine Luftaufnahme einer stark befahrenen Straße, auf der Fußgänger und Fahrzeuge als kleine, dicht gedrängte Ziele erscheinen und sich häufig teilweise gegenseitig verdecken.

Zitate und Danksagungen#
Wenn du den VisDrone-Datensatz in deiner Forschung oder Entwicklungsarbeit verwendest, zitiere bitte die folgende Arbeit:
@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}}Wir möchten dem AISKYEYE-Team am Institut für maschinelles Lernen und Data Mining der Tianjin-Universität in China danken, das den VisDrone-Datensatz erstellt und gepflegt hat. Weitere Informationen findest du im GitHub-Repository des VisDrone-Datensatzes.
Häufig gestellte Fragen#
VisDrone wird zum Trainieren und Bewerten von Detektoren auf Drohnenaufnahmen verwendet, in denen Objekte klein und dicht gedrängt sind und aus der Vogelperspektive zu sehen sind. Die Kombination aus Luftperspektive, dicht bevölkerten Szenen und vielfältigen Bedingungen macht den Datensatz zu einem Standardtestfeld für die UAV-basierte Verkehrsüberwachung, die Analyse von Menschenmengen und die Forschung zur Erkennung kleiner Objekte.
Die Ultralytics-Konfiguration für VisDrone enthält 8.629 Bilder: 6.471 Trainingsbilder, 548 Validierungsbilder und 1.610 Testbilder (test-dev). Alle Splits haben dieselben 10 Klassen: Fußgänger, Personen, Fahrräder, Autos, Lieferwagen, Lastwagen, Dreiräder, Dreiräder mit Verdeck, Busse und Motorräder. Die vollständige Aufschlüsselung findest du unter Datensatzstruktur.
VisDrone wird beim ersten Training mit
data="VisDrone.yaml"automatisch heruntergeladen – manuelle Schritte sind nicht erforderlich. Das Skript lädt drei Archive (etwa 2 GB) aus den GitHub-Release-Dateien von Ultralytics herunter und konvertiert die Annotationen ins YOLO-Format. Der für den Wettbewerb zurückgehaltene test-challenge-Split ist nicht enthalten.Trainiere ein YOLO26n-Modell 100 Epochen lang mit VisDrone und einer Bildgröße von 640:
Trainingsbeispielfrom ultralytics import YOLO # Ein Modell laden model = YOLO("yolo26n.pt") # ein vortrainiertes Modell laden (für das Training empfohlen) # Das Modell trainieren results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)Ausführliche Konfigurationen findest du auf der Seite Training und in den Tipps zum Modelltraining.
Objekte in VisDrone sind im Verhältnis zum Bild oft winzig – nur einige Dutzend Pixel groß – und treten in dicht gedrängten, stark verdeckten Gruppen auf. Das stellt Detektoren vor Herausforderungen, die auf Bodenaufnahmen abgestimmt sind. Training und Vorhersagen mit höherer Auflösung (zum Beispiel
imgsz=1280und einer kleineren Batch-Größe) machen kleine Ziele besser erkennbar. Bei der gekachelten SAHI-Inferenz werden große Bilder in Ausschnitte geteilt, sodass kleine Objekte einen größeren Teil jedes Inferenzfensters einnehmen.Der vollständige VisDrone-Benchmark umfasst fünf Aufgaben – Objekterkennung in Bildern, Objekterkennung in Videos, Verfolgung einzelner Objekte, Verfolgung mehrerer Objekte und Zählung von Menschenmengen – mit 288 Videoclips und 10.209 Standbildern. Die Ultralytics-Konfiguration
VisDrone.yamldeckt nur die Objekterkennung in Bildern (VisDrone2019-DET) ab und lädt die 6.471 Trainings-, 548 Validierungs- und 1.610 Test-dev-Bilder herunter.Zitiere die Arbeit „Detection and Tracking Meet Drones Challenge“ (IEEE TPAMI, Bd. 44, Nr. 11, 2022, DOI 10.1109/TPAMI.2021.3119563); den vollständigen BibTeX-Eintrag findest du oben im Abschnitt Zitate und Danksagungen.



