Pascal VOC

Pascal VOC (Classes Visuais de Objetos (Visual Object Classes)) é um dos conjuntos de dados e desafios de benchmarking mais influentes na visão computacional moderna. Embora os desafios oficiais tenham ocorrido de 2005 a 2012, “VOC” continua amplamente usado para benchmarking de classificação de objetos (object classification), detecção de objetos (object detection) e segmentação semântica (semantic segmentation) — especialmente para comparar métodos historicamente e para experimentação leve.

O impacto do VOC vem de três escolhas de design que moldaram benchmarks posteriores:

  • Um conjunto fixo de 20 categorias de objetos do cotidiano
  • Definições claras de tarefas (classificação, detecção, segmentação)
  • Métricas de avaliação padronizadas, como IoU (Intersection over Union) e mAP (mean Average Precision), que se tornaram comuns na pesquisa de Detecção de Objetos

O que é Pascal VOC?

Pascal VOC é um conjunto de dados mais um desafio anual (VOC2005–VOC2012) originalmente organizado sob a rede PASCAL (Pattern Analysis, Statistical Modelling and Computational Learning). As versões mais conhecidas são:

  • VOC2007: comumente usada porque inclui um conjunto de teste (test set) oficial com resultados no servidor público de avaliação historicamente reportados em artigos.
  • VOC2012: comumente usada para treino (especialmente detecção e segmentação), às vezes combinada com o train/val do VOC2007.

Categorias de objetos (20 classes)

O VOC define 20 classes de objetos:

  • person
  • bird, cat, cow, dog, horse, sheep
  • aeroplane, bicycle, boat, bus, car, motorbike, train
  • bottle, chair, diningtable, pottedplant, sofa, tvmonitor

Essas categorias são intencionalmente amplas e “do cotidiano”, e as imagens frequentemente incluem desordem (clutter), oclusão e múltiplos objetos.

Tarefas no Pascal VOC

O VOC especifica três tarefas primárias. Muitos artigos reportam resultados em uma ou mais delas.

1) Classificação de imagens (multi-rótulo)

Objetivo: Prever quais das 20 classes aparecem em algum lugar na imagem (não onde elas estão).

  • Isso é classificação multi-rótulo (multi-label): uma imagem pode conter múltiplas classes (por exemplo, “person” e “bicycle”).
  • O VOC fornece rótulos positivos/negativos por classe para cada imagem em uma partição (train/val/test).

Uso típico: benchmarking de aprendizado de características (feature learning) ou ajuste fino (fine-tuning) de Redes Neurais Convolucionais em um conjunto de dados pequeno e clássico.

2) Detecção de objetos

Objetivo: Prever caixas delimitadoras (bounding boxes) e rótulos de classe para cada instância de objeto.

Uma saída de detecção é um conjunto de tuplas como:

  • (class, confidence_score, xmin, ymin, xmax, ymax) por objeto previsto

A detecção no VOC é o benchmark histórico para detectores clássicos como R-CNN, Fast R-CNN e Faster R-CNN, e ainda é usada para comparar com esses baselines.

3) Segmentação semântica

Objetivo: Atribuir um rótulo de classe a cada pixel (incluindo o fundo).

A segmentação do VOC fornece mapas de classe por pixel (e contornos) para um subconjunto de imagens, especialmente no VOC2012.

Uso típico: treinar e avaliar modelos de segmentação como redes no estilo FCN e arquiteturas encoder–decoder iniciais, ou como um benchmark rápido antes de escalar para conjuntos de dados maiores.

Para conceitos de segmentação, veja Segmentação Semântica.

Versões do conjunto de dados e partições (VOC2007 vs VOC2012)

As versões do VOC são distribuídas em uma estrutura de pastas “VOCdevkit”. As configurações experimentais mais comuns envolvem VOC2007 e VOC2012.

VOC2007

Números comumente citados:

  • Train+Val: 5.011 imagens
  • Test: 4.952 imagens

Pesquisadores frequentemente reportam resultados no test do VOC2007 para detecção e classificação porque ele tem um conjunto de teste padrão.

VOC2012

O VOC2012 é frequentemente usado para treino:

  • Train+Val (detecção/classificação): 11.540 imagens

Para segmentação, o VOC2012 fornece um subconjunto menor rotulado:

  • Train: 1.464 imagens
  • Val: 1.449 imagens

Muitos trabalhos aumentam o treino de segmentação do VOC2012 com as anotações do “SBD” (Semantic Boundaries Dataset) (frequentemente referido como “VOC12+SBD”), embora isso tecnicamente esteja fora do release central do VOC.

