Ultralytics YOLO27:

Conjunto de dados PASCAL VOC#

O conjunto de dados PASCAL VOC (Classes de objetos visuais) é um benchmark clássico de detecção de objetos, com 20 classes de objetos do cotidiano. A configuração VOC.yaml da Ultralytics combina as divisões trainval de VOC2007 e VOC2012 em um conjunto de treinamento com 16,551 imagens, faz a validação nas 4,952 imagens de teste do VOC2007 anotadas publicamente e baixa tudo automaticamente (2.8 GB) na primeira utilização.



Assista: Como treinar Ultralytics YOLO no conjunto de dados Pascal VOC | Detecção de objetos | Visão computacional 🚀

Os desafios PASCAL VOC ocorreram de 2005 a 2012 e moldaram a forma como os modelos de detecção de objetos são avaliados: o benchmark abrange tarefas de classificação de imagens, detecção e segmentação, além de popularizar a precisão média (mAP) como métrica padrão de detecção. A configuração VOC.yaml da Ultralytics usa as anotações de detecção e converte as caixas delimitadoras XML originais para o formato YOLO durante o download.

Principais funcionalidades#

  • 20 classes de objetos do cotidiano: pessoa; seis animais (pássaro, gato, vaca, cachorro, cavalo, ovelha); sete veículos (avião, bicicleta, barco, ônibus, carro, motocicleta, trem); e seis objetos de interior (garrafa, cadeira, mesa de jantar, planta em vaso, sofá, monitor de TV).
  • Duas gerações de desafios combinadas: o treinamento combina VOC2007 trainval (5,011 imagens) com VOC2012 trainval (11,540 imagens).
  • Avaliação padronizada: décadas de resultados de referência publicados para o VOC fazem dele um ponto de referência conveniente para comparar modelos de detecção.
  • Pronto para YOLO: o script de download busca os arquivos compactados e converte as anotações automaticamente — sem preparação manual.

Estrutura do conjunto de dados#

A configuração VOC.yaml da Ultralytics define as seguintes divisões:

DivisãoImagensFonte
Treinar16,551VOC2007 trainval (5,011) + VOC2012 trainval (11,540)
Validação4,952VOC2007 test, usado para avaliação durante o treinamento
Teste4,952As mesmas imagens de teste do VOC2007 — a configuração não define uma divisão separada reservada para teste

As anotações de teste do VOC2007 foram disponibilizadas publicamente após o desafio daquele ano, o que permite que essa divisão sirva como conjunto de validação rotulado. As anotações de teste do VOC2012 continuam reservadas — os resultados só podem ser avaliados por meio do servidor oficial de avaliação PASCAL — e, por isso, não fazem parte desta configuração.

Objetos difíceis excluídos

O conversor automático ignora os objetos marcados com difficult nas anotações XML originais do VOC, portanto, as contagens de instâncias por classe diferem ligeiramente das estatísticas oficiais do VOC.

Explore o VOC na Ultralytics Platform para navegar pelas imagens com suas sobreposições de anotações, ver a distribuição das classes e os mapas de calor das caixas delimitadoras na aba Gráficos e clonar o conjunto para treinar seu próprio modelo na nuvem.

Aplicações#

O PASCAL VOC foi o principal benchmark para pesquisas sobre detecção de objetos nos anos anteriores ao maior conjunto de dados COCO: detectores como Faster R-CNN e SSD publicaram seus resultados originais nele, e os modelos Ultralytics YOLO podem ser treinados nele diretamente. Atualmente, ele continua popular para:

  • Avaliar novas arquiteturas de detecção em relação a um longo histórico de resultados de referência publicados
  • Experimentos rápidos e trabalhos acadêmicos — com 16,551 imagens de treinamento, o treinamento é muito mais rápido do que no COCO
  • Estudos de aprendizado por transferência com um conjunto compacto e bem conhecido de classes do cotidiano

YAML do conjunto de dados#

O arquivo VOC.yaml define a configuração do conjunto de dados — os caminhos do conjunto de dados, os 20 nomes de 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/VOC.yaml.

