ShiftScaleRotate не работает с ограничивающими прямоугольниками.

Вопрос или проблема

Albumentations корректно работает с изображением и маской сегментации. Но теряет все боксы, если применяется аугментация ShiftScaleRotate. Другие аугментации работают хорошо на боксах. Пример кода:

import albumentations as albu
import numpy as np
import cv2

pre_training_transform = [
    albu.ShiftScaleRotate(scale_limit=(1.0, 1.0), rotate_limit=0, shift_limit=0.0, 
    # albu.ShiftScaleRotate(scale_limit=(0.5, 1.5), rotate_limit=45, shift_limit=0.1,  # same result
    p=1.0,border_mode=cv2.BORDER_REFLECT_101),
]
bboxes = np.array([[0.1, 0.2, 0.5, 0.6]])  # Нормализованные [x1/w, y1/h, x2/w, y2/h]
class_ids = np.array([1])
image = np.zeros((256, 256, 3)).astype(np.uint8)
gm = np.zeros((256, 256, 1)).astype(np.uint8)

transform = albu.Compose(
    pre_training_transform,
    bbox_params=albu.BboxParams(format="pascal_voc", label_fields=['class_ids'])
)

augmented = transform(image=image, mask=gm, bboxes=bboxes, class_ids=class_ids)
image, gm_mask, new_bboxes = augmented['image'], augmented['mask'], augmented['bboxes']
print("Original bboxes:", bboxes, ". New bboxes:", new_bboxes)  
# Original bboxes: [[0.1 0.2 0.5 0.6]] . New bboxes: []

Как это решить?

Кажется, это вызвано тем, что вы вводите нормализованные координаты ограничивающего прямоугольника, изменение значений на целые числа больше 1 возвращает преобразованные ограничивающие прямоугольники (см. также примеры ввода ограничивающих прямоугольников в документации). Кроме того, масштаб 1, вероятно, слишком увеличит размеры ограничивающего прямоугольника:

import albumentations as albu
import numpy as np
import cv2

pre_training_transform = [
    albu.ShiftScaleRotate(scale_limit=(-0.1, 0.1), rotate_limit=0, shift_limit=0.0, 
    # albu.ShiftScaleRotate(scale_limit=(0.5, 1.5), rotate_limit=45, shift_limit=0.1,  # same result
    p=1.0,border_mode=cv2.BORDER_REFLECT_101),
]
bboxes = np.array([[10, 20, 50, 60]])  # Нормализованные [x1/w, y1/h, x2/w, y2/h]
class_ids = np.array([1])
image = np.zeros((256, 256, 3)).astype(np.uint8)
gm = np.zeros((256, 256, 1)).astype(np.uint8)

transform = albu.Compose(
    pre_training_transform,
    bbox_params=albu.BboxParams(format="pascal_voc", label_fields=['class_ids'])
)

augmented = transform(image=image, mask=gm, bboxes=bboxes, class_ids=class_ids)
image, gm_mask, new_bboxes = augmented['image'], augmented['mask'], augmented['bboxes']
print("Original bboxes:", bboxes, ". New bboxes:", new_bboxes)  
# Original bboxes: [[10 20 50 60]] . New bboxes: [[ 7.6559744 24.21006   48.450558  62.65078  ]]

Ответ или решение

Проблема с некорректной модификацией bounding boxes при использовании аугментации ShiftScaleRotate в библиотеке Albumentations может быть вызвана несколькими факторами, специфичными для передаваемых параметров и их обработки. Рассмотрим возможные причины и их решения подробнее.

Проблема с нормализацией координат

Первое, что бросается в глаза — это нормализованные координаты bounding boxes, которые вы используете: [[0.1, 0.2, 0.5, 0.6]]. Формат "pascal_voc", который вы указали в функции BboxParams, подразумевает целые значения, выраженные в пикселях, а не нормализованные. Следовательно, ваш код работает с нормализованными значениями, хотя требуется формат pascal_voc с целыми значениями больше 1. Когда вы передаете нормализованные значения, Albumentations просто может неправильно интерпретировать такие входные данные и вернуть пустой список бокс-ов после аугментации.

Корректировка кодовых параметров

Чтобы разрешить данную ситуацию, убедитесь, что вы передаете bounding boxes в формате требований pascal_voc, т.е., в пикселях. Например:

bboxes = np.array([[10, 20, 50, 60]])  # Координаты в формате пикселей

Настройка параметров трансформации

Также стоит обратить внимание на параметры трансформации ShiftScaleRotate. Если вы используете scale_limit=(1.0, 1.0), это приведет к тому, что bounding boxes могут просто выйти за границы изображения после применения трансформаций, в результате чего функции обработки их удалят.

Рекомендую использовать более адекватный диапазон, например:

scale_limit=(-0.1, 0.1)

В результате, при корректном задании формата bounding boxes и параметров трансформации, ваши данные будут обрабатываться правильно и аугментация ShiftScaleRotate не приведет к удалению bounding boxes.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...