Combinações típicas de treinamento

Convenções comuns em artigos e bases de código incluem:

  • VOC07 trainval → VOC07 test (benchmark clássico)
  • VOC07+12 trainval → VOC07 test (mais dados de treino, ainda testa no VOC07)
  • VOC12 train → VOC12 val (especialmente segmentação)

Estrutura de diretórios e arquivos de anotação

Após extrair, você normalmente vê algo como:

  • VOCdevkit/VOC2007/
  • VOCdevkit/VOC2012/

Dentro de cada versão, as pastas principais incluem:

  • JPEGImages/ — imagens RGB (JPEG)
  • Annotations/ — anotações de objetos (XML)
  • ImageSets/Main/ — arquivos de partição para classificação/detecção
  • SegmentationClass/ — rótulos por pixel (PNG) (subconjunto de segmentação)
  • SegmentationObject/ — máscaras de segmentação por instância (PNG) (quando disponível)
  • ImageSets/Segmentation/ — arquivos de partição de segmentação

Formato de anotação de detecção (XML)

As anotações de detecção são armazenadas como um arquivo XML por imagem em Annotations/. Cada entrada de objeto inclui:

  • name (classe)
  • bndbox (xmin, ymin, xmax, ymax)
  • flags de metadados como:
    • difficult (difícil de reconhecer; historicamente tratado de forma especial na avaliação)
    • truncated (objeto cortado pelo limite da imagem)
    • occluded (parcialmente ocluído)
    • pose (rótulo aproximado de pose)

Um exemplo simplificado:

<annotation>
  <filename>000001.jpg</filename>
  <size>
    <width>353</width><height>500</height><depth>3</depth>
  </size>
  <object>
    <name>person</name>
    <pose>Left</pose>
    <truncated>1</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>48</xmin><ymin>240</ymin><xmax>195</xmax><ymax>371</ymax>
    </bndbox>
  </object>
</annotation>

Arquivos de partição (ImageSets)

As partições são descritas por arquivos de texto listando IDs de imagens e, em alguns casos, rótulos.

Por exemplo:

  • ImageSets/Main/trainval.txt — IDs de imagens em train+val
  • ImageSets/Main/test.txt — IDs de imagens em test (VOC2007)
  • ImageSets/Main/person_trainval.txt — arquivo de rótulo por classe

Um arquivo de classificação por classe comumente tem linhas como:

000001  1
000002 -1
000003  1

Onde 1 significa que a classe está presente, -1 significa ausente. (Alguns arquivos podem incluir 0 para “ignorar” em certos contextos, mas a classificação típica do VOC usa ±1.)

Formato de rótulo de segmentação (PNG)

