PASCAL VOCデータセット#
PASCAL VOC(Visual Object Classes)データセットは、20種類の日常物体カテゴリを含む、古典的な物体検出ベンチマークです。UltralyticsのVOC.yaml設定では、VOC2007とVOC2012のtrainval分割を統合して画像16,551枚のトレーニングセットを作成し、公開アノテーション付きのVOC2007テスト画像4,952枚で検証します。初回使用時にすべてが自動ダウンロードされます(2.8 GB)。
視聴: Pascal VOC データセットで Ultralytics YOLO をトレーニングする方法 | 物体検出 | コンピュータービジョン 🚀
PASCAL VOCチャレンジは2005年から2012年まで開催され、物体検出モデルの評価方法を形作りました。このベンチマークは画像分類、検出、セグメンテーションのタスクを扱い、検出の標準指標として平均適合率(mAP)を広く普及させました。UltralyticsのVOC.yaml設定では検出アノテーションを使用し、ダウンロード時に元のXML形式のバウンディングボックスをYOLO形式に変換します。
主な機能#
- 日常物体の20クラス:人;6種類の動物(鳥、猫、牛、犬、馬、羊);7種類の乗り物(飛行機、自転車、ボート、バス、自動車、オートバイ、列車);6種類の屋内物体(ボトル、椅子、ダイニングテーブル、鉢植え、ソファ、テレビモニター)。
- 2世代のチャレンジを統合:トレーニングセットは、VOC2007 trainval(画像5,011枚)とVOC2012 trainval(画像11,540枚)を統合して作成されます。
- 標準化された評価:長年にわたって公開されたVOCのベースラインがあるため、検出モデルを比較する際の便利な基準となります。
- YOLOですぐに利用可能:ダウンロードスクリプトがアーカイブを取得し、アノテーションを自動変換するため、手動で準備する必要はありません。
データセットの構成#
UltralyticsのVOC.yaml設定では、次の分割を定義しています。
| 分割 | 画像 | ソース |
|---|---|---|
| 学習 | 16,551 | VOC2007 trainval(5,011枚)+ VOC2012 trainval(11,540枚) |
| 検証 | 4,952 | トレーニング中の評価に使用するVOC2007テスト |
| テスト | 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 🚀 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使用方法#
VOCは初回のトレーニング時に自動的にダウンロードされます。3つのアーカイブの合計サイズは2.8 GBで、展開と変換には約6 GBの空きディスク容量が必要です。
VOCデータセットでYOLO26nモデルを画像サイズ640、エポック数100でトレーニングするには、次のコードスニペットを使用できます。使用可能な引数の一覧については、モデルのトレーニングページを参照してください。
from ultralytics import YOLO
# モデルを読み込む
model = YOLO("yolo26n.pt") # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します)
# モデルをトレーニングします - データセットは初回実行時に自動ダウンロードされます
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)サンプル画像とアノテーション#
以下の画像は、VOCデータセットのモザイク化されたトレーニングバッチを示しています。モザイク化では複数の画像を1つのトレーニングサンプルに結合することで、各バッチでモデルが認識する物体、スケール、シーンのコンテキストの多様性を高めます。詳しくは、YOLOデータ拡張ガイドを参照してください。

引用と謝辞#
研究または開発で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}}コンピュータビジョンコミュニティにとって貴重なリソースであるVOCデータセットを作成し、維持しているPASCAL VOC Consortiumに感謝します。VOCデータセットとその作成者について詳しくは、PASCAL VOCデータセットのウェブサイトをご覧ください。
よくある質問#
PASCAL VOCは、人、車、犬、椅子など、日常的な20クラスの物体を対象に、物体検出モデルのトレーニングやベンチマークに使用されます。コンパクトで、ラベルがすべて付与されており、長年にわたる公開済みベースラインがあるため、新しいアーキテクチャの検証、授業での実験、簡単な転移学習の検討によく選ばれます。
UltralyticsのVOC設定には21,503枚の画像が含まれています。内訳は、トレーニング用が16,551枚(VOC2007 trainval + VOC2012 trainval)、検証用が4,952枚(VOC2007 testセット)です。すべての分割で同じ20クラスが使用されています。詳しい内訳はデータセットの構成を参照してください。
data="VOC.yaml"を使用した初回のトレーニング時にVOCが自動的にダウンロードされるため、手動での作業は必要ありません。スクリプトは、Ultralytics GitHubのリリースアセットから3つのアーカイブ(2.8 GB)を取得し、XML形式のアノテーションをYOLO形式に変換します。VOCでYOLO26nモデルを、エポック数100、画像サイズ640でトレーニングします。
トレーニング例from ultralytics import YOLO # モデルを読み込む model = YOLO("yolo26n.pt") # 事前トレーニング済みモデルを読み込みます(トレーニングにはこちらを推奨します) # モデルをトレーニングする 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 testで検証します。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のようなポリゴンラベル付きデータセットを使用してください。



