Ultralytics YOLO27:

PASCAL VOC 데이터셋#

PASCAL VOC(시각 객체 클래스) 데이터셋은 20개 일상 객체 클래스를 포함하는 고전적인 객체 탐지 벤치마크입니다. Ultralytics VOC.yaml 구성은 VOC2007 및 VOC2012의 trainval 분할을 결합해 학습 이미지 16,551장으로 구성하고, 공개 어노테이션이 있는 VOC2007 테스트 이미지 4,952장으로 검증하며, 처음 사용할 때 전체 데이터(2.8GB)를 자동으로 다운로드합니다.



시청: Pascal VOC 데이터셋으로 Ultralytics YOLO를 학습하는 방법 | 객체 감지 | 컴퓨터 비전 🚀

PASCAL VOC 챌린지는 2005년부터 2012년까지 진행되었으며 객체 탐지 모델의 평가 방식을 형성했습니다. 벤치마크는 이미지 분류, 탐지, 분할 작업을 아우르며 표준 탐지 지표로 평균 정밀도(mAP)를 널리 사용하게 했습니다. Ultralytics VOC.yaml 구성은 탐지 어노테이션을 사용하며, 다운로드 과정에서 원본 XML 바운딩 박스를 YOLO 형식으로 변환합니다.

주요 기능#

  • 일상 객체 클래스 20개: 사람, 동물 6종(bird, cat, cow, dog, horse, sheep), 차량 7종(aeroplane, bicycle, boat, bus, car, motorbike, train), 실내 객체 6종(bottle, chair, diningtable, pottedplant, sofa, tvmonitor)입니다.
  • 두 세대의 챌린지 결합: 학습 세트는 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 test
테스트4,952동일한 VOC2007 테스트 이미지입니다. 구성에 별도의 홀드아웃 분할은 정의되어 있지 않습니다.

VOC2007 테스트 어노테이션은 해당 연도 챌린지가 끝난 뒤 공개되었기 때문에 이 분할을 레이블이 있는 검증 세트로 사용할 수 있습니다. VOC2012 테스트 어노테이션은 계속 비공개로 유지되며, 공식 PASCAL 평가 서버를 통해서만 결과를 채점할 수 있으므로 이 구성에는 포함되지 않습니다.

제외된 난이도 높은 객체

자동 변환기는 원본 VOC XML 어노테이션에서 difficult으로 표시된 객체를 건너뛰므로 클래스별 인스턴스 수가 공식 VOC 통계와 약간 다릅니다.

Ultralytics Platform의 VOC를 살펴보면서 어노테이션 오버레이와 함께 이미지를 둘러보고, Charts 탭에서 클래스 분포 및 바운딩 박스 히트맵을 확인하고, 데이터셋을 복제해 클라우드에서 직접 모델을 학습할 수 있습니다.

응용 분야#

PASCAL VOC는 더 큰 COCO 데이터셋이 등장하기 전까지 객체 탐지 연구의 주요 벤치마크였습니다. 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/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.8GB 다운로드

VOC는 처음 학습할 때 자동으로 다운로드됩니다. 총 2.8GB 용량의 아카이브 3개가 다운로드되며, 압축 해제 및 변환 중에는 약 6GB의 여유 디스크 공간이 필요합니다.

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

학습 예제
from ultralytics import YOLO

# 모델 로드
model = YOLO("yolo26n.pt")  # 사전 학습된 모델을 불러옵니다(학습에 권장).

# 모델을 학습합니다 - 데이터셋은 첫 실행 시 자동으로 다운로드됩니다
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 데이터셋 웹사이트를 방문하세요.

자주 묻는 질문#

  • 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.8GB)를 가져와 XML 주석을 YOLO 형식으로 변환합니다.

  • 이미지 크기 640으로 100 epochs 동안 VOC에서 YOLO26n 모델을 학습합니다:

    학습 예제
    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는 COCO보다 규모가 작고 단순합니다. 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처럼 폴리곤 라벨이 있는 데이터셋을 사용하세요.

댓글