데이터가 모자랄때는 데이터를 추가하면 가장 좋겠지만, 더 이상 데이터를 추가하기 어려울 수 있다. 또는 데이터는 있는데 레이블링 작업이 어려울 수도 있고, 기존 데이터를 가지고 발생할 수 있는 상황을 예측해서 데이터를 만들어야 될 수도 있다. 이 때 유용하게 사용되는 것이 Augmentation 기법이다. 여기선 이미지에 대한 증강을 다룬다
이미지를 뒤집거나, 회전하거나, 블러 효과를 주거나, 일부를 손상시키는 노이즈를 주거나, 컬러 포맷을 변형하거나 매우 많은 기법이 있다.
그 외에도 논문을 찾아보면 수많은 기법이 있고, 여러 기법을 융합한 방법도 있다. 다만 고수준의 augmentation은 성능을 거의 극한까지 끌어올리기 위해 마지막 단계에서 하거나 그 정도 수준의 성능이 꼭 필요한 경우에 적용한다
이러한 전처리는 OpenCV 파이프라인을 거쳐서 적용할 수도 있지만 최적화를 위해서는 Pytorch나 Kornia 같은 GPU 친화적인 방식으로 적용하는 것이 좋다.
GAN이라는 네트워크 자체가 이미지를 생성하는 데에 특화되어 있고 이를 이용해 Augmentation에도 활용하는 경우가 있다. 다만 GAN이라는 네트워크를 또 학습해야 된다는 단점이 있다.
가장 중요한 점은 augmentation을 적용해서 오히려 역효과를 보지 않도록 해야 된다는 것이다. 우리가 일반적으로 수행하는 분류나 탐지 로직에서는 저러한 기법을 전부 다 때려박아도 약간의 성능 차이가 있을 뿐 크게 문제가 없을 수 있다. 그런데 특정 도메인에서 학습하는 경우, 그 도메인의 데이터 셋에서 어떠한 증강 기법이 역효과로 작용하는 경우가 있다.
예를 들면 메뉴 UI 화면 분류 모델을 학습한다고 했을때, 일반적으로 사용자가 보는 메뉴가 뒤집어지거나, 회전하는 경우를 상상하기 힘들다. 메뉴 화면은 자연 상태에서 촬영된 이미지가 아니라 인공으로 만들어진 이미지에 가까워서 화면 상 노이즈도 거의 발생하지 않을 것이다. 이런 경우에 증강을 적용하면 오히려 불필요한 bias가 생겨서 성능이 떨어질 수도 있다.
그리고 Augmentation 중에서는 늘린 데이터를 복사해서 전체 데이터 양을 늘리는 방법이 있고 원본에서 변형한 채로 넣는게 있는데, 경험적으로는 복사해서 양을 늘리는 게 성능이 좋았던 적이 많았다