企业级安全保障: 符合 ISO 27001 + SOC 2 Type I 标准。
No license

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,551VOC2007 trainval (5,011) + VOC2012 trainval (11,540)
验证4,952VOC2007 测试集,用于训练期间的评估
测试4,952相同的 VOC2007 测试图像 — 该配置未定义单独的保留分割

VOC2007 测试标注在该年度挑战赛结束后公开发布,这使得该分割集可以作为带标签的验证集使用。VOC2012 的测试标注未公开——其结果只能通过官方 PASCAL 评估服务器进行评分——因此它们不包含在此配置中。

排除困难物体

自动转换器会跳过原始 VOC XML 标注中标记为 difficult 的物体,因此每类的实例计数与官方 VOC 统计数据略有不同。

探索 VOC on Ultralytics Platform,浏览带有标注覆盖层的图像,在“图表 (Charts)”选项卡中查看类别分布和边界框热力图,并将其克隆到云端以训练你自己的模型。

Link to this section应用#

PASCAL VOC 是在更大的 COCO 数据集出现之前,目标检测研究的主要基准:诸如 Faster R-CNNSSD 等检测器都在其上报告了原始结果,而 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/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 format

Link to this section用法#

2.8 GB 下载

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 数据增强指南

Pascal VOC 数据集马赛克训练批次

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 模型。

评论