Ultralytics YOLO27:
No license

Conjunto de dados VisDrone#

O conjunto de dados VisDrone é um benchmark de grande escala de imagens captadas por drones, cujo subconjunto de deteção (VisDrone2019-DET) fornece 8.629 imagens aéreas — 6.471 para treino, 548 para validação e 1.610 para test-dev — anotadas com 10 classes de objetos para deteção de objetos. Foi criado pela equipa AISKYEYE do Laboratório de Aprendizagem Automática e Mineração de Dados da Universidade de Tianjin, na China.



Watch: How to Train Ultralytics YOLO on the VisDrone Dataset | Aerial Detection | Complete Tutorial 🚀

O benchmark VisDrone completo é composto por 288 clips de vídeo (261.908 frames) e 10.209 imagens estáticas captadas por câmaras montadas em drones em 14 cidades diferentes da China, abrangendo ambientes urbanos e rurais, cenários esparsos e movimentados e condições meteorológicas e de iluminação variadas. Os seus frames 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 utiliza o subconjunto de imagens estáticas VisDrone2019-DET deste benchmark.

Principais funcionalidades#

  • Objetos pequenos e densos: As perspetivas aéreas tornam os alvos pequenos e aglomerados — só as 548 imagens de validação contêm 38.759 caixas identificadas, uma média de cerca de 70 objetos por imagem.
  • Diversidade de cenas: Imagens de 14 cidades chinesas que abrangem zonas urbanas e rurais, dia e noite e diferentes condições meteorológicas.
  • Anotações detalhadas: Mais de 2,6 milhões de caixas em todo o benchmark, com atributos de oclusão e visibilidade.
  • Divisões predefinidas: Divisões fixas de treino / validação / test-dev (6.471 / 548 / 1.610 imagens) para uma avaliação consistente.

Estrutura do Conjunto de Dados#

A configuração VisDrone da Ultralytics abrange o subconjunto de imagens VisDrone2019-DET, dividido em três partes:

DivisãoImagensDescrição
Treinar6,471Imagens aéreas anotadas utilizadas para treinar o detetor
Validação548Imagens utilizadas para avaliação durante o desenvolvimento
Test-dev1,610Imagens 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 é descarregada, razão pela qual o conjunto DET completo totaliza 10.209 imagens.

O conjunto de dados contém anotações de 10 classes de objetos: pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus e motor. O VisDrone distingue pedestrian (uma pessoa de pé ou a caminhar) de people (uma pessoa em qualquer outra postura).

Conversão automática para YOLO

Na primeira utilização, o script de descarga 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", que não é utilizada).

Aplicações#

As cenas densas e os alvos pequenos do VisDrone fazem dele um benchmark padrão para deteção de objetos pequenos a partir de perspetivas aéreas. As aplicações comuns incluem:

  • Monitorização do tráfego e contagem de veículos a partir de UAVs
  • Análise de multidões e vigilância para a segurança pública
  • Inspeção de infraestruturas e de estaleiros de construção
  • Investigação em visão computacional sobre a deteção de objetos pequenos em cenas desorganizadas

Para conhecer outros benchmarks de imagens aéreas, consulta 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 ficheiro VisDrone.yaml define a configuração do conjunto de dados — os caminhos dos dados, os nomes das classes e o script automático de descarga e conversão. É mantido no repositório da Ultralytics em https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VisDrone.yaml.

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 directory

Utilização#

Descarga de ~2 GB

O VisDrone é descarregado automaticamente na primeira vez que treinas — três arquivos que totalizam cerca de 2 GB — e necessita de 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 durante 100 épocas, com um tamanho de imagem de 640, podes utilizar os seguintes trechos de código. Para consultar uma lista completa dos argumentos disponíveis, consulta a página de Treino do modelo.

Exemplo de treino
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 anotar imagens aéreas adicionais e gerir execuções de treino do VisDrone no teu navegador, utiliza a Ultralytics Platform.

Dados e anotações de exemplo#

O exemplo abaixo mostra uma cena típica do VisDrone: uma perspetiva aérea sobre uma estrada movimentada, onde peões e veículos aparecem como alvos pequenos e densamente agrupados, muitos parcialmente ocultos uns pelos outros.

Imagens aéreas captadas por drones do conjunto de dados VisDrone com deteção de objetos

Citações e agradecimentos#

Se utilizares o conjunto de dados VisDrone no teu trabalho de investigação ou desenvolvimento, cita o seguinte artigo:

Citação
@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 agradecer à equipa AISKYEYE do Laboratório de Aprendizagem Automática e Mineração de Dados da Universidade de Tianjin, na China, por criar e manter o conjunto de dados VisDrone. Para obteres mais informações, visita o repositório do conjunto de dados VisDrone no GitHub.

Perguntas frequentes#

  • O VisDrone é utilizado para treinar e avaliar detetores em imagens captadas por drones, nas quais os objetos são pequenos, densos e vistos de cima. A combinação de perspetivas aéreas, cenas movimentadas e condições variadas faz dele um ambiente de teste padrão para a monitorização do tráfego com UAVs, a análise de multidões e a investigação sobre a deteção de objetos pequenos.

  • A configuração VisDrone da Ultralytics contém 8.629 imagens: 6.471 para treino, 548 para validação e 1.610 para teste (test-dev). Todas as divisões partilham as mesmas 10 classes: pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus e motor. Consulta a Estrutura do conjunto de dados para obteres a discriminação completa.

  • O VisDrone é descarregado automaticamente na primeira vez que treinas com data="VisDrone.yaml" — não são necessários passos manuais. O script obtém três arquivos (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.

  • Treina um modelo YOLO26n no VisDrone durante 100 épocas, com um tamanho de imagem de 640:

    Exemplo de treino
    from 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 configurações detalhadas, consulta a página de Treino e as dicas de treino de modelos.

  • Os objetos no VisDrone são pequenos em relação ao frame — muitas vezes têm apenas algumas dezenas de píxeis — e aparecem em grupos densos e fortemente ocluídos, o que representa um desafio para detetores ajustados com fotografias ao nível do solo. Treinar e fazer previsões com uma resolução mais elevada (por exemplo, imgsz=1280 com um batch menor) permite recuperar alvos pequenos, e a inferência por blocos SAHI divide imagens grandes para que os objetos pequenos ocupem uma parte maior de cada janela de inferência.

  • O benchmark VisDrone completo abrange cinco tarefas — deteção de objetos em imagens, deteção de objetos em vídeos, acompanhamento de um único objeto, acompanhamento de vários objetos e contagem de multidões — em 288 clips de vídeo e 10.209 imagens estáticas. A configuração VisDrone.yaml da Ultralytics abrange apenas a tarefa de deteção em imagens (VisDrone2019-DET), descarregando as suas 6.471 imagens de treino, 548 de validação e 1.610 de test-dev.

  • Cita 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 encontra-se na secção Citações e Agradecimentos acima.

Comentários