ultralytics/cfg/datasets/VOC.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# PASCAL VOC dataset https://www.robots.ox.ac.uk/~vgg/projects/pascal/VOC by University of Oxford
# Documentation: https://docs.ultralytics.com/datasets/detect/voc
# Example usage: yolo train data=VOC.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── VOC ← downloads here (2.8 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: VOC
train: # train images (relative to 'path') 16551 images
  - images/train2012
  - images/train2007
  - images/val2012
  - images/val2007
val: # val images (relative to 'path') 4952 images
  - images/test2007
test: # test images (optional)
  - images/test2007

# Classes
names:
  0: aeroplane
  1: bicycle
  2: bird
  3: boat
  4: bottle
  5: bus
  6: car
  7: cat
  8: chair
  9: cow
  10: diningtable
  11: dog
  12: horse
  13: motorbike
  14: person
  15: pottedplant
  16: sheep
  17: sofa
  18: train
  19: tvmonitor

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import xml.etree.ElementTree as ET
  from pathlib import Path

  from ultralytics.utils.downloads import download
  from ultralytics.utils import ASSETS_URL, TQDM

  def convert_label(path, lb_path, year, image_id):
      """Converts XML annotations from VOC format to YOLO format by extracting bounding boxes and class IDs."""

      def convert_box(size, box):
          dw, dh = 1.0 / size[0], 1.0 / size[1]
          x, y, w, h = (box[0] + box[1]) / 2.0 - 1, (box[2] + box[3]) / 2.0 - 1, box[1] - box[0], box[3] - box[2]
          return x * dw, y * dh, w * dw, h * dh

      with open(path / f"VOC{year}/Annotations/{image_id}.xml") as in_file, open(lb_path, "w", encoding="utf-8") as out_file:
          tree = ET.parse(in_file)
          root = tree.getroot()
          size = root.find("size")
          w = int(size.find("width").text)
          h = int(size.find("height").text)

          names = list(yaml["names"].values())  # names list
          for obj in root.iter("object"):
              cls = obj.find("name").text
              if cls in names and int(obj.find("difficult").text) != 1:
                  xmlbox = obj.find("bndbox")
                  bb = convert_box((w, h), [float(xmlbox.find(x).text) for x in ("xmin", "xmax", "ymin", "ymax")])
                  cls_id = names.index(cls)  # class id
                  out_file.write(" ".join(str(a) for a in (cls_id, *bb)) + "\n")

  # Download
  dir = Path(yaml["path"])  # dataset root dir
  urls = [
      f"{ASSETS_URL}/VOCtrainval_06-Nov-2007.zip",  # 446MB, 5011 images
      f"{ASSETS_URL}/VOCtest_06-Nov-2007.zip",  # 438MB, 4952 images
      f"{ASSETS_URL}/VOCtrainval_11-May-2012.zip",  # 1.95GB, 17125 images
  ]
  download(urls, dir=dir / "images", threads=3, exist_ok=True)  # download and unzip over existing (required)

  # Convert
  path = dir / "images/VOCdevkit"
  for year, image_set in ("2012", "train"), ("2012", "val"), ("2007", "train"), ("2007", "val"), ("2007", "test"):
      imgs_path = dir / "images" / f"{image_set}{year}"
      lbs_path = dir / "labels" / f"{image_set}{year}"
      imgs_path.mkdir(exist_ok=True, parents=True)
      lbs_path.mkdir(exist_ok=True, parents=True)

      with open(path / f"VOC{year}/ImageSets/Main/{image_set}.txt") as f:
          image_ids = f.read().strip().split()
      for id in TQDM(image_ids, desc=f"{image_set}{year}"):
          f = path / f"VOC{year}/JPEGImages/{id}.jpg"  # old img path
          lb_path = (lbs_path / f.name).with_suffix(".txt")  # new label path
          f.rename(imgs_path / f.name)  # move image
          convert_label(path, lb_path, year, id)  # convert labels to YOLO format

Uso#

Download de 2,8 GB

O VOC é baixado automaticamente na primeira vez que você treina — três arquivos compactados que totalizam 2,8 GB — e requer cerca de 6 GB de espaço livre em disco durante a extração e a conversão.

Para treinar um modelo YOLO26n no conjunto de dados VOC por 100 épocas com um tamanho de imagem de 640, você pode usar os trechos de código a seguir. Para ver uma lista completa dos 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="VOC.yaml", epochs=100, imgsz=640)

Imagens de exemplo e anotações#

A imagem abaixo mostra um lote de treinamento em mosaico do conjunto de dados VOC. A criação de mosaicos combina várias imagens em uma única amostra de treinamento, aumentando a variedade de objetos, escalas e contextos de cena que o modelo vê em cada lote — consulte o guia de aumento de dados do YOLO para saber mais.

Lote de treinamento em mosaico do conjunto de dados Pascal VOC

Citações e agradecimentos#

Se você usar o conjunto de dados VOC em suas pesquisas ou no seu trabalho de desenvolvimento, cite o artigo a seguir:

Citação
@article{everingham2010pascal,
  author={Everingham, Mark and Van Gool, Luc and Williams, Christopher K. I. and Winn, John and Zisserman, Andrew},
  journal={International Journal of Computer Vision},
  title={The Pascal Visual Object Classes (VOC) Challenge},
  year={2010},
  volume={88},
  number={2},
  pages={303-338},
  doi={10.1007/s11263-009-0275-4}}

Gostaríamos de agradecer ao Consórcio PASCAL VOC por criar e manter este valioso recurso para a comunidade de visão computacional. Para saber mais sobre o conjunto de dados VOC e seus criadores, acesse o site do conjunto de dados PASCAL VOC.

Perguntas frequentes#

  • O PASCAL VOC é usado para treinar e avaliar modelos de detecção de objetos em 20 classes de objetos do cotidiano, como pessoa, carro, cachorro e cadeira. Por ser compacto, totalmente rotulado e contar com anos de resultados de referência publicados, é uma escolha comum para validar novas arquiteturas, realizar experimentos em disciplinas e fazer estudos rápidos de aprendizado por transferência.

  • A configuração VOC da Ultralytics contém 21.503 imagens: 16.551 para treinamento (VOC2007 trainval + VOC2012 trainval) e 4.952 para validação (o conjunto de teste VOC2007). Todas as divisões compartilham as mesmas 20 classes. Consulte a Estrutura do conjunto de dados para ver a discriminação completa.

  • O VOC é baixado automaticamente na primeira vez que você treina com data="VOC.yaml" — não é necessário fazer nada manualmente. O script obtém três arquivos compactados (2,8 GB) dos recursos de lançamento do Ultralytics GitHub e converte as anotações XML para o formato YOLO.

  • Treine um modelo YOLO26n no VOC por 100 épocas com um 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="VOC.yaml", epochs=100, imgsz=640)

    Para ver configurações detalhadas, consulte a página de Treinamento e as dicas de treinamento de modelos.

  • Os dois desafios compartilham as mesmas 20 classes, mas incluem imagens diferentes. O VOC2007 oferece 5.011 imagens de trainval, além de um conjunto de teste com 4.952 imagens cujas anotações são públicas; o VOC2012 oferece 11.540 imagens de trainval, enquanto as anotações de teste são restritas e avaliadas apenas pelo servidor oficial de avaliação. A configuração VOC.yaml da Ultralytics combina os dois conjuntos trainval para treinamento e valida com o conjunto de teste VOC2007.

  • O VOC é menor e mais simples: 20 classes e 21.503 imagens, em comparação com as 80 classes e 330 mil imagens do COCO. Tradicionalmente, os resultados do VOC são apresentados como mAP em IoU de 0,5, enquanto o COCO calcula a média de mAP em limiares de IoU de 0,5 a 0,95. O treinamento com VOC é muito mais rápido e adequado para experimentos rápidos; o conjunto de dados COCO é o padrão para avaliações de desempenho em escala de produção.

  • Não — VOC.yaml é uma configuração exclusiva para detecção: o conversor extrai caixas delimitadoras das anotações XML do VOC, e as máscaras de segmentação incluídas no benchmark original não são convertidas. Para treinar um modelo de segmentação de instâncias, use um conjunto de dados com rótulos poligonais, como COCO-Seg, com um modelo yolo26n-seg.pt.

Comentários