Conjunto de dados VisDrone#
O conjunto de dados VisDrone é um benchmark de imagens aéreas em larga escala cuja parte de detecção (VisDrone2019-DET) contém 8,629 imagens aéreas — 6,471 para treinamento, 548 para validação e 1,610 para teste-dev — anotadas com 10 classes de objetos para detecção de objetos. Ele foi criado pela equipe AISKYEYE do laboratório de aprendizado de máquina e mineração de dados da Universidade de Tianjin, China.
Assista: Como treinar Ultralytics YOLO no conjunto de dados VisDrone | Detecção aérea | Tutorial completo 🚀
O benchmark VisDrone completo inclui 288 clipes de vídeo (261,908 quadros) e 10,209 imagens estáticas capturadas por câmeras montadas em drones em 14 cidades diferentes da China, abrangendo ambientes urbanos e rurais, cenas pouco movimentadas e lotadas, além de condições variadas de clima e iluminação. Seus quadros contêm mais de 2.6 milhões de caixas delimitadoras anotadas manualmente, com atributos adicionais, como visibilidade da cena, classe do objeto e oclusão. A configuração VisDrone.yaml da Ultralytics usa a parte de imagens estáticas VisDrone2019-DET desse benchmark.
Principais funcionalidades#
- Objetos pequenos e densos: As vistas aéreas fazem com que os alvos sejam minúsculos e numerosos — somente as 548 imagens de validação contêm 38,759 caixas rotuladas, uma média de cerca de 70 objetos por imagem.
- Diversidade de cenas: Imagens de 14 cidades chinesas, abrangendo áreas urbanas e rurais, dia e noite e diferentes condições meteorológicas.
- Anotações detalhadas: Mais de 2.6 milhões de caixas no benchmark completo, com atributos de oclusão e visibilidade.
- Divisões predefinidas: Divisões fixas de treino / validação / teste-dev (6,471 / 548 / 1,610 imagens) para uma avaliação consistente.
Estrutura do conjunto de dados#
A configuração VisDrone da Ultralytics abrange a parte de imagens VisDrone2019-DET, dividida em três partes:
| Divisão | Imagens | Descrição |
|---|---|---|
| Treinar | 6,471 | Imagens aéreas rotuladas usadas para treinar o detector |
| Validação | 548 | Imagens usadas para avaliação durante o desenvolvimento |
| Teste-dev | 1,610 | Imagens reservadas para a avaliação final do modelo treinado |
Uma quarta divisão, test-challenge (1,580 imagens), é reservada para a competição VisDrone e não é baixada, por isso o conjunto DET completo totaliza 10,209 imagens.
O conjunto de dados anota 10 classes de objetos: pedestre, pessoas, bicicleta, carro, van, caminhão, triciclo, triciclo com toldo, ônibus e motocicleta. O VisDrone diferencia pedestre (uma pessoa em pé ou caminhando) de pessoas (uma pessoa em qualquer outra postura).
Na primeira utilização, o script de download converte as anotações originais do VisDrone para o formato YOLO, ignorando as regiões marcadas como ignoradas (o que também exclui a categoria "others", não utilizada).
Aplicações#
As cenas densas e os alvos minúsculos do VisDrone fazem dele um benchmark padrão para detecção de objetos pequenos em vistas aéreas. Entre as aplicações comuns estão:
- Monitoramento de tráfego e contagem de veículos com UAVs
- Análise de multidões e vigilância para segurança pública
- Inspeção de infraestrutura e canteiros de obras
- Pesquisa em visão computacional sobre detecção de objetos pequenos em cenas complexas
Para conhecer outros benchmarks de imagens aéreas, consulte o conjunto de dados xView, focado em imagens de satélite, ou o conjunto de dados DOTA-v2, com caixas orientadas.
YAML do conjunto de dados#
O arquivo VisDrone.yaml define a configuração do conjunto de dados — os caminhos do conjunto de dados, os nomes das classes e o script de download e conversão automáticos. Ele é mantido no repositório da Ultralytics em 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#
O VisDrone é baixado automaticamente na primeira vez que você treina — são três arquivos compactados, com cerca de 2 GB no total — e requer aproximadamente 4 GB de espaço livre em disco durante a extração e conversão.
Para treinar um modelo YOLO26n no conjunto de dados VisDrone por 100 épocas, com tamanho de imagem de 640, você pode usar os trechos de código a seguir. Para ver a lista completa de argumentos disponíveis, consulte a página de Treinamento do modelo.
from ultralytics import YOLO
# Carregar um modelo
model = YOLO("yolo26n.pt") # carregue um modelo pré-treinado (recomendado para treinamento)
# Treinar o modelo - o conjunto de dados será transferido automaticamente na primeira execução
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)Para rotular imagens aéreas adicionais e gerenciar execuções de treinamento do VisDrone no navegador, use a Ultralytics Platform.
Dados de exemplo e anotações#
O exemplo abaixo mostra uma cena típica do VisDrone: uma vista aérea de uma estrada movimentada, onde pedestres e veículos aparecem como alvos pequenos e agrupados, muitos parcialmente obstruídos uns pelos outros.

