Ultralytics YOLO27:
Get Started

PASCAL VOC 数据集#

PASCAL VOC(视觉目标类别)数据集是一个经典的目标检测基准,包含 20 个日常物体类别。Ultralytics 的 VOC.yaml 配置将 VOC2007 和 VOC2012 的 trainval 划分合并为一个包含 16,551 张图像的训练集,使用 4,952 张带有公开标注的 VOC2007 测试图像进行验证,并会在首次使用时自动下载所有数据(2.8 GB)。



观看: 如何在 Pascal VOC 数据集上训练 Ultralytics YOLO | 目标检测 | 计算机视觉 🚀

PASCAL VOC 挑战赛于 2005 年至 2012 年举办,塑造了目标检测模型的评估方式:该基准涵盖图像分类、检测和分割任务,并使平均精度均值 (mAP) 成为标准检测指标。Ultralytics 的 VOC.yaml 配置使用检测标注,并在下载期间将原始 XML 边界框转换为 YOLO 格式。

主要功能#

  • 20 个日常物体类别:人;六种动物(鸟、猫、牛、狗、马、羊);七种车辆(飞机、自行车、船、公交车、汽车、摩托车、火车);以及六种室内物体(瓶子、椅子、餐桌、盆栽、沙发、电视显示器)。
  • 合并两代挑战赛数据:训练集由 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-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/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 个 epochs,图像尺寸为 640,可以使用以下代码片段。有关可用参数的完整列表,请参阅模型的 训练页面。

训练示例
from ultralytics import YOLO

# 加载模型
model = YOLO("yolo26n.pt")  # 加载预训练模型(推荐用于训练)

# 训练模型 - 数据集会在首次运行时自动下载
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 个 epochs,图像尺寸设为 640:

    训练示例
    from ultralytics import YOLO
    
    # 加载模型
    model = YOLO("yolo26n.pt")  # 加载预训练模型(推荐用于训练)
    
    # 训练模型
    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 会对 IoU 从 0.5 到 0.95 的多个阈值下的 mAP 取平均值。VOC 训练速度快得多,适合快速实验;COCO 数据集是生产规模基准测试的标准。

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

评论