Ultralytics YOLO27:

PASCAL VOC 데이터셋#

PASCAL VOC (시각 객체 클래스(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개의 일상적인 객체 클래스: 사람, 6개 동물(새, 고양이, 소, 개, 말, 양), 7개 차량(비행기, 자전거, 보트, 버스, 자동차, 오토바이, 기차), 6개 실내 객체(병, 의자, 식탁, 화분, 소파, TV 모니터)입니다.
  • 결합된 두 세대의 챌린지: 학습 세트는 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는 처음 학습할 때 자동으로 다운로드됩니다. 총 2.8 GB인 아카이브 3개를 다운로드하며, 압축 해제 및 변환 중에는 약 6 GB의 여유 디스크 공간이 필요합니다.

이미지 크기 640으로 VOC 데이터셋에서 YOLO26n 모델을 100 에포크 동안 학습하려면 다음 코드 스니펫을 사용할 수 있습니다. 사용 가능한 인자 전체 목록은 모델 학습 페이지를 참조하십시오.

학습 예제
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 데이터셋의 모자이크 처리된 학습 배치를 보여줍니다. 모자이크 처리는 여러 이미지를 하나의 학습 샘플로 결합하여 각 배치에서 모델이 접하는 객체, 스케일, 장면 맥락의 다양성을 높입니다. 자세한 내용은 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는 사람, 자동차, 개, 의자와 같은 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 형식으로 변환합니다.

  • 이미지 크기 640으로 VOC에서 YOLO26n 모델을 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은 5,011개의 trainval 이미지와 어노테이션이 공개된 4,952개 이미지의 테스트 세트를 제공하며, VOC2012는 11,540개의 trainval 이미지를 제공하지만 테스트 어노테이션은 공개되지 않아 공식 평가 서버를 통해서만 평가됩니다. Ultralytics VOC.yaml은 두 trainval 세트를 학습용으로 병합하고 VOC2007 테스트 세트로 검증합니다.

  • VOC는 더 작고 단순합니다. 20개 클래스와 21,503개 이미지로 구성되는 반면 COCO는 80개 클래스와 33만 개 이미지로 구성됩니다. VOC 결과는 전통적으로 0.5 IoU에서의 mAP로 보고되며, COCO는 0.5부터 0.95까지의 IoU 임계값에서 mAP를 평균합니다. VOC는 훨씬 빠르게 학습할 수 있어 빠른 실험에 적합하며, COCO 데이터셋은 프로덕션 규모 벤치마킹의 표준입니다.

  • 아니요. VOC.yaml은 검출 전용 구성입니다. 변환기는 VOC XML 어노테이션에서 바운딩 박스를 추출하며, 원본 벤치마크에 포함된 세그멘테이션 마스크는 변환하지 않습니다. 인스턴스 세그멘테이션 모델을 학습하려면 COCO-Seg와 같이 폴리곤 라벨이 있는 데이터셋을 yolo26n-seg.pt 모델과 함께 사용하십시오.

댓글