Ultralytics YOLO27:

Tập dữ liệu PASCAL VOC#

Tập dữ liệu PASCAL VOC (Các lớp đối tượng trực quan) là một benchmark phát hiện đối tượng kinh điển với 20 lớp đối tượng thường gặp. Cấu hình VOC.yaml của Ultralytics kết hợp các phần trainval của VOC2007 và VOC2012 thành một tập huấn luyện gồm 16.551 ảnh, đánh giá trên 4.952 ảnh kiểm thử VOC2007 được gắn nhãn công khai, đồng thời tự động tải xuống toàn bộ dữ liệu (2.8 GB) trong lần sử dụng đầu tiên.



Watch: How to Train Ultralytics YOLO on the Pascal VOC Dataset | Object Detection | Computer Vision 🚀

Các cuộc thi PASCAL VOC diễn ra từ năm 2005 đến năm 2012 và định hình cách đánh giá các model phát hiện đối tượng: benchmark này bao gồm các tác vụ phân loại ảnh, phát hiện và phân đoạn, đồng thời phổ biến hóa Mean Average Precision (mAP) như metric phát hiện tiêu chuẩn. Cấu hình VOC.yaml của Ultralytics sử dụng các annotation phát hiện, chuyển đổi các bounding box XML gốc sang định dạng YOLO trong quá trình tải xuống.

Tính năng chính#

  • 20 lớp đối tượng thường gặp: người; sáu loài động vật (chim, mèo, bò, chó, ngựa, cừu); bảy phương tiện (máy bay, xe đạp, thuyền, xe buýt, ô tô, xe máy, tàu hỏa); và sáu vật thể trong nhà (chai, ghế, bàn ăn, cây trồng trong chậu, sofa, màn hình TV).
  • Kết hợp hai thế hệ cuộc thi: tập huấn luyện gộp VOC2007 trainval (5.011 ảnh) với VOC2012 trainval (11.540 ảnh).
  • Đánh giá được chuẩn hóa: nhiều thập kỷ có các baseline VOC đã công bố khiến đây trở thành điểm tham chiếu thuận tiện để so sánh các model phát hiện.
  • Sẵn sàng cho YOLO: script tải xuống sẽ lấy các archive và tự động chuyển đổi annotation — không cần chuẩn bị thủ công.

Cấu trúc bộ dữ liệu#

Cấu hình VOC.yaml của Ultralytics định nghĩa các phần dữ liệu sau:

SplitẢnhNguồn
Huấn luyện16,551VOC2007 trainval (5.011) + VOC2012 trainval (11.540)
Validation4,952VOC2007 test, được sử dụng để đánh giá trong quá trình huấn luyện
Test4,952Các ảnh kiểm thử VOC2007 tương tự — cấu hình không định nghĩa phần dữ liệu riêng được giữ lại để kiểm tra

Annotation của VOC2007 test được công bố sau cuộc thi năm đó, nhờ vậy phần dữ liệu này có thể được dùng làm tập validation có nhãn. Annotation của VOC2012 test vẫn chưa được công bố — kết quả trên phần này chỉ có thể được chấm điểm thông qua server đánh giá PASCAL chính thức — vì vậy chúng không thuộc cấu hình này.

Loại trừ các đối tượng khó

Bộ chuyển đổi tự động bỏ qua các đối tượng được đánh dấu difficult trong annotation XML VOC gốc, vì vậy số lượng instance theo từng lớp hơi khác so với thống kê VOC chính thức.

Khám phá VOC trên Ultralytics Platform để duyệt các ảnh cùng lớp phủ annotation, xem phân phối lớp và heatmap bounding box trong tab Charts, rồi clone dataset để huấn luyện model của riêng bạn trên cloud.

Ứng dụng#

PASCAL VOC là benchmark chính cho nghiên cứu phát hiện đối tượng trong những năm trước khi tập dữ liệu COCO lớn hơn xuất hiện: các detector như Faster R-CNNSSD đã công bố các kết quả ban đầu trên tập này, còn các model Ultralytics YOLO có thể huấn luyện trên tập này ngay khi cài đặt. Ngày nay, tập dữ liệu này vẫn phổ biến cho:

  • Benchmark các kiến trúc phát hiện mới bằng cách so sánh với lịch sử lâu dài của các baseline đã công bố
  • Thử nghiệm nhanh và bài tập khóa học — với 16.551 ảnh huấn luyện, tập dữ liệu này được huấn luyện nhanh hơn COCO rất nhiều
  • Các nghiên cứu transfer learning trên một tập lớp đối tượng thường gặp nhỏ gọn và được hiểu rõ

YAML của bộ dữ liệu#

File VOC.yaml định nghĩa cấu hình dataset — các đường dẫn dataset, 20 tên lớp và script tự động tải xuống và chuyển đổi. File này được duy trì trong repository Ultralytics tại 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

