VOCデータセット

PASCAL VOC (Visual Object Classes) データセットは、物体検出、セグメンテーション、および分類において広く知られたデータセットです。多種多様な物体カテゴリの研究を促進するために設計されており、コンピュータビジョンモデルのベンチマークによく利用されます。物体検出、セグメンテーション、分類のタスクに取り組む研究者や開発者にとって不可欠なデータセットです。



Watch: How to Train Ultralytics YOLO26 on the Pascal VOC Dataset | Object Detection 🚀

主な特徴

  • VOCデータセットには、VOC2007とVOC2012という2つの主要なチャレンジが含まれています。
  • このデータセットは20の物体カテゴリで構成されており、車、自転車、動物といった一般的な物体に加え、ボート、ソファ、ダイニングテーブルといったより具体的なカテゴリも含まれています。
  • アノテーションには、物体検出および分類タスク用の物体バウンディングボックスとクラスラベル、およびセグメンテーションタスク用のセグメンテーションマスクが含まれています。
  • VOCは、物体検出や分類のためのmean Average Precision (mAP) といった標準化された評価指標を提供しており、モデルの性能比較に適しています。

データセットの構造

VOCデータセットは3つのサブセットに分割されています。

  1. Train: このサブセットには、物体検出、セグメンテーション、および分類モデルをトレーニングするための画像が含まれています。
  2. Validation: このサブセットには、モデルのトレーニング中に検証目的で使用される画像が含まれています。
  3. Test: このサブセットは、トレーニング済みモデルのテストおよびベンチマークに使用される画像で構成されています。このサブセットの正解データ(Ground truth)アノテーションは公開されておらず、以前はパフォーマンス評価のためにPASCAL VOC評価サーバーに結果を提出していました。

アプリケーション

The VOC dataset is widely used for training and evaluating deep learning models in object detection (such as Ultralytics YOLO, Faster R-CNN, and SSD), instance segmentation (such as Mask R-CNN), and image classification. The dataset's diverse set of object categories, large number of annotated images, and standardized evaluation metrics make it an essential resource for computer vision researchers and practitioners.

データセット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データセットで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)

サンプル画像とアノテーション

VOCデータセットには、さまざまな物体カテゴリや複雑なシーンを含む多様な画像セットが含まれています。以下は、データセットからの画像例と、それに対応するアノテーションの例です。

Pascal VOCデータセットのモザイク学習バッチ

  • モザイク画像: この画像は、モザイク処理されたデータセット画像で構成される学習バッチを示しています。モザイク処理は、学習中に複数の画像を1枚の画像に結合し、各学習バッチ内の物体やシーンの多様性を高めるために使用される手法です。これは、異なる物体のサイズ、アスペクト比、コンテキストに対してモデルが汎化する能力を向上させるのに役立ちます。

この例は、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データセットのウェブサイトをご覧ください。

FAQ

PASCAL VOCデータセットとは何ですか?また、なぜコンピュータビジョンのタスクにおいて重要なのですか?

PASCAL VOC (Visual Object Classes) データセットは、コンピュータビジョンにおける物体検出、セグメンテーション、および分類のための著名なベンチマークです。これには、20の異なる物体カテゴリにわたるバウンディングボックス、クラスラベル、セグメンテーションマスクといった包括的なアノテーションが含まれています。研究者は、mean Average Precision (mAP) のような標準化された評価指標があるため、Faster R-CNN、YOLO、Mask R-CNNなどのモデルの性能評価に広く利用しています。

VOCデータセットを使用してYOLO26モデルをトレーニングするにはどうすればよいですか?

VOCデータセットでYOLO26モデルをトレーニングするには、YAMLファイル内のデータセット設定が必要です。以下は、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)

VOCデータセットに含まれる主なチャレンジは何ですか?

VOCデータセットには、VOC2007とVOC2012という2つの主要なチャレンジが含まれています。これらのチャレンジでは、20の多様な物体カテゴリにわたって物体検出、セグメンテーション、分類をテストします。各画像には、バウンディングボックス、クラスラベル、セグメンテーションマスクが詳細にアノテーションされています。これらのチャレンジはmAPのような標準化された指標を提供し、異なるコンピュータビジョンモデルの比較やベンチマークを容易にします。

PASCAL VOCデータセットは、モデルのベンチマークと評価をどのように強化しますか?

PASCAL VOCデータセットは、詳細なアノテーションとmean Average Precision (mAP) のような標準化された指標を通じて、モデルのベンチマークと評価を強化します。これらの指標は、物体検出モデルや分類モデルの性能を評価するために不可欠です。データセットに含まれる多様で複雑な画像は、さまざまな現実世界のシナリオ全体で包括的なモデル評価を保証します。

YOLOモデルでセマンティックセグメンテーションのためにVOCデータセットを使用するにはどうすればよいですか?

YOLOモデルでセマンティックセグメンテーションタスクにVOCデータセットを使用するには、YAMLファイルでデータセットを適切に構成する必要があります。YAMLファイルは、セグメンテーションモデルのトレーニングに必要なパスとクラスを定義します。詳細な設定については、VOC.yamlのVOCデータセットYAML設定ファイルを確認してください。セグメンテーションタスクでは、検出モデルの代わりに yolo26n-seg.pt のようなセグメンテーション専用モデルを使用します。

コメント