Вопрос или проблема
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 и улучшит качество обработки изображений.