Аугментация ограничивающих боксов в детекции: форматы, BboxParams и типичные ошибки

Аугментация ограничивающих боксов в детекции: форматы, BboxParams и типичные ошибки

Когда в пайплайне детекции всё настроено, но mAP не растёт, проблема часто кроется не в модели, а в разметке после аугментации. Изображение может быть отражено, обрезано или повернуто, но координаты боксов при этом либо не обновляются, либо интерпретируются неверно. Код не падает, массивы выглядят корректно, обучение идёт — но модель учится на искажённых данных.

Аугментация для детекции отличается от классификации: здесь важно, чтобы каждая пространственная трансформация синхронно изменяла и изображение, и координаты всех ограничивающих боксов.

Форматы ограничивающих боксов

Разные датасеты и фреймворки используют разные форматы координат. Albumentations поддерживает пять из них. В A.BboxParams нужно указать coord_format — тот формат, в котором представлена ваша разметка.

Поддерживаемые форматы:

  • pascal_voc: [x_min, y_min, x_max, y_max] — в пикселях, используется в PASCAL VOC и многих кастомных датасетах.
  • albumentations: [x_min, y_min, x_max, y_max] — нормализованные значения [0, 1], внутренний формат библиотеки.
  • coco: [x_min, y_min, width, height] — в пикселях.
  • yolo: [x_center, y_center, width, height] — нормализованные значения [0, 1], используется в Ultralytics YOLO и Darknet.
  • cxcywh: [x_center, y_center, width, height] — в пикселях, аналог YOLO, но без нормализации.

Например, для изображения 640 × 480 и бокса от (98, 345) до (420, 462):

  • pascal_voc: [98, 345, 420, 462]
  • albumentations: [0.153, 0.719, 0.656, 0.962]
  • coco: [98, 345, 322, 117]
  • yolo: [0.405, 0.841, 0.503, 0.244]
  • cxcywh: [259, 403.5, 322, 117]

Самая частая ошибка — неверный coord_format. Данные при этом выглядят правдоподобно, ошибок нет, но боксы указывают не туда. Всегда проверяйте, в каком формате выдаёт разметку ваш инструмент или датасет.

Сборка пайплайна для детекции

Используйте A.Compose и передайте в неё A.BboxParams, чтобы библиотека знала, как обрабатывать боксы:

В одном пайплайне можно смешивать разные трансформации:

  • Пиксельные (например, RandomBrightnessContrast) — меняют только изображение.
  • Пространственные (например, HorizontalFlip) — обновляют и изображение, и координаты боксов.

Это обеспечивает согласованность: боксы всегда соответствуют аугментированному изображению.

Если нужно проверить, какие трансформации поддерживают боксы, используйте таблицу совместимости в документации Albumentations.

Передача меток и метаданных

Можно передавать только координаты боксов, без меток. Но если к каждому боксу нужно привязать класс, ID или другой атрибут — есть два способа.

Способ 1: отдельные поля через label_fields

Укажите имена полей в label_fields и передайте их как отдельные аргументы:

Поля могут содержать строки или числа. При фильтрации боксов соответствующие записи в этих полях удаляются автоматически — синхронизация поддерживается без вмешательства.

Этот подход удобен не только для классов:

  • Видео: добавьте frame_ids, чтобы отслеживать, из какого кадра пришёл бокс.
  • Instance segmentation: передайте instance_ids, чтобы сохранить связь между маской и боксом.

Способ 2: упаковка метаданных в массив bbox

Если метаданные числовые, их можно добавить как дополнительные столбцы в массив боксов. Например, форма (num_boxes, 6): 4 координаты + 2 столбца метаданных.

Этот способ компактнее, но подходит только для числовых данных. Для строк или именованных полей лучше использовать label_fields.

Что делает A.BboxParams

A.BboxParams управляет интерпретацией и фильтрацией боксов. Основные параметры:

  • coord_format — обязательный: один из 'pascal_voc', 'albumentations', 'coco', 'yolo', 'cxcywh'.
  • bbox_type — 'hbb' для обычных боксов, 'obb' для ориентированных.
  • label_fields — имена полей с метками, привязанными к боксам.
  • min_area — минимальная площадь бокса в пикселях после аугментации. Меньшие удаляются.
  • min_visibility — минимальная доля исходной площади бокса, которая должна остаться видимой.
  • min_width, min_height — минимальные ширина и высота.
  • clip_bboxes_on_input — обрезать боксы по границам изображения до аугментации. Полезно при разметке за пределами кадра.
  • filter_invalid_bboxes — удалять невалидные боксы (например, с x_max < x_min) до аугментации.
  • max_accept_ratio — максимальное отношение сторон. Боксы с превышением отбрасываются.

На практике ключевыми часто становятся: coord_format, label_fields, min_visibility и настройки обработки некорректной разметки (clip_bboxes_on_input + filter_invalid_bboxes).

Работа с неидеальной разметкой

В реальных данных боксы могут выходить за границы изображения. Чтобы избежать проблем:

  • Включите clip_bboxes_on_input=True — координаты будут обрезаны до аугментации.
  • Включите filter_invalid_bboxes=True — удалятся вырожденные боксы (нулевой ширины/высоты).

Когда использовать min_area и min_visibility

После кропа боксы могут превратиться в узкие полосы. Два фильтра помогают избавиться от таких случаев:

  • min_area — фильтрует по абсолютной площади. Подходит, если важен физический размер объекта.
  • min_visibility — фильтрует по доле исходной площади. Полезно, когда важно, сколько объекта осталось в кадре.

Часто min_visibility оказывается более эффективным: он не даёт обучаться на почти полностью обрезанных объектах.

Стратегии кадрирования

Обычный RandomCrop может выдать кадр без единого бокса. Для детекции это бесполезный пример. Лучше использовать bbox-aware альтернативы:

  • AtLeastOneBboxRandomCrop — гарантирует хотя бы один бокс в кадре.
  • BBoxSafeRandomCrop — сохраняет все боксы, подбирая область кропа так, чтобы ничего не потерять.
  • RandomSizedBBoxSafeCrop — сохраняет все боксы, затем масштабирует к целевому размеру. Один из самых полезных вариантов для обучения.

Для детекции не стоит использовать обычный RandomCrop бездумно — он подходит для классификации, но не для задач с разметкой.

Типичные ошибки

Неверный coord_format

Главная ошибка. Например, разметка в формате YOLO, но указан coord_format='coco'. Код работает, но боксы смещаются. Всегда визуально проверяйте аугментированные примеры перед обучением.

Все боксы отфильтровались

Агрессивные кропы + жёсткие min_area или min_visibility могут привести к пустому массиву bboxes. Датасет или цикл обучения должны уметь обрабатывать такие случаи:

  • пропускать примеры без боксов;
  • использовать bbox-safe кропы, чтобы минимизировать потери.

Перепутаны нормализованные и абсолютные координаты

Формат yolo требует значений [0, 1]. Если подать пиксельные координаты, они будут обрезаны до [0, 1] — результат: крошечный бокс в углу. Обратная ошибка: нормализованные координаты в формате pascal_voc — боксы станут размером в доли пикселя и быстро отфильтруются.

Добавлена трансформация без поддержки bbox

Не все трансформации поддерживают боксы. Если добавить несовместимую в пайплайн с A.BboxParams, Albumentations выбросит исключение при инициализации. Это хорошо — ошибка видна сразу. Но всё равно проверяйте таблицу совместимости, особенно при сборке сложных пайплайнов.

Визуализация после A.Normalize

A.Normalize переводит пиксели в float, вычитает среднее и делит на std. Изображение выглядит как шум. Для отладки визуализируйте данные до A.Normalize и A.ToTensorV2.

Заключение

Аугментация в детекции — это не просто разнообразие изображений. Это синхронизация трансформаций и меток. Ошибки в формате координат, агрессивные кропы или неправильная фильтрация приводят к обучению на сломанной разметке.

Сначала добейтесь корректной геометрии и фильтрации боксов — только потом увеличивайте сложность аугментаций.

Практический чек-лист:

  1. Убедитесь, что coord_format соответствует реальному формату разметки.
  2. Передайте все привязанные к боксам метки через label_fields или упакуйте в массив.
  3. Для кропов используйте bbox-aware варианты, а не RandomCrop.
  4. Настройте min_visibility и min_area под задачу, не оставляйте значения по умолчанию.
  5. Перед обучением визуализируйте десятки аугментированных примеров с наложенными боксами.
Читать оригинал