跳转至内容

VOC 数据集

The PASCAL VOC(视觉对象类别)数据集是一个知名的目标检测、segmentation和分类数据集。它旨在鼓励对各种对象类别进行研究,并常用于基准测试计算机视觉模型。对于从事目标检测、segmentation和分类任务的研究人员和开发人员来说,它是一个必不可少的数据集。

主要功能

  • VOC 数据集包括两个主要挑战:VOC2007 和 VOC2012。
  • 该数据集包含 20 个对象类别,包括常见的对象,如汽车、自行车和动物,以及更具体的类别,如船、沙发和餐桌。
  • 标注包括用于对象检测和分类任务的对象边界框和类别标签,以及用于分割任务的分割掩码。
  • VOC 提供标准化的评估指标,例如平均精度 (mAP),用于目标 detect 和分类,使其适用于比较模型性能。

数据集结构

VOC 数据集分为三个子集:

  1. Train: 此子集包含用于训练对象检测、分割和分类模型的图像。
  2. 验证: 此子集包含用于模型训练期间验证的图像。
  3. Test:此子集包含用于测试和基准评估训练好的模型的图像。此子集的真实标注未公开,结果将提交至 PASCAL VOC 评估服务器 进行性能评估。

应用

VOC 数据集广泛用于训练和评估目标 detect(例如 Ultralytics YOLOFaster R-CNNSSD)、实例 segment(例如 Mask R-CNN)和 图像分类 中的 深度学习 模型。该数据集多样化的对象类别、大量的标注图像以及标准化的评估指标使其成为 计算机视觉 研究人员和从业者的重要资源。

数据集 YAML

YAML(Yet Another Markup Language)文件用于定义数据集配置。它包含数据集的路径、类别及其他相关信息。对于VOC数据集, VOC.yaml 文件保存在 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, 5012 images
      f"{ASSETS_URL}/VOCtest_06-Nov-2007.zip",  # 438MB, 4953 images
      f"{ASSETS_URL}/VOCtrainval_11-May-2012.zip",  # 1.95GB, 17126 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 数据集上训练 YOLO11n 模型,进行 100 个 epoch,图像尺寸为 640,您可以使用以下代码片段。有关可用参数的完整列表,请参阅模型训练页面。

训练示例

from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)
# Start training from a pretrained *.pt model
yolo detect train data=VOC.yaml model=yolo11n.pt epochs=100 imgsz=640

Sample Images 和注释

VOC 数据集包含各种对象类别和复杂场景的图像。以下是数据集中图像的一些示例及其对应的标注:

数据集样本图像

  • Mosaiced Image:此图像演示了一个由 mosaiced 数据集图像组成的训练批次。Mosaicing 是一种在训练期间使用的技术,它将多个图像组合成一个图像,以增加每个训练批次中对象和场景的多样性。这有助于提高模型泛化到不同对象大小、纵横比和上下文的能力。

该示例展示了 VOC 数据集中图像的多样性和复杂性,以及在训练过程中使用马赛克增强的好处。

引用和致谢

如果您在研究或开发工作中使用VOC数据集,请引用以下论文:

@misc{everingham2010pascal,
      title={The PASCAL Visual Object Classes (VOC) Challenge},
      author={Mark Everingham and Luc Van Gool and Christopher K. I. Williams and John Winn and Andrew Zisserman},
      year={2010},
      eprint={0909.5206},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

我们感谢 PASCAL VOC 联盟为计算机视觉社区创建和维护这一宝贵资源。有关 VOC 数据集及其创建者的更多信息,请访问 PASCAL VOC 数据集网站

常见问题

什么是PASCAL VOC数据集,它对计算机视觉任务为何重要?

The PASCAL VOC(视觉对象类别)数据集是计算机视觉领域中用于目标检测、segmentation和分类的知名基准。它包含边界框、类别标签和segmentation掩码等全面的标注,涵盖20个不同的对象类别。由于其标准化评估指标,如平均精度均值(mAP),研究人员广泛使用它来评估Faster R-CNN、YOLO和Mask R-CNN等模型的性能。

如何使用VOC数据集训练YOLO11模型?

要使用 VOC 数据集训练 YOLO11 模型,您需要 YAML 文件中的数据集配置。以下是一个示例,用于启动训练一个图像尺寸为 640、进行 100 个 epoch 的 YOLO11n 模型:

训练示例

from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)
# Start training from a pretrained *.pt model
yolo detect train data=VOC.yaml model=yolo11n.pt epochs=100 imgsz=640

VOC数据集中包含哪些主要挑战?

VOC 数据集包括两个主要挑战:VOC2007 和 VOC2012。这些挑战测试了跨 20 种不同对象类别的目标 detect、segment 和分类。每张图像都经过精心标注,包含边界框、类别标签和分割掩码。这些挑战提供了 mAP 等标准化指标,有助于比较和基准测试不同的计算机视觉模型。

PASCAL VOC数据集如何增强模型基准测试和评估?

PASCAL VOC 数据集通过其详细的标注和平均Precision (mAP) 等标准化指标,增强了模型基准测试和评估能力。这些指标对于评估 object detection 和分类模型的性能至关重要。该数据集多样化和复杂的图像确保了在各种真实世界场景中进行全面的模型评估。

如何在YOLO模型中使用VOC数据集进行语义分割

要将 VOC 数据集用于 YOLO 模型的语义分割任务,您需要在一个 yaml 文件中正确配置数据集。该 yaml 文件定义了训练分割模型所需的路径和类别。请查看 VOC 数据集 yaml 配置文件: VOC.yaml 有关详细设置。对于分割任务,您可以使用特定于分割的模型,例如 yolo11n-seg.pt 而不是检测模型。



📅 创建于 2 年前 ✏️ 9 个月前更新
glenn-jocherUltralyticsAssistantMatthewNoyceRizwanMunawar

评论