이번 시간에는 이미지 증강에 대해서 공부해 볼 것이다.
이미지 증강은 기존 이미지를 살짝씩 돌리고 뒤집고 변형해서 새로운 학습 데이터를 생성하는 방식인데, 이 이미지를 딥러닝 시키면 모델은 이 변형된 이미지와 기존 이미지를 다른 이미지라고 인식하게 된다.
따라서 overfitting 현상을 완화할 수 있고, 모델이 다양한 상황에 강인하게 학습된다. 또한 내가 가지고 있는 이미지 수가 적을 때 간단하게 보충해줄 수 있다.
이 이미지 증강의 방법으로는 크게 2가지가 있다.
첫 번째로, 미리 증강된 데이터의 사본을 생성하는 것이다. (Offline/Augmented copy)
이 방법은 본 이미지에서 증강된 이미지를 파일이나 메모리에 저장하여, 새로운 훈련 샘플로 사용하는 방법이다.
두 번째로, 모델에 넣기 직전에 이미지 증강하기이다. (Oneline/On-the-fly)
이 방법은 증강된 이미지를 저장하지 않고, 학습 루프에서 실시간으로 생성 후 바로 폐기한다.
두 가지 방법 모두 장단점이 있지만, 이번 시간에는 저장 공간도 아낄 수 있고 증강 다양성이 매우 높은 두 번째 방법을 사용하겠다.
이 on-the-fly 이미지 증강을 구현하는 방법은 매우 간단한데, 그냥 모델의 레이어 제일 상단에
tf.keras.layers.RandomFlip('horizontal', input_shape=(64, 64, 3)),
tf.keras.layers.RandomRotation(0.1),
tf.keras.layers.RandomZoom(0.1),
이런 식으로 적어주면 된다.
첫 번째 RandomFlip은 이미지를 수평으로 50% 확률로 랜덤하게 뒤집는다.
두 번째 RandomRotation은 이미지를 최대 ±10% 각도로 50% 확률로 랜덤하게 회전한다. 즉, 360°에서 10%이므로 36° 회전하는 것이다.
세 번째 RandomZoom은 이미지를 50% 확률로 랜덤하게 최대 ±10% 정도 확대 또는 축소한다.
이렇게 이미지 증강을 하게 되면 overfitting 현상을 완화하며 부족한 데이터 수를 채울 수 있다.
하지만, 원본 데이터셋이 이미 다양한 경우에는 증강이 오히려 노이즈 역할을 할 수 있으며, 원본 데이터셋의 양이 너무 적은 경우에는 모델이 응용력 있게 새 데이터셋에 적용을 못 하게 될 수도 있다.
이미지 증강은 무조건적으로 모든 데이터 셋에 도움이 되는 것은 아니므로, 모델과 데이터에 맞게 사용해야한다.