Link to this sectionPASCAL VOC 数据集#
PASCAL VOC (Visual Object Classes) 数据集是一个经典的目标检测基准,包含 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 格式。
Link to this section主要特性#
- 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:下载脚本会自动获取压缩包并转换标注——无需手动准备。
Link to this section数据集结构#
Ultralytics VOC.yaml 配置定义了以下分割:
| 拆分 | 图像 | 来源 |
|---|---|---|
| 训练 | 16,551 | VOC2007 trainval (5,011) + VOC2012 trainval (11,540) |
| 验证 | 4,952 | VOC2007 测试集,用于训练期间的评估 |
| 测试 | 4,952 | 相同的 VOC2007 测试图像 — 该配置未定义单独的保留分割 |
VOC2007 测试标注在该年度挑战赛结束后公开发布,这使得该分割集可以作为带标签的验证集使用。VOC2012 的测试标注未公开——其结果只能通过官方 PASCAL 评估服务器进行评分——因此它们不包含在此配置中。
自动转换器会跳过原始 VOC XML 标注中标记为 difficult 的物体,因此每类的实例计数与官方 VOC 统计数据略有不同。
探索 VOC on Ultralytics Platform,浏览带有标注覆盖层的图像,在“图表 (Charts)”选项卡中查看类别分布和边界框热力图,并将其克隆到云端以训练你自己的模型。
Link to this section应用#
PASCAL VOC 是在更大的 COCO 数据集出现之前,目标检测研究的主要基准:诸如 Faster R-CNN 和 SSD 等检测器都在其上报告了原始结果,而 Ultralytics YOLO 模型也可以直接在其上进行训练。如今它在以下方面依然广受欢迎:
- 针对长期发布的基准线评估新的检测架构
- 快速实验和课程学习 —— 拥有 16,551 张训练图像,其训练速度远快于 COCO
- 在精简且众所周知的日常物体类别集上进行迁移学习研究
Link to this section数据集 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 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, 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 formatLink to this section用法#
VOC 会在你首次训练时自动下载——三个压缩包共计 2.8 GB——在解压和转换过程中需要大约 6 GB 的剩余磁盘空间。
若要使用图像大小为 640 的 YOLO26n 模型在 VOC 数据集上训练 100 个 轮次,你可以使用以下代码片段。有关可用参数的完整列表,请参阅模型 训练 页面。
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)Link to this section样本图像和标注#
下图展示了来自 VOC 数据集的马赛克训练批次。马赛克增强将多张图像合并为单个训练样本,增加了模型在每个批次中看到的物体种类、尺度和场景上下文——详见 YOLO 数据增强指南。

Link to this section引用与致谢#
如果你在研究或开发工作中使用了 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 联盟为 计算机视觉 社区创建并维护了这一宝贵资源。有关 VOC 数据集及其创建者的更多信息,请访问 PASCAL VOC 数据集网站。
Link to this section常见问题解答#
Link to this sectionPASCAL VOC 数据集有什么用途?#
PASCAL VOC 用于训练和评估包含 20 个日常物体类别(如人、车、狗和椅子)的目标检测模型。由于它体积精简、完全标注且拥有多年发布的基准线,它成为了验证新架构、进行课程实验和快速迁移学习研究的常用选择。
Link to this sectionPASCAL VOC 数据集中有多少张图像?#
Ultralytics VOC 配置包含 21,503 张图像:16,551 张用于训练(VOC2007 trainval + VOC2012 trainval),4,952 张用于验证(VOC2007 测试集)。所有分割集共享相同的 20 个类别。查看 数据集结构 以获取完整细分。
Link to this section如何下载 PASCAL VOC 数据集?#
在你首次使用 data="VOC.yaml" 进行训练时,VOC 会自动下载——无需手动操作。该脚本会从 Ultralytics GitHub 发布资产中获取三个压缩包(2.8 GB),并将 XML 标注转换为 YOLO 格式。
Link to this section如何使用 YOLO26 模型在 VOC 数据集上进行训练?#
使用图像尺寸 640 在 VOC 上训练 YOLO26n 模型 100 个 epoch:
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)Link to this sectionVOC2007 和 VOC2012 有什么区别?#
两次挑战赛共享相同的 20 个类别,但提供了不同的图像。VOC2007 提供了 5,011 张 trainval 图像以及包含公开标注的 4,952 张测试图像;VOC2012 提供了 11,540 张 trainval 图像,其测试标注未公开,仅由官方评估服务器进行评分。Ultralytics VOC.yaml 将两个 trainval 集合并用于训练,并在 VOC2007 测试集上进行验证。
Link to this sectionPASCAL VOC 与 COCO 数据集相比如何?#
VOC 更小且更简单:20 个类别和 21,503 张图像,而 COCO 则有 80 个类别和 330K 张图像。VOC 结果传统上以 0.5 IoU 的 mAP 报告,而 COCO 则取 0.5 到 0.95 IoU 阈值的平均 mAP。VOC 训练速度快得多,适合快速实验;而 COCO 数据集是生产级基准测试的标准。
Link to this section我可以使用 VOC.yaml 训练分割模型吗?#
不能——VOC.yaml 是仅针对检测的配置:它的转换器从 VOC XML 标注中提取边界框,原基准中包含的分割掩码不会被转换。要训练实例分割模型,请使用带有多边形标签的数据集(例如 COCO-Seg)并配合 yolo26n-seg.pt 模型。