Ultralytics YOLO27:

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

VOC2007 测试标注在当年挑战赛结束后公开发布,因此该划分可以作为带标签的验证集。VOC2012 测试标注仍未公开——其结果只能通过官方 PASCAL 评估服务器进行评分——因此不属于此配置。

排除困难对象

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

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

应用#

在规模更大的 COCO 数据集出现之前,PASCAL VOC 曾是目标检测研究的主要基准:Faster R-CNNSSD 等检测器都曾在其上报告初始结果,而 Ultralytics YOLO 模型开箱即用地支持在其上训练。如今,它仍广泛用于:

  • 将新的检测架构与长期以来发布的大量基线结果进行基准比较
  • 快速实验和课程作业——该数据集包含 16,551 张训练图像,训练速度远快于 COCO
  • 在紧凑且广为人知的日常类别集合上进行迁移学习研究

数据集 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 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

使用方法#

下载大小 2.8 GB

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

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

引用和致谢#

如果你在研究或开发工作中使用 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 格式。

  • 在 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
    results = model.train(data="VOC.yaml", epochs=100, imgsz=640)

    有关详细配置,请参阅训练页面和模型训练技巧

  • 两个挑战赛共享相同的 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 数据集则是生产级规模基准测试的标准。

  • 不可以——VOC.yaml 是仅用于检测的配置:其转换器从 VOC XML 标注中提取边界框,而原始基准中包含的分割掩码不会被转换。要训练实例分割模型,请使用带有多边形标注的数据集,例如使用 yolo26n-seg.pt 模型的 COCO-Seg

评论