Когда в пайплайне детекции всё настроено, но 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.
Заключение
Аугментация в детекции — это не просто разнообразие изображений. Это синхронизация трансформаций и меток. Ошибки в формате координат, агрессивные кропы или неправильная фильтрация приводят к обучению на сломанной разметке.
Сначала добейтесь корректной геометрии и фильтрации боксов — только потом увеличивайте сложность аугментаций.
Практический чек-лист:
- Убедитесь, что
coord_formatсоответствует реальному формату разметки. - Передайте все привязанные к боксам метки через
label_fieldsили упакуйте в массив. - Для кропов используйте bbox-aware варианты, а не
RandomCrop. - Настройте
min_visibilityиmin_areaпод задачу, не оставляйте значения по умолчанию. - Перед обучением визуализируйте десятки аугментированных примеров с наложенными боксами.