Cách sử dụng#

Tải xuống 2.8 GB

VOC tự động tải xuống trong lần đầu tiên bạn huấn luyện — ba archive có tổng dung lượng 2.8 GB — và cần khoảng 6 GB dung lượng đĩa trống trong quá trình giải nén và chuyển đổi.

Để huấn luyện model YOLO26n trên tập dữ liệu VOC trong 100 epoch với kích thước ảnh 640, bạn có thể sử dụng các đoạn code sau. Để xem danh sách đầy đủ các argument khả dụng, hãy tham khảo trang Training model.

Ví dụ huấn luyện
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)

Hình ảnh mẫu và annotation#

Ảnh bên dưới hiển thị một batch huấn luyện dạng mosaic từ tập dữ liệu VOC. Mosaic kết hợp nhiều ảnh thành một sample huấn luyện duy nhất, làm tăng sự đa dạng về đối tượng, tỷ lệ và ngữ cảnh cảnh trong mỗi batch mà model quan sát — xem hướng dẫn tăng cường dữ liệu YOLO để biết chi tiết.

Batch huấn luyện mosaic của tập dữ liệu Pascal VOC

Trích dẫn và ghi nhận đóng góp#

Nếu bạn sử dụng tập dữ liệu VOC trong công việc nghiên cứu hoặc phát triển, vui lòng trích dẫn bài báo sau:

Trích dẫn
@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}}

Chúng tôi xin ghi nhận đóng góp của PASCAL VOC Consortium trong việc tạo và duy trì tài nguyên có giá trị này cho cộng đồng thị giác máy tính. Để biết thêm thông tin về tập dữ liệu VOC và những người tạo ra tập dữ liệu, hãy truy cập website tập dữ liệu PASCAL VOC.

FAQ#

  • PASCAL VOC được sử dụng để huấn luyện và benchmark các model phát hiện đối tượng trên 20 lớp đối tượng thường gặp như người, ô tô, chó và ghế. Vì nhỏ gọn, được gắn nhãn đầy đủ và có nhiều baseline đã được công bố trong nhiều năm, đây là lựa chọn phổ biến để validation các kiến trúc mới, thực hiện các thử nghiệm trong khóa học và tiến hành các nghiên cứu transfer learning nhanh.

  • Cấu hình VOC của Ultralytics chứa 21.503 ảnh: 16.551 ảnh huấn luyện (VOC2007 trainval + VOC2012 trainval) và 4.952 ảnh validation (tập VOC2007 test). Tất cả các phần dữ liệu đều chia sẻ cùng 20 lớp. Xem Cấu trúc Dataset để biết phân tích đầy đủ.

  • VOC tự động tải xuống trong lần đầu tiên bạn huấn luyện với data="VOC.yaml" — không cần thực hiện thủ công. Script lấy ba archive (2.8 GB) từ các asset bản phát hành trên GitHub của Ultralytics và chuyển đổi annotation XML sang định dạng YOLO.

  • Huấn luyện model YOLO26n trên VOC trong 100 epoch với kích thước ảnh 640:

    Ví dụ huấn luyện
    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)

    Để xem cấu hình chi tiết, hãy tham khảo trang Trainingmẹo train model.

  • Cả hai cuộc thi đều có cùng 20 lớp nhưng cung cấp các ảnh khác nhau. VOC2007 cung cấp 5.011 ảnh trainval cùng một tập test gồm 4.952 ảnh có annotation công khai; VOC2012 cung cấp 11.540 ảnh trainval, trong khi annotation test của tập này chưa được công bố và chỉ được chấm điểm bởi server đánh giá chính thức. VOC.yaml của Ultralytics gộp cả hai tập trainval để huấn luyện và validation trên VOC2007 test.

  • VOC nhỏ hơn và đơn giản hơn: 20 lớp và 21.503 ảnh so với 80 lớp và 330K ảnh của COCO. Kết quả VOC theo truyền thống được báo cáo dưới dạng mAP tại 0.5 IoU, trong khi COCO tính trung bình mAP trên các ngưỡng IoU từ 0.5 đến 0.95. VOC được huấn luyện nhanh hơn nhiều và phù hợp với các thử nghiệm nhanh; tập dữ liệu COCO là tiêu chuẩn cho benchmark ở quy mô production.

  • Không — VOC.yaml là cấu hình chỉ dành cho phát hiện: bộ chuyển đổi trích xuất bounding box từ annotation XML VOC, còn các mask phân đoạn có trong benchmark gốc không được chuyển đổi. Để huấn luyện model phân đoạn instance, hãy sử dụng dataset có nhãn polygon như COCO-Seg cùng với model yolo26n-seg.pt.

Bình luận