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배 정도 단축됐다.
추가적으로, 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들에 대한 내용은
공식문서를 참고하자.
추가적으로, Resize는 굉장히 많이 쓰이는 transform이다.
이때 이미지를 확대하게 되면, 각 픽셀 사이를 보간(interpolate) 해주어야 한다.
이 interpolate 방식에는 크게 4가지가 있는데, 다음과 같다.
해당 방식들을 적용한 결과는 아래와 같다. (64x64) -> (256x256)

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

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