Citações e agradecimentos#
Se você usar o conjunto de dados VisDrone em seu trabalho de pesquisa ou desenvolvimento, cite o artigo a seguir:
@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}}Gostaríamos de reconhecer a equipe AISKYEYE do laboratório de Aprendizado de Máquina e mineração de dados da Universidade de Tianjin, China, pela criação e manutenção do conjunto de dados VisDrone. Para saber mais, acesse o repositório do VisDrone Dataset no GitHub.
Perguntas frequentes#
O VisDrone é usado para treinar e avaliar detectores com imagens capturadas por drones, nas quais os objetos são pequenos, numerosos e vistos de cima. A combinação de vistas aéreas, cenas lotadas e condições variadas faz dele um ambiente de teste padrão para monitoramento de tráfego com UAVs, análise de multidões e pesquisa sobre detecção de objetos pequenos.
A configuração VisDrone da Ultralytics contém 8,629 imagens: 6,471 para treinamento, 548 para validação e 1,610 para teste (test-dev). Todas as divisões compartilham as mesmas 10 classes: pedestre, pessoas, bicicleta, carro, van, caminhão, triciclo, triciclo com toldo, ônibus e motocicleta. Consulte Estrutura do conjunto de dados para ver a divisão completa.
O VisDrone é baixado automaticamente na primeira vez que você treina com
data="VisDrone.yaml"— não é necessário fazer nada manualmente. O script baixa três arquivos compactados (cerca de 2 GB) dos recursos de lançamento do Ultralytics GitHub e converte as anotações para o formato YOLO. A divisão test-challenge reservada para a competição não está incluída.Treine um modelo YOLO26n no VisDrone por 100 épocas, com tamanho de imagem de 640:
Exemplo de treinofrom ultralytics import YOLO # Carregar um modelo model = YOLO("yolo26n.pt") # carregue um modelo pré-treinado (recomendado para treinamento) # Treinar o modelo results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)Para ver configurações detalhadas, consulte a página de Treinamento e as dicas de treinamento de modelos.
Os objetos no VisDrone são minúsculos em relação ao enquadramento — muitas vezes têm apenas algumas dezenas de pixels — e aparecem em grupos densos e muito ocluídos, o que representa um desafio para detectores ajustados com fotos ao nível do solo. Treinar e fazer previsões em uma resolução mais alta (por exemplo,
imgsz=1280com um lote menor) ajuda a recuperar alvos pequenos, e a inferência em blocos com SAHI divide imagens grandes para que objetos pequenos ocupem uma parte maior de cada janela de inferência.O benchmark VisDrone completo abrange cinco tarefas — detecção de objetos em imagens, detecção de objetos em vídeos, rastreamento de um único objeto, rastreamento de vários objetos e contagem de multidões — em 288 clipes de vídeo e 10,209 imagens estáticas. A configuração
VisDrone.yamlda Ultralytics abrange apenas a tarefa de detecção em imagens (VisDrone2019-DET), baixando suas 6,471 imagens de treinamento, 548 de validação e 1,610 de teste-dev.Cite o artigo "Detection and Tracking Meet Drones Challenge" (IEEE TPAMI, vol. 44, nº 11, 2022, DOI 10.1109/TPAMI.2021.3119563); a entrada BibTeX completa está na seção Citações e agradecimentos acima.



