TensorFlow+Keras로 Cutout 구현/평가

소개



다른 기사 에서 각종 Data Augmentation을 구현했을 때, TensorFlow Addons를 사용하면 간단하게 Cutout을 구현할 수 있는 것을 깨달았다.
여기에서는 Dataset에 대해서 map 적용하는 구현과 그 평가를 실시한다.

환경


  • TensorFlow(2.3.0)
  • tf.keras(2.4.0)
  • tensorflow_addons(0.11.2)

  • Cutout이란?



    이미지의 데이터 확장 기법으로서 제안 된 것으로, 랜덤한 좌표의 구형을 단색으로 칠한다.
    비슷한 방법으로 Random Erasing이 있지만, Cutout 쪽이 보다 단순.
    TensorFlow Addons에는 tfa.image.cutout이 준비되어 있습니다.

    구현



    다음 함수를 Dataset의 map 함수로 적용한다.
    import tensorflow_addons as tfa
    @tf.function
    def cutout_augmentation(images, cutout_size, cval=0):
        img_shape = images.shape[-3:]
        mask_size = (int(img_shape[0]*cutout_size[0])//2*2, int(img_shape[1]*cutout_size[1])//2*2)
        images = tfa.image.random_cutout(images, mask_size, constant_values=cval)
        return images
    

    cutout_size는 채우는 사각형의 크기를 지정합니다. 원본 이미지의 비율은 [H, W]로 float로 지정됩니다. 32x32 이미지의 경우 [0.5,0.5]로 16x16 범위를 채웁니다.
    cval은 채우는 색. 0.0~1.0의 화상의 경우는 cval=0.5로 회색이 된다.

    tensorflow-addons의 버전이 낡으면 사용할 수 없기 때문에, Google Colab에서는 !pip install --upgrade tensorflow-addons 를 사전에 실행한다.

    실행 결과는 이쪽.


    평가



    구형 사이즈의 설정치의 영향이나, 다른 Aumentation과의 비교를 실시한다.
  • Google Colab TPU에서 CIFAR10을 3 번 학습하고 Validation Accuracy의 중간 값으로 비교
  • Vertical Flip만 사용한 것을 베이스로, 거기에 이하의 Aumentation 처리를 추가해 실시
  • Cutout(0.4~0.8)
  • Width/Height Shift (range=0.25,fill_mode='constant' 및 'reflect' )
  • Cutout + Width/Height Shift('reflect')

  • SGD(lr=0.01/momentum=0.9)에서 100epoch, 100~150epoch는 lr=0.001로 변경

  • 결과는 이쪽.


    확장법
    cutout
    fill_mode
    Accuracy


    Vertical Flip
    -
    -
    89.15

    Cutout
    0.4
    -
    91.80

    Cutout
    0.5
    -
    92.31

    Cutout
    0.6
    -
    92.50

    Cutout
    0.7
    -
    92.63

    Cutout
    0.8
    -
    92.53

    Shift
    -
    constant
    92.86

    Shift
    -
    reflect
    93.39

    Cutout+Shift
    0.5
    reflect
    94.43


    Cutout의 사이즈 비교에서는 0.7이 가장 양호했다. 0.7*0.7=0.49이므로 거의 절반이 사라지게 된다.
    전 논문에서는 CIFAR10에서는 16x16 즉 0.5가 가장 좋다고 여겨졌기 때문에 결과에는 어긋남이 있었다. 모델의 차이가 영향을 미치는가? .
    동 논문에서는 CIFAR100의 경우는 더 사이즈를 낮추는 편이 좋은 결과가 되고 있다. 학습 내용에 따라 파라미터 조정할 여지가 있는 것 같다.
    Shift와의 비교가 되면, Shift 쪽이 좋은 결과였다.
    전체적으로는 Shift와 Cutout을 혼합한 것이 가장 좋은 결과가 되었다. Shift(reflect)로부터는 1%의 인식률 향상이 있지만, 이 레벨에서는 상당히 큰 차이이므로 동시에 적용하는 가치는 충분하다고 생각된다.

    실험 코드는 여기 .

    참고



    ImageDataGenerator를 확장하고 cutout 구현
    PyTorch에서 데이터 급증(Data Augmentation)하는 방법

    좋은 웹페이지 즐겨찾기