O ground truth de segmentação é armazenado como imagens PNG indexadas:

  • SegmentationClass/*.png — cada pixel armazena um ID de classe (incluindo fundo)
  • Uma paleta de cores é usada para visualização, mas os valores armazenados são rótulos discretos.

Na prática, você carrega essas máscaras como arrays de inteiros para treino e avaliação.

Exemplo prático: fazendo parsing de anotações VOC em XML (Python)

Um primeiro passo comum é converter o XML do VOC para um formato usado pelo seu pipeline de treinamento (por exemplo, JSON no estilo COCO ou um formato tensorial customizado).

import xml.etree.ElementTree as ET
from pathlib import Path

def parse_voc_xml(xml_path: str):
    tree = ET.parse(xml_path)
    root = tree.getroot()

    filename = root.findtext("filename")
    size = root.find("size")
    width = int(size.findtext("width"))
    height = int(size.findtext("height"))

    objects = []
    for obj in root.findall("object"):
        cls = obj.findtext("name")
        difficult = int(obj.findtext("difficult", default="0"))

        b = obj.find("bndbox")
        xmin = int(b.findtext("xmin"))
        ymin = int(b.findtext("ymin"))
        xmax = int(b.findtext("xmax"))
        ymax = int(b.findtext("ymax"))

        objects.append({
            "class": cls,
            "bbox_xyxy": [xmin, ymin, xmax, ymax],
            "difficult": difficult,
        })

    return {
        "filename": filename,
        "width": width,
        "height": height,
        "objects": objects,
    }

ann = parse_voc_xml("VOCdevkit/VOC2007/Annotations/000001.xml")
print(ann["filename"], ann["objects"][:1])

Em muitos setups de treinamento, você:

  • remove objetos com difficult=1 do treinamento, ou
  • os mantém, mas os trata de forma diferente (depende do objetivo de reprodução).

Avaliação: IoU e mAP (e o que significa “métrica VOC”)

A avaliação do VOC popularizou duas ideias centrais:

  • IoU (Intersection over Union) para decidir se uma detecção corresponde a um objeto no ground truth
  • AP/mAP (Average Precision / mean Average Precision) para resumir trade-offs de precisão–revocação (precision–recall)

Esses conceitos são fundamentais na Avaliação de Modelos para tarefas de detecção.

Interseção sobre União (IoU)

Para duas caixas delimitadoras, IoU é:

[ IoU = \frac{\text{area of intersection}}{\text{area of union}} ]

Na detecção do VOC, uma caixa prevista é tipicamente considerada um verdadeiro positivo (true positive) se:

  • ela tem a classe correta, e
  • corresponde a uma caixa do ground truth com IoU ≥ 0.5, e
  • aquela instância do ground truth ainda não foi correspondida a uma previsão de maior score.

Trecho prático de IoU:

def iou_xyxy(a, b):
    ax1, ay1, ax2, ay2 = a
    bx1, by1, bx2, by2 = b

    inter_x1 = max(ax1, bx1)
    inter_y1 = max(ay1, by1)
    inter_x2 = min(ax2, bx2)
    inter_y2 = min(ay2, by2)

    inter_w = max(0, inter_x2 - inter_x1)
    inter_h = max(0, inter_y2 - inter_y1)
    inter_area = inter_w * inter_h

    area_a = max(0, ax2 - ax1) * max(0, ay2 - ay1)
    area_b = max(0, bx2 - bx1) * max(0, by2 - by1)
    union = area_a + area_b - inter_area

    return inter_area / union if union > 0 else 0.0

Precisão Média (AP) e mAP

Para cada classe:

  1. Colete todas as previsões dessa classe em todo o conjunto de dados.
  2. Ordene por score de confiança (alto para baixo).
  3. Percorra a lista ranqueada e calcule precisão/revocação após cada previsão.
  4. Resuma a curva precisão–revocação em AP.
  5. Faça a média do AP em todas as classes → mAP.

Cálculo de AP no VOC2007 vs VOC2010+

Um detalhe que frequentemente importa ao reproduzir números reportados:

  • VOC2007 usava o AP interpolado de 11 pontos (amostrando a precisão em níveis de revocação {0.0, 0.1, …, 1.0}).
  • VOC2010+ (incluindo VOC2012) tipicamente usa o AP mais contínuo no estilo “área sob a curva”, computado a partir de todos os pontos de operação (frequentemente chamado de “métrica VOC2010”).

Então, quando você vê resultados como “mAP@0.5 no VOC07”, confirme se significa:

  • mAP de 11 pontos do VOC07, ou
  • o cálculo de AP posterior (mais preciso) em IoU=0.5.

Tratamento de objetos “difficult”

As anotações do VOC incluem instâncias difficult. Na avaliação, objetos difíceis tipicamente:

  • não são contados como falsos negativos se forem perdidos, e
  • detecções que se sobrepõem a um objeto difícil podem ser tratadas de um modo que não penaliza o detector (o comportamento exato depende da versão do script oficial).

Ao reproduzir benchmarks, é mais seguro usar o caminho de código oficial de avaliação do VOC (ou uma implementação de biblioteca que corresponda explicitamente a ele).

Avaliação de segmentação: IoU média

Para segmentação semântica, o VOC comumente usa IoU média (mIoU — mean Intersection over Union) entre classes:

[ IoU_c = \frac{TP_c}{TP_c + FP_c + FN_c}, \quad mIoU = \frac{1}{C}\sum_{c=1}^C IoU_c ]

Onde (TP_c, FP_c, FN_c) são contagens por pixel para a classe (c). O fundo (background) frequentemente é incluído como uma classe dependendo do protocolo (a segmentação do VOC geralmente o inclui no conjunto de rótulos, mas os relatórios podem variar).

Para métricas de segmentação e armadilhas, veja Interseção sobre União.

Como o Pascal VOC é comumente usado hoje

Mesmo com conjuntos de dados maiores disponíveis, o VOC continua relevante porque ele é:

  • Pequeno o suficiente para treinar rapidamente e depurar pipelines
  • Historicamente importante (muitos baselines e estudos de ablação comparam com VOC)
  • Útil para aprendizado por transferência (transfer learning) e experimentos com “poucos dados (low-data)”

1) Benchmarking de detectores a IoU=0.5

O VOC é fortemente associado ao mAP@0.5 (frequentemente escrito “AP50” em contextos mais novos). Esse é um critério de localização mais fácil do que métricas multi-limiar usadas no Conjunto de Dados COCO, então os números podem parecer maiores e podem não refletir qualidade fina de localização.

2) Ajuste fino de modelos pré-treinados

Um workflow típico:

  1. Comece com um backbone pré-treinado no ImageNet (veja ImageNet).
  2. Substitua a cabeça de detecção (detection head) para 20 classes do VOC (+ fundo).
  3. Treine em VOC07+12 trainval.
  4. Avalie em VOC07 test.

Isso é comum em repositórios de pesquisa para fazer um sanity-check de uma implementação de detecção.

3) Prototipagem rápida e testes unitários para pipelines de visão

Como o VOC tem uma estrutura de arquivos estável e tamanho pequeno, ele é usado com frequência para validar:

  • data loaders e aumentos de dados (augmentations)
  • loops de treinamento
  • código de avaliação (IoU, NMS, AP)
  • pipelines de exportação/inferência

4) Pesquisa em aprendizado fracamente supervisionado e semissupervisionado

Como o VOC inclui rótulos de classificação e detecção (e segmentação para um subconjunto), ele tem sido usado em:

  • localização fracamente supervisionada (rótulos de classificação → pseudo-caixas)
  • segmentação semissupervisionada (máscaras limitadas + imagens extras sem rótulo)

Notas práticas e armadilhas comuns

Convenções de coordenadas

As caixas delimitadoras do VOC estão em coordenadas de pixel com (xmin, ymin, xmax, ymax) no XML. Muitas bibliotecas esperam:

  • coordenadas baseadas em 0 vs baseadas em 1
  • canto máximo inclusivo vs exclusivo

As anotações oficiais são pixels inteiros, mas seu framework de treinamento pode interpretá-las de forma diferente. Ao converter formatos, confirme a convenção esperada.

Múltiplos objetos por imagem

As imagens do VOC frequentemente contêm múltiplas instâncias da mesma classe e múltiplas classes. Garanta que seu pipeline suporte números variáveis de caixas por imagem.

Desbalanceamento de classes e efeitos de conjunto pequeno

O VOC é pequeno pelos padrões modernos, o que significa:

  • resultados podem ser sensíveis a hiperparâmetros de treinamento e augmentations
  • é fácil sofrer overfitting se treinar por tempo demais
  • a variância entre seeds aleatórias pode ser perceptível

Usando o script de avaliação “certo”

Se você quer comparabilidade com artigos antigos, use:

  • a implementação oficial de avaliação do VOC ou uma reprodução fiel
  • a variante de AP correspondente (VOC2007 11 pontos vs VOC2010+ contínuo)

Bibliotecas modernas de detecção frequentemente usam métricas no estilo COCO por padrão, a menos que configuradas explicitamente.

VOC vs benchmarks mais novos (por que métricas do VOC ainda importam)

A métrica canônica do VOC (mAP em IoU=0.5) é mais fácil do que a métrica do COCO, que é a média sobre limiares de IoU (0.50:0.95). Como resultado:

  • O VOC é bom para medir desempenho do tipo “você consegue encontrar o objeto?”.
  • O COCO é melhor para medir qualidade de localização em limiares estritos e desempenho em diferentes tamanhos de objeto.

Entender o VOC ainda é importante porque ele estabeleceu o pipeline padrão de avaliação de detecção (casamento por IoU + AP/mAP), e muitos métodos clássicos reportam números no VOC.

Para um contexto mais amplo de benchmarking, veja Benchmarks de Visão Computacional e Precisão Média (Mean Average Precision).

Resumo

Pascal VOC é um conjunto de dados e uma suíte de desafios fundamentais para a visão computacional, definindo tarefas e protocolos de avaliação padrão que moldaram a prática moderna:

  • Tarefas: classificação multi-rótulo, detecção de objetos, segmentação semântica
  • Versões principais: VOC2007 (split trainval/test amplamente reportado), VOC2012 (trainval maior; rótulos de segmentação para um subconjunto)
  • Anotações: XML para detecção (caixas + flags como difficult), mapas de rótulos em PNG para segmentação
  • Avaliação: correspondência baseada em IoU (tipicamente IoU ≥ 0.5) e mAP para detecção; mIoU para segmentação

Apesar de ter sido superado em escala por conjuntos de dados mais novos, o VOC continua sendo um benchmark “clássico” comum e um conjunto de dados prático para depuração, experimentação rápida e reprodução de baselines históricos.