Dataset VOC
O dataset PASCAL VOC (Visual Object Classes) é um conhecido conjunto de dados de deteção, segmentação e classificação de objetos. Foi concebido para incentivar a investigação numa grande variedade de categorias de objetos e é habitualmente utilizado para comparar modelos de visão computacional. É um dataset essencial para investigadores e programadores que trabalham em tarefas de deteção, segmentação e classificação de objetos.
Watch: How to Train Ultralytics YOLO26 on the Pascal VOC Dataset | Object Detection 🚀
Principais recursos
- O dataset VOC inclui dois desafios principais: VOC2007 e VOC2012.
- O dataset é composto por 20 categorias de objetos, incluindo objetos comuns como carros, bicicletas e animais, bem como categorias mais específicas como barcos, sofás e mesas de jantar.
- As anotações incluem caixas delimitadoras (bounding boxes) e etiquetas de classe para tarefas de deteção e classificação de objetos, e máscaras de segmentação para as tarefas de segmentação.
- O VOC fornece métricas de avaliação normalizadas como a mean Average Precision (mAP) para deteção e classificação de objetos, tornando-o adequado para comparar o desempenho de modelos.
Estrutura do Dataset
O dataset VOC está dividido em três subconjuntos:
- Train: Este subconjunto contém imagens para treinar modelos de deteção, segmentação e classificação de objetos.
- Validation: Este subconjunto possui imagens utilizadas para fins de validação durante o treino do modelo.
- Test: Este subconjunto consiste em imagens utilizadas para testar e comparar os modelos treinados. As anotações de verdade absoluta (ground truth) para este subconjunto não estão disponíveis publicamente, e os resultados eram historicamente submetidos ao servidor de avaliação PASCAL VOC para avaliação de desempenho.
Aplicações
O dataset VOC é amplamente utilizado para treinar e avaliar modelos de deep learning em deteção de objetos (como Ultralytics YOLO, Faster R-CNN e SSD), instance segmentation (como Mask R-CNN) e image classification. O conjunto diversificado de categorias de objetos, o grande número de imagens anotadas e as métricas de avaliação normalizadas do dataset fazem dele um recurso essencial para investigadores e profissionais de computer vision.
YAML do Dataset
Um ficheiro YAML (Yet Another Markup Language) é usado para definir a configuração do dataset. Contém informações sobre os caminhos, classes e outras informações relevantes do dataset. No caso do dataset VOC, o ficheiro VOC.yaml é mantido em https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VOC.yaml.
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# PASCAL VOC dataset http://host.robots.ox.ac.uk/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, 5012 images
f"{ASSETS_URL}/VOCtest_06-Nov-2007.zip", # 438MB, 4953 images
f"{ASSETS_URL}/VOCtrainval_11-May-2012.zip", # 1.95GB, 17126 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 formatUtilização
Para treinar um modelo YOLO26n no dataset VOC durante 100 epochs com um tamanho de imagem de 640, podes usar os seguintes fragmentos de código. Para uma lista completa de argumentos disponíveis, consulta a página de Training do modelo.
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="VOC.yaml", epochs=100, imgsz=640)Amostra de Imagens e Anotações
O dataset VOC contém um conjunto diversificado de imagens com várias categorias de objetos e cenas complexas. Aqui estão alguns exemplos de imagens do dataset, juntamente com as suas respetivas anotações:

- Imagem em mosaico: Esta imagem demonstra um lote de treino composto por imagens do conjunto de dados em mosaico. A técnica de mosaico é um método utilizado durante o treino que combina várias imagens numa única para aumentar a variedade de objetos e cenas dentro de cada lote de treino. Isto ajuda a melhorar a capacidade do modelo de generalizar para diferentes tamanhos de objetos, proporções e contextos.
O exemplo mostra a variedade e complexidade das imagens no dataset VOC e os benefícios de usar a técnica de mosaico durante o processo de treino.
Citações e Agradecimentos
Se utilizares o dataset VOC no teu trabalho de investigação ou desenvolvimento, por favor cita o seguinte artigo:
@misc{everingham2010pascal,
title={The PASCAL Visual Object Classes (VOC) Challenge},
author={Mark Everingham and Luc Van Gool and Christopher K. I. Williams and John Winn and Andrew Zisserman},
year={2010},
eprint={0909.5206},
archivePrefix={arXiv},
primaryClass={cs.CV}
}Gostaríamos de agradecer ao PASCAL VOC Consortium por criar e manter este recurso valioso para a comunidade de computer vision. Para mais informações sobre o dataset VOC e os seus criadores, visita o site do dataset PASCAL VOC.
FAQ
O que é o dataset PASCAL VOC e porque é importante para tarefas de visão computacional?
O dataset PASCAL VOC (Visual Object Classes) é um benchmark de renome para object detection, segmentação e classificação em visão computacional. Inclui anotações abrangentes como caixas delimitadoras, etiquetas de classe e máscaras de segmentação em 20 categorias de objetos diferentes. Os investigadores utilizam-no amplamente para avaliar o desempenho de modelos como Faster R-CNN, YOLO e Mask R-CNN devido às suas métricas de avaliação normalizadas, como a mean Average Precision (mAP).
Como treino um modelo YOLO26 usando o dataset VOC?
Para treinar um modelo YOLO26 com o dataset VOC, precisas da configuração do dataset num ficheiro YAML. Aqui tens um exemplo para começar a treinar um modelo YOLO26n durante 100 épocas com um tamanho de imagem de 640:
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="VOC.yaml", epochs=100, imgsz=640)Quais são os principais desafios incluídos no dataset VOC?
O dataset VOC inclui dois desafios principais: VOC2007 e VOC2012. Estes desafios testam a deteção de objetos, segmentação e classificação em 20 categorias de objetos diversas. Cada imagem é meticulosamente anotada com caixas delimitadoras, etiquetas de classe e máscaras de segmentação. Os desafios fornecem métricas normalizadas como mAP, facilitando a comparação e o benchmarking de diferentes modelos de visão computacional.
Como é que o dataset PASCAL VOC melhora o benchmarking e a avaliação de modelos?
O dataset PASCAL VOC melhora o benchmarking e a avaliação de modelos através das suas anotações detalhadas e métricas normalizadas como a mean Average Precision (mAP). Estas métricas são cruciais para avaliar o desempenho de modelos de deteção e classificação de objetos. As imagens diversas e complexas do dataset asseguram uma avaliação abrangente do modelo em vários cenários do mundo real.
Como utilizo o dataset VOC para semantic segmentation em modelos YOLO?
Para utilizares o dataset VOC em tarefas de segmentação semântica com modelos YOLO, precisas de configurar corretamente o dataset num ficheiro YAML. O ficheiro YAML define os caminhos e as classes necessários para treinar modelos de segmentação. Consulta o ficheiro de configuração YAML do dataset VOC em VOC.yaml para obter configurações detalhadas. Para tarefas de segmentação, deverás usar um modelo específico para segmentação, como yolo26n-seg.pt, em vez do modelo de deteção.