Bộ dữ liệu PASCAL VOC#
Bộ dữ liệu PASCAL VOC là benchmark phát hiện vật thể 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 tập trainval của VOC2007 và VOC2012 thành tập huấn luyện gồm 16,551 ảnh, đánh giá trên 4,952 ảnh kiểm thử VOC2007 có annotation công khai và tự động tải toàn bộ dữ liệu (2.8 GB) trong lần sử dụng đầu tiên.
Xem: Cách huấn luyện Ultralytics YOLO trên dataset Pascal VOC | Phát hiện đối tượng | Thị giác máy tính 🚀
Các cuộc thi PASCAL VOC diễn ra từ năm 2005 đến 2012 và định hình cách đánh giá model phát hiện vật thể: benchmark 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 độ chính xác trung bình (mAP) như metric tiêu chuẩn cho phát hiện. Cấu hình VOC.yaml của Ultralytics sử dụng annotation phát hiện, chuyển đổi 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 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á tiêu chuẩn hóa: Các baseline VOC được công bố qua nhiều thập kỷ khiến bộ dữ liệu này trở thành mốc 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 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 dataset#
Cấu hình VOC.yaml của Ultralytics định nghĩa các tập sau:
| Tập dữ liệu | Hình ảnh | Nguồn |
|---|---|---|
| Huấn luyện | 16,551 | VOC2007 trainval (5,011) + VOC2012 trainval (11,540) |
| Validation | 4,952 | VOC2007 test, dùng để đánh giá trong quá trình huấn luyện |
| Kiểm thử | 4,952 | Chính các ảnh kiểm thử VOC2007 đó — cấu hình không định nghĩa tập riêng biệt nào được giữ lại |
Annotation của VOC2007 test được công bố sau cuộc thi năm đó, nhờ vậy tập này có thể được dùng làm tập validation có nhãn. Annotation của VOC2012 test vẫn được giữ kín — chỉ có thể chấm điểm kết quả thông qua máy chủ đánh giá PASCAL chính thức — nên không thuộc cấu hình này.
Bộ chuyển đổi tự động bỏ qua các vật thể đượ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 để xem ảnh cùng lớp phủ annotation, xem phân bố lớp và heatmap bounding box trong tab Charts, rồi sao chép bộ dữ liệu để 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 vật thể trong những năm trước khi bộ dữ liệu COCO ra đời với quy mô lớn hơn: các bộ phát hiện như Faster R-CNN và SSD công bố kết quả ban đầu trên bộ dữ liệu này, và model Ultralytics YOLO có thể huấn luyện trên bộ dữ liệu này ngay mà không cần cấu hình thêm. Hiện nay, bộ dữ liệu vẫn phổ biến cho:
- Đánh giá benchmark các kiến trúc phát hiện mới so 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 thực hành — với 16,551 ảnh huấn luyện, thời gian huấn luyện nhanh hơn COCO nhiều
- Nghiên cứu học chuyển giao trên một tập lớp đối tượng thường gặp nhỏ gọn, được hiểu rõ
YAML của dataset#
Tệp VOC.yaml định nghĩa cấu hình bộ dữ liệu — đường dẫn bộ dữ liệu, 20 tên lớp và script tự động tải xuống rồi chuyển đổi. Tệp được duy trì trong repository Ultralytics tại 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 formatCách sử dụng#
VOC được tải xuống tự động trong lần đầu tiên bạn huấn luyện — gồm ba tệp lưu trữ với 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 dataset VOC trong 100 epoch với kích thước ảnh 640, bạn có thể sử dụng các đoạn mã sau. Để xem danh sách đầy đủ các tham số hiện có, hãy tham khảo trang Training của model.
from ultralytics import YOLO
# Tải model
model = YOLO("yolo26n.pt") # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện)
# Huấn luyện model - tập dữ liệu sẽ tự động tải xuống trong lần chạy đầu tiên
results = model.train(data="VOC.yaml", epochs=100, imgsz=640)Hình ảnh mẫu và annotation#
Hình ảnh bên dưới cho thấy một batch huấn luyện được tạo mosaic từ dataset VOC. Kỹ thuật mosaic kết hợp nhiều hình ảnh thành một mẫu huấn luyện duy nhất, làm tăng sự đa dạng về đối tượng, tỷ lệ và bối cảnh cảnh vật mà model nhìn thấy trong mỗi batch — xem hướng dẫn tăng cường dữ liệu YOLO để biết chi tiết.

Trích dẫn và lời cảm ơn#
Nếu sử dụng dataset VOC trong nghiên cứu hoặc công việc phát triển, vui lòng trích dẫn bài báo sau:
@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 quý giá này cho cộng đồng thị giác máy tính. Để biết thêm thông tin về dataset VOC và những người tạo ra dataset, hãy truy cập trang web dataset PASCAL VOC.
Câu hỏi thường gặp#
PASCAL VOC được sử dụng để huấn luyện và đánh giá chuẩn các model phát hiện đối tượng trên 20 lớp đối tượng thường gặp, chẳng hạn như người, ô tô, chó và ghế. Vì dataset nhỏ gọn, được gán nhãn đầy đủ và có các baseline đã công bố trong nhiều năm, đây là lựa chọn phổ biến để kiểm định kiến trúc mới, chạy thử nghiệm trong khóa học và thực hiện các nghiên cứu học chuyển giao nhanh.
Cấu hình VOC của Ultralytics có 21,503 hình ảnh: 16,551 hình ảnh dùng để huấn luyện (VOC2007 trainval + VOC2012 trainval) và 4,952 hình ảnh dùng để validation (tập test VOC2007). Tất cả các tập con đều có chung 20 lớp. Xem Cấu trúc dataset để biết phân tích đầy đủ.
VOC được tải xuống tự động trong lần đầu tiên bạn huấn luyện bằng
data="VOC.yaml"— không cần thực hiện thủ công. Script tải về ba tệp lưu trữ (2.8 GB) từ tài sản bản phát hành trên GitHub của Ultralytics và chuyển đổi chú thích 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ệnfrom ultralytics import YOLO # Tải model model = YOLO("yolo26n.pt") # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện) # Huấn luyện 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 Huấn luyện và mẹo huấn luyện model.
Cả hai thử thách đều có chung 20 lớp nhưng cung cấp các hình ảnh khác nhau. VOC2007 có 5,011 hình ảnh trainval cùng một tập test gồm 4,952 hình ảnh với chú thích được công khai; VOC2012 có 11,540 hình ảnh trainval, trong khi chú thích của tập test không được công khai và chỉ được chấm điểm qua máy chủ đánh giá chính thức.
VOC.yamlcủa Ultralytics gộp cả hai tập trainval để huấn luyện và dùng tập test VOC2007 để validation.VOC nhỏ hơn và đơn giản hơn: 20 lớp và 21,503 hình ảnh so với 80 lớp và 330K hình ả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 IoU 0.5, trong khi COCO tính trung bình mAP trên các ngưỡng IoU từ 0.5 đến 0.95. VOC huấn luyện nhanh hơn nhiều và phù hợp với các thử nghiệm nhanh; dataset COCO là tiêu chuẩn để đánh giá chuẩn ở quy mô sản xuất.
Không —
VOC.yamlchỉ là cấu hình cho detection: bộ chuyển đổi trích xuất bounding box từ chú thích XML của VOC, còn các mask segmentation trong benchmark gốc không được chuyển đổi. Để huấn luyện model instance segmentation, hãy dùng dataset có nhãn polygon, chẳng hạn như COCO-Seg, với modelyolo26n-seg.pt.



