Ultralytics YOLO27:

PASCAL VOCデータセット#

PASCAL VOC(画像内物体クラス)データセットは、日常的な20種類の物体クラスを含む、古典的な物体検出ベンチマークです。UltralyticsのVOC.yaml設定は、VOC2007とVOC2012のtrainval分割を統合して16,551枚の画像からなるトレーニングセットを作成し、公開アノテーション付きのVOC2007テスト画像4,952枚で検証します。また、初回使用時にすべてのデータ(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、6種類の動物(bird、cat、cow、dog、horse、sheep)、7種類の乗り物(aeroplane、bicycle、boat、bus、car、motorbike、train)、6種類の屋内物体(bottle、chair、diningtable、pottedplant、sofa、tvmonitor)。
  • 2世代のチャレンジを統合:トレーニングでは、VOC2007 trainval(5,011枚)とVOC2012 trainval(11,540枚)を統合します。
  • 標準化された評価:数十年にわたって公開されてきたVOCのベースラインにより、検出モデルを比較するための便利な基準点となっています。
  • YOLO対応:ダウンロードスクリプトがアーカイブを取得し、アノテーションを自動的に変換するため、手動準備は不要です。

データセットの構成#

UltralyticsのVOC.yaml設定では、次の分割を定義しています。

分割画像ソース
トレーニング16,551VOC2007 trainval(5,011)+ VOC2012 trainval(11,540)
検証4,952トレーニング中の評価に使用するVOC2007テスト
テスト4,952同じVOC2007テスト画像。設定では別個のホールドアウト分割を定義していません

VOC2007テストのアノテーションは、その年のチャレンジ後に公開されたため、この分割をラベル付き検証セットとして使用できます。VOC2012テストのアノテーションは引き続き非公開であり、公式PASCAL評価サーバーを通じてのみスコアリングできます。そのため、この設定には含まれていません。

難易度の高い物体を除外

自動コンバーターは、元のVOC XMLアノテーションでdifficultのフラグが付いた物体をスキップするため、クラスごとのインスタンス数は公式VOC統計とわずかに異なります。

Ultralytics Platform上のVOCを開いて、アノテーションオーバーレイ付きの画像を閲覧し、Chartsタブでクラス分布とバウンディングボックスのヒートマップを確認し、クラウド上で独自のモデルをトレーニングするためにクローンできます。

アプリケーション#

PASCAL VOCは、より大規模なCOCOデータセットが登場する前の数年間、物体検出研究における主要なベンチマークでした。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は初回のトレーニング時に自動的にダウンロードされます。3つのアーカイブの合計サイズは2.8 GBで、展開と変換の間に約6 GBの空きディスク容量が必要です。

VOCデータセットでYOLO26nモデルを、画像サイズ640、100エポックでトレーニングするには、次のコードスニペットを使用できます。利用可能な引数の詳しい一覧については、モデルのTrainingページを参照してください。

トレーニング例
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データセットから作成したモザイク済みのトレーニングバッチを示しています。モザイク処理では複数の画像を1つのトレーニングサンプルに結合するため、各バッチでモデルが見る物体、スケール、シーンコンテキストの多様性が増加します。詳しくは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データセットのウェブサイトをご覧ください。

FAQ#

  • 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のリリースアセットから3つのアーカイブ(2.8 GB)を取得し、XMLアノテーションをYOLO形式に変換します。

  • VOCでYOLO26nモデルを、画像サイズ640、100エポックでトレーニングします。

    トレーニング例
    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はtrainval画像5,011枚と、アノテーションが公開されているテストセット4,952枚を提供します。VOC2012はtrainval画像11,540枚を提供しますが、テストアノテーションは非公開で、公式評価サーバーでのみスコアリングされます。UltralyticsのVOC.yamlは両方のtrainvalセットをトレーニング用に統合し、VOC2007テストで検証します。

  • VOCはより小規模でシンプルです。20クラス、21,503枚の画像であるのに対し、COCOは80クラス、330K枚の画像を含みます。VOCの結果は従来、0.5 IoUでのmAPとして報告されますが、COCOでは0.5から0.95までのIoUしきい値にわたるmAPの平均が使用されます。VOCははるかに高速にトレーニングでき、迅速な実験に適しています。一方、COCOデータセットはプロダクション規模のベンチマークにおける標準です。

  • いいえ。VOC.yamlは検出専用の設定です。コンバーターはVOC XMLアノテーションからバウンディングボックスを抽出しますが、元のベンチマークに含まれるセグメンテーションマスクは変換しません。インスタンスセグメンテーションモデルをトレーニングするには、yolo26n-seg.ptモデルでCOCO-Segなどのポリゴンラベル付きデータセットを使用してください。

コメント