Ultralytics YOLO27:
No license

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ãoImagensDescrição
Treinar6,471Imagens aéreas rotuladas usadas para treinar o detector
Validação548Imagens usadas para avaliação durante o desenvolvimento
Teste-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 é 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).

Conversão automática para YOLO

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/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

Uso#

Download de ~2 GB

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.

Exemplo de treino
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.

Imagens aéreas de drones do conjunto de dados VisDrone com detecção de objetos

Citações e agradecimentos#

Se você usar o conjunto de dados VisDrone em seu trabalho de pesquisa ou desenvolvimento, cite o artigo a seguir:

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 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 treino
    from 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=1280 com 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.yaml da 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.

Comentários