Python 라이브러리 - Albumentations.

서기현·2024년 4월 17일

DeepLearning

목록 보기
4/6

개요

image augmentation 등 imgae의 형태를 변환하여야 할 때, 주로 Torchvision.transformers 라이브러리를 많이 사용한다.
albumentations는 이 Torchvision.transformers를 대체할 수 있는 라이브러리로, 사용법도 굉장히 유사하고 기능이 더 다양하다. 또한 OpenCV를 메인으로 numpy, imgaug 등 여러 라이브러리를 기반으로 optimization을 하였기 때문에, 굉장히 빠른 속도를 보여준다.

예시

기존 Torchvision.transformers의 transforms와 albumentations의 구현을 비교해보겠다.

torchvision_transform = transforms.Compose([
						transforms.Resize((256,256)),
                        transforms.RandomCrop(224),
                        transforms.RandomHorizontalFlip(),
                        transforms.ToTensor(),
                        ])


albumentations_transform = albumentations.Compose([
						   albumentations.Resize(256,256),
                           albumentations.RandomCrop(224,224),
                           albumentations.HorizontalFlip(),
                           albumentations.pytorch.transforms.ToTensor()

위 예시를 보면, Torchvision.transformers와 굉장히 유사한 함수명과 유사한 사용법을 가지고 있다.

위 예시 코드를 기반으로, 100회를 무작위로 수행했을 때의 수행시간은 위와 같다. albumentations의 수행시간이 약 30배 정도 단축됐다.

OneOf

추가적으로, albumentations 라이브러리는 OneOf 함수를 사용해 random하게 augmentation을 적용할 수 있다.

albumentations_transform_oneof = albumentations.Compose([
    albumentations.Resize(256, 256), 
    albumentations.RandomCrop(224, 224),
    albumentations.OneOf([
                          albumentations.HorizontalFlip(p=1),
                          albumentations.RandomRotate90(p=1),
                          albumentations.VerticalFlip(p=1)            
    ], p=1),
    albumentations.OneOf([
                          albumentations.MotionBlur(p=1),
                          albumentations.OpticalDistortion(p=1),
                          albumentations.GaussNoise(p=1)                 
    ], p=1),
    albumentations.pytorch.ToTensor()
])

여기서 p는 해당 transform의 적용 확률이다. p=1 일시 100% 확률로 해당 OneOf 내의 augment를 랜덤하게 실행한다. 만약 p=0.5 일시 50% 확률로 OneOf를 스킵한다.
이 외에도 각종 다양한 augment들에 대한 내용은
공식문서를 참고하자.

추가: interpolating 방식

추가적으로, Resize는 굉장히 많이 쓰이는 transform이다.
이때 이미지를 확대하게 되면, 각 픽셀 사이를 보간(interpolate) 해주어야 한다.
이 interpolate 방식에는 크게 4가지가 있는데, 다음과 같다.

  1. 최근접 이웃 보간 (Nearest Neighbor Interpolation)
  • 방법: 가장 가까운 이웃 픽셀의 값을 그대로 사용하여 새로운 픽셀의 값을 결정.
  • 장점: 계산이 매우 빠르고 간단함.
  • 단점: 이미지가 깨지기 쉽고, 확대 시 계단 현상이나 픽셀화 현상이 두드러짐.
  1. 선형 보간 (Linear Interpolation)
  • 방법: 인접한 픽셀 값들 사이에서 선형적으로 값을 계산하여 새로운 픽셀 값을 결정. 2D 이미지에서는 보통 바이리니어(bilinear) 보간이 사용되며, 가로 및 세로 방향의 선형 보간을 조합함.
  • 장점: 최근접 이웃 방식보다 이미지가 더 부드러움.
  • 단점: 디테일이 다소 손실될 수 있음.
  1. 바이큐빅 보간 (Cubic Interpolation)
  • 방법: 주변 16개의 픽셀을 사용하여 3차 다항식을 이용한 보간을 수행. 더 매끄럽고 자연스러운 이미지를 생성.
  • 장점: 이미지의 세밀한 부분을 잘 유지하며 매우 부드러운 결과를 제공함.
  • 단점: 계산 비용이 더 높고 처리 시간이 길어짐.
  1. 란초스 보간 (Lanczos Interpolation)
  • 방법: 란초스 커널을 사용하여, 주변 픽셀들을 가중 평균하는 방식으로 보간을 수행. sinc 함수를 사용하여 이미지를 처리.
  • 장점: 매우 높은 품질의 이미지 보간을 제공하며, 바이큐빅 방식보다 더 선명하고 깨끗한 결과를 얻을 수 있음.
  • 단점: 계산 비용이 매우 높고, 가장자리에서 ringing 현상(과도한 진동으로 인한 예상치 못한 가장자리 생성)이 발생할 수 있음.

시각화

해당 방식들을 적용한 결과는 아래와 같다. (64x64) -> (256x256)

위와 같이 경계의 차이가 극명할 경우, Nearst가 가장 명확하게 interpolation 된 것으로 보인다.

하지만, 위와 같이 실제 현실의 이미지는 경계의 차이가 극명한 경우가 잘 없기 때문에, Linear나, Bicubic 등의 방법이 눈으로 보기에 더 자연스러워 보인다.

0개의 댓글