Ultralytics YOLO27:

Набор данных PASCAL VOC#

Набор данных PASCAL VOC (визуальные классы объектов) — классический бенчмарк для обнаружения объектов с 20 категориями повседневных объектов. Конфигурация Ultralytics VOC.yaml объединяет части trainval VOC2007 и VOC2012 в обучающую выборку из 16 551 изображения, использует 4 952 общедоступных тестовых изображения VOC2007 для валидации и автоматически загружает все необходимые данные (2,8 ГБ) при первом использовании.



Смотри: Как обучить Ultralytics YOLO на датасете Pascal VOC | Обнаружение объектов | Компьютерное зрение 🚀

Соревнования PASCAL VOC проходили с 2005 по 2012 год и повлияли на методы оценки моделей обнаружения объектов: бенчмарк охватывает классификацию изображений, обнаружение и сегментацию и сделал среднюю точность по всем классам (mAP) стандартной метрикой обнаружения. Конфигурация Ultralytics VOC.yaml использует разметку для обнаружения и при загрузке преобразует исходные ограничивающие рамки из XML в формат YOLO.

Основные особенности#

  • 20 категорий повседневных объектов: человек; шесть животных (птица, кошка, корова, собака, лошадь, овца); семь транспортных средств (самолёт, велосипед, лодка, автобус, автомобиль, мотоцикл, поезд); и шесть предметов интерьера (бутылка, стул, обеденный стол, растение в горшке, диван, телевизор).
  • Объединены две версии соревнования: обучающая выборка объединяет trainval VOC2007 (5 011 изображений) и trainval VOC2012 (11 540 изображений).
  • Стандартизированная оценка: опубликованные за десятилетия базовые результаты VOC дают удобную точку отсчёта для сравнения моделей обнаружения.
  • Готовность к YOLO: скрипт загрузки скачивает архивы и автоматически преобразует разметку — вручную подготавливать данные не нужно.

Структура набора данных#

Конфигурация Ultralytics VOC.yaml задаёт следующие части набора данных:

ПодвыборкаИзображенияИсточник
Обучение16,551trainval VOC2007 (5 011) + trainval VOC2012 (11 540)
Валидация4,952Тестовая выборка VOC2007, используемая для оценки во время обучения
Тестовая4,952Те же тестовые изображения VOC2007 — в конфигурации не задана отдельная отложенная выборка

Разметка тестовой выборки VOC2007 была опубликована после соревнования того года, поэтому эту часть можно использовать как размеченную выборку для валидации. Разметка тестовой выборки VOC2012 остаётся закрытой: оценить результаты на ней можно только через официальный сервер оценки PASCAL, поэтому эта часть не входит в конфигурацию.

Сложные объекты исключены

Автоматический конвертер пропускает объекты, помеченные difficult в исходной XML-разметке VOC, поэтому количество экземпляров каждого класса немного отличается от официальной статистики VOC.

Открой VOC на Ultralytics Platform, чтобы просматривать изображения с наложенной разметкой, изучать распределение классов и тепловые карты ограничивающих рамок на вкладке 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/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 ГБ

VOC загружается автоматически при первом запуске обучения — три архива общим размером 2,8 ГБ; для распаковки и преобразования потребуется около 6 ГБ свободного места на диске.

Чтобы обучить модель YOLO26n на наборе данных VOC в течение 100 эпох с размером изображения 640, используй следующие фрагменты кода. Полный список доступных аргументов см. на странице обучения модели.

Пример обучения
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 за создание и поддержку этого ценного ресурса для сообщества компьютерного зрения. Дополнительную информацию о наборе данных VOC и его создателях см. на сайте набора данных PASCAL VOC.

Часто задаваемые вопросы#

  • PASCAL VOC используют для обучения и тестирования моделей обнаружения объектов на 20 классах повседневных объектов, таких как человек, автомобиль, собака и стул. Благодаря компактности, полным аннотациям и многолетней истории опубликованных базовых результатов этот набор часто выбирают для проверки новых архитектур, учебных экспериментов и быстрых исследований трансферного обучения.

  • Конфигурация Ultralytics для VOC содержит 21 503 изображения: 16 551 для обучения (VOC2007 trainval + VOC2012 trainval) и 4 952 для валидации (тестовый набор VOC2007). Во всех разделах представлены одни и те же 20 классов. Полную разбивку см. в разделе Структура набора данных.

  • VOC загружается автоматически при первом запуске обучения с data="VOC.yaml" — вручную ничего делать не нужно. Скрипт скачивает три архива (2,8 ГБ) из ресурсов релиза Ultralytics на GitHub и преобразует XML-аннотации в формат YOLO.

  • Обучи модель YOLO26n на VOC в течение 100 эпох с размером изображения 640:

    Пример обучения
    from ultralytics import YOLO
    
    # Загрузить модель
    model = YOLO("yolo26n.pt")  # загрузить предварительно обученную модель (рекомендуется для обучения)
    
    # Обучить модель
    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 изображения против 80 классов и 330 тыс. изображений в COCO. Результаты VOC традиционно представляют как mAP при IoU 0,5, а в COCO усредняют mAP по порогам IoU от 0,5 до 0,95. На VOC обучение проходит намного быстрее, поэтому он подходит для быстрых экспериментов; набор данных COCO служит стандартом для бенчмаркинга в производственном масштабе.

  • Нет — VOC.yaml — это конфигурация только для обнаружения объектов: конвертер извлекает ограничивающие рамки из XML-аннотаций VOC, а маски сегментации из исходного бенчмарка не преобразуются. Чтобы обучить модель сегментации экземпляров, используй набор данных с полигональными метками, например COCO-Seg, и модель yolo26n-seg.pt.

Комментарии