PASCAL VOC 数据集#
PASCAL VOC(视觉对象类别)数据集是一个经典的目标检测基准,包含 20 个日常物体类别。Ultralytics 的 VOC.yaml 配置将 VOC2007 和 VOC2012 的 trainval 划分合并为包含 16,551 张图像的训练集,在 4,952 张公开标注的 VOC2007 测试图像上进行验证,并在首次使用时自动下载全部数据(2.8 GB)。
Watch: How to Train Ultralytics YOLO on the Pascal VOC Dataset | Object Detection | Computer Vision 🚀
PASCAL VOC 挑战赛于 2005 年至 2012 年举办,影响了目标检测模型的评估方式:该基准涵盖图像分类、检测和分割任务,并推广了平均精度均值(mAP)作为标准检测指标。Ultralytics 的 VOC.yaml 配置使用检测标注,并在下载过程中将原始 XML 边界框转换为 YOLO 格式。
主要特性#
- 20 个日常物体类别:person;六种动物(bird、cat、cow、dog、horse、sheep);七种交通工具(aeroplane、bicycle、boat、bus、car、motorbike、train);以及六种室内物体(bottle、chair、diningtable、pottedplant、sofa、tvmonitor)。
- 合并两个挑战赛版本:训练集将 VOC2007 trainval(5,011 张图像)与 VOC2012 trainval(11,540 张图像)合并。
- 标准化评估:数十年来发布的大量 VOC 基线结果,使其成为比较检测模型的便捷参考。
- 适用于 YOLO:下载脚本会自动获取压缩包并转换标注——无需手动准备。
数据集结构#
Ultralytics 的 VOC.yaml 配置定义了以下数据划分:
| 划分 | 图像 | 来源 |
|---|---|---|
| 训练 | 16,551 | VOC2007 trainval(5,011)+ VOC2012 trainval(11,540) |
| 验证 | 4,952 | VOC2007 test,在训练期间用于评估 |
| 测试 | 4,952 | 相同的 VOC2007 测试图像——该配置未定义单独的留出划分 |
VOC2007 测试标注在当年挑战赛结束后公开发布,因此该划分可以作为带标签的验证集。VOC2012 测试标注仍未公开——其结果只能通过官方 PASCAL 评估服务器进行评分——因此不属于此配置。
自动转换器会跳过原始 VOC XML 标注中标记为 difficult 的对象,因此各类别的实例数量与官方 VOC 统计数据略有不同。
探索 Ultralytics Platform 上的 VOC,浏览带有标注叠加层的图像,在 Charts 选项卡中查看类别分布和边界框热力图,并将其克隆到云端以训练你自己的模型。
应用#
在规模更大的 COCO 数据集出现之前,PASCAL VOC 曾是目标检测研究的主要基准:Faster R-CNN 和 SSD 等检测器都曾在其上报告初始结果,而 Ultralytics YOLO 模型开箱即用地支持在其上训练。如今,它仍广泛用于:
- 将新的检测架构与长期以来发布的大量基线结果进行基准比较
- 快速实验和课程作业——该数据集包含 16,551 张训练图像,训练速度远快于 COCO
- 在紧凑且广为人知的日常类别集合上进行迁移学习研究
数据集 YAML#
VOC.yaml 文件定义了数据集配置——包括数据集路径、20 个类别名称以及自动下载和转换脚本。该文件维护于 Ultralytics 代码库中,地址为 https://github.com/ultralytics/ultralytics/blob/main/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使用方法#
VOC 会在你首次训练时自动下载——三个压缩包总计 2.8 GB——并且在解压和转换期间需要大约 6 GB 的可用磁盘空间。
要在 VOC 数据集上训练 YOLO26n 模型 100 个周期,并将图像尺寸设为 640,可以使用以下代码片段。有关可用参数的完整列表,请参阅模型训练页面。
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="VOC.yaml", epochs=100, imgsz=640)示例图像和标注#
下图展示了 VOC 数据集中的一个马赛克训练批次。马赛克增强会将多张图像组合成一个训练样本,从而增加模型在每个批次中看到的物体、尺度和场景上下文的多样性——详情请参阅 YOLO 数据增强指南。

引用和致谢#
如果你在研究或开发工作中使用 VOC 数据集,请引用以下论文:
@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}}我们谨此感谢 PASCAL VOC Consortium 创建并维护这一为计算机视觉社区提供的宝贵资源。有关 VOC 数据集及其创建者的更多信息,请访问 PASCAL VOC 数据集网站。
常见问题#
PASCAL VOC 用于在 person、car、dog 和 chair 等 20 个日常物体类别上训练和评估目标检测模型。由于它规模紧凑、标注完整,并有多年发布的基线结果支持,因此常用于验证新架构、开展课程实验以及进行快速的迁移学习研究。
Ultralytics VOC 配置包含 21,503 张图像:16,551 张用于训练(VOC2007 trainval + VOC2012 trainval),4,952 张用于验证(VOC2007 测试集)。所有划分共享相同的 20 个类别。完整明细请参阅数据集结构。
你首次使用
data="VOC.yaml"训练时,VOC 会自动下载——无需手动操作。该脚本会从 Ultralytics GitHub 发布资源中获取三个压缩包(2.8 GB),并将 XML 标注转换为 YOLO 格式。两个挑战赛共享相同的 20 个类别,但包含不同的图像。VOC2007 提供 5,011 张 trainval 图像,以及一个包含 4,952 张图像且标注公开的测试集;VOC2012 提供 11,540 张 trainval 图像,但其测试标注未公开,只能通过官方评估服务器评分。Ultralytics 的
VOC.yaml将两个 trainval 集合合并用于训练,并在 VOC2007 测试集上进行验证。VOC 更小、更简单:包含 20 个类别和 21,503 张图像,而 COCO 包含 80 个类别和 330K 张图像。VOC 结果通常报告为 IoU 为 0.5 时的 mAP,而 COCO 则对 0.5 至 0.95 的 IoU 阈值范围取 mAP 平均值。VOC 训练速度快得多,适合快速实验;COCO 数据集则是生产级规模基准测试的标准。



