[데이터 증강] IMGAUG 모듈

2021. 7. 8. 11:24코딩연습장/Keras

이번에는 데이터 증강 모듈을 사용하여, 데이터를 다양한 방향(ex. 크기, 밝기, 노이즈, cutout 등)으로 증강시켜보겠다. 


데이터의 종류가 다양하고, 많을 수록 학습이 잘 되는 것은 다들 알고 있을 것이다. 하지만 데이터를 수집하는 일이란 결코 쉽지 않고, 돈과 시간이 소비된다. 이런 문제점을 보완하기 위해서 이미지 데이터의 경우, 영상처리를 통해 다양한 특징을 가지는 이미지들을 만들어내어 데이터를 증강한다.

 

출처: https://towardsdatascience.com/machinex-image-data-augmentation-using-keras-b459ef87cd22

 

물론, 개인적으로 원하는 이미지 증강이 있다면 코드를 작성하여 직접 적용하여도 무관하다. 하지만 수많은 증강 기술들을 작성하는 것은 또 시간이 많이 걸리기 때문에 요즘은 증강 모듈을 따로 제공해준다. 

 

우리가 사용할 모듈은 IMGAUG 모듈이며 Keras에서 사용가능하다. 각 기능에 대한 설명은 아래 github사이트에서 이미지와 함께 자세히 설명되어있으니 참고하면 되겠다.

 

https://github.com/aleju/imgaug

 

aleju/imgaug

Image augmentation for machine learning experiments. - aleju/imgaug

github.com

 

데이터 증강 모듈을 사용하기에 앞서, Generator가 있으면 훨씬 간편하고 이 블로그에서도 Generator를 사용할 것이기 때문에 밑 글을 참고하여 만드는 것을 추천한다.

 

https://aistudy9314.tistory.com/34

 

[Keras] Generator 만들기

모듈로 제공되는 데이터셋을 사용하는 것은 슬슬 질릴 때가 왔다. 회사나 팀 차원에서 데이터셋을 구축하거나, 또는 Open Datasets을 다운로드하여 사용할 때, 우리는 그 데이터셋을 전처리하여 모

aistudy9314.tistory.com

 

1. imgaug 모듈 설치

먼저 imgaug 모듈을 pip로 설치해주어야 모듈로 사용할 수 있다.

pip install imgaug==0.4.0

 

2. Augmentation 기능 정의

두번째로, 어떤 Augmentation 기능들을 적용할 것인지 정의해야한다. 나는 train code에 정의해놓고, Generator의 인자로 보내어 처리하였다. Augmentation 기능들은 많다고 해서 꼭 성능이 좋은 것만은 아니다. 자신이 사용하는 데이터셋을 관찰하고, 그에 맞는 데이터 증강을 하여야지, 잘못된 증강 데이터가 들어가면 오히려 성능을 저하시키는 경우도 많다.

**각 기능에 대한 설명은 홈페이지 참조.

 

import imgaug.augmenters as iaa

    '''Augmentation'''
    augs = [
        iaa.Fliplr(0.5),

        iaa.SomeOf((1,2),[
            iaa.MultiplyAndAddToBrightness(),
            iaa.GammaContrast()
        ]),

        iaa.SomeOf((0,2), [
            iaa.Sometimes(0.7, iaa.AdditiveGaussianNoise()),
            iaa.Sometimes(0.7, iaa.GaussianBlur())
        ]),


        iaa.SomeOf((0,6),[
            iaa.ShearX(),
            iaa.ShearY(),
            iaa.ScaleX(),
            iaa.ScaleY(),
            iaa.Sometimes(0.5, iaa.Affine()),
            iaa.Sometimes(0.5, iaa.PerspectiveTransform()),
        ]),

        iaa.SomeOf((0,1),[
            iaa.Sometimes(0.6, iaa.Dropout()),
            iaa.Sometimes(0.6, iaa.CoarseDropout()),
            iaa.Sometimes(0.6, iaa.Cutout())
        ])
    ]

 

3. Data Augmentation 적용 in Generator

이제 generator에서 불러온 이미지에 데이터 증강 기술을 적용시켜보자. 모든 내용을 쓰기에는 복잡하니, 추가되는 내용만 작성하였다. 

 

밑에서 UnnoirmalizedBatch란, 말그대로 증강 전, 후에 사용될 비정규화 배치 데이터 클래스이다. 다른 여러 task(ex. Object Detection, Keypoint Estimation, Segmentation 등)의 경우, 옵션을 더 지정해주어야한다.

 

self.augs.augment_batches는 실제로 아까 정의해두었던 Augmentation 기능들을 batch image에 적용하여 return하는 함수이다. 

 

실제로 데이터 증강이 되고 있는지 확인하고 싶다면, batch_aug_imgs[0].images_aug[idx]에 해당하는 aug_img를 cv2.imshow를 통해 출력해보면 될 것이다.

from imgaug import augmenters as iaa
from imgaug.augmentables.batches import UnnormalizedBatch

def __init__():
	self.augs = iaa.Sequential(augs)
    
def data_gen():
	input_x = np.zeros((self.batch_size, self.input_shape[0], self.input_shape[1], self.input_shape[2]), dtype=np.float32)

        imgs = []
        for idx in range(len(x)):
            img = cv2.imread(x[idx])
            imgs.append(cv2.resize(img, (self.input_shape[0], self.input_shape[1])))

        batch_imgs = UnnormalizedBatch(images=imgs, data=y)
        batch_aug_imgs = list(self.augs.augment_batches(batches=batch_imgs))

        for idx in range(len(x)):
            aug_img = batch_aug_imgs[0].images_aug[idx]
            input_x[idx] = aug_img.astype(np.float) / 255.0

        input_y = to_categorical(y, num_classes=self.class_num)
        return input_x, input_y

이렇게 데이터 증강 기술까지 적용시켜 보았다. 기존 모델에 데이터 증강까지 사용하면 확실히 성능이 좋아지는 것을 볼 수 있을 것이다. 앞으로의 모델들은 데이터 증강이 적용된다는 가정 하에 테스트를 할 것이다.

'코딩연습장 > Keras' 카테고리의 다른 글

[Keras] Generator 만들기  (2) 2021.07.08
[데이터 준비] Tiny-Imagenet  (2) 2021.06.29
[Classification] ResNet 코딩  (0) 2021.06.29
[Classificaiton] VGGNET 모델 코딩  (2) 2021.06.24
[데이터] 데이터 준비 단계(CIFAR-100)  (0) 2021.06.24