Going Deeper(CV)_DJ 3 : 잘 만든 Augmentation, 이미지 100장 안 부럽다
1. 들어가며
- 딥러닝 모델을 학습 시키기 위해서는 대량의 데이터를 확보해야 한다.
- 대표적인 이미지 데이터셋인 이미지넷(ImageNet)은 약 1,400만장의 이미지를 갖고 있다.
- 분류 대상 클래스가 10개라 상대적으로 간단해 보이는 CIFAR-10도 몇 만장의 데이터를 가지고 있다.
- 미리 공개되어 있는 데이터셋 외에도 우리가 원하는 문제를 풀 때는 이에 맞는 데이터가 필요하다.
- 하지만 이런 데이터를 몇 만장씩 구축하는데는 많은 비용과 시간이 필요하다.
- 이 때, 제한된 데이터셋을 최대한 활용하기 위해서 augmentation이라는 방법을 사용할 수 있다.
- 그럼 augmentation은 어떻게 사용하고, 어떤 효과를 줄 수 있을까?
2. 데이터셋의 현실
- 대량의 데이터셋
1) 이미지넷은 1,400만 장의 이미지를 보유하고 있으며, CIFAR-10은 학습용 데이터셋이 5만 장 있다.
2) 이런 규모의 데이터셋을 만들려면 많은 시간과 비용이 들어간다.
- 직접 구축하는 데이터셋
1) 사진을 보고 시내의 유명한 카페를 분류하는 모델을 만들어야하는 프로젝트가 생겼다고 하자.
2) 우리는 어떻게 데이터셋을 모을 수 있을까?
3) 카페를 조사하기 위해서 인스타그램(Instagram)을 크롤링해 20여 개 카페의 사진 약 2,500장을 얻을 수 있다고 해보자.
4) 처음에는 많았으나, 내부 인테리어 사진을 구분하기 위해서 음식 사진, 사람 사진을 제외하면 많은 사진이 줄어들 것이다.
5) 이처럼 직접 데이터를 수집한다면 만 장 단위로 데이터셋을 모으기가 쉽지 않다는 것을 알 수 있다.
3. Data Augmentation이란? (1) 개요
- 그럼 어떻게 해야 할까? 모은 데이터셋을 최대한 활용할 수 있는 방법이 있을까?
- Data augmentation은 갖고 있는 데이터셋을 여러 가지 방법으로 증강시켜(augment) 실질적인 학습 데이터셋의 규모를 키울 수 있는 방법이다.
- 일반적으로 하드디스크에 저장된 이미지 데이터를 메모리에 로드한 후, 학습시킬 때 변형을 가하는 방법을 사용한다. 이를 통해 1장의 이미지를 더 다양하게 쓸 수 있게 된다.
- 데이터가 많아진다는 것은 과적합(overfittion)을 줄일 수 있다는 것을 의미한다.
- 또한 우리가 가지고 있는 데이터셋이 실제 상황에서의 입력값과 다를 경우, augmentation을 통해서 실제 입력값과 비슷한 데이터 분포를 만들어 낼 수 있다.
- data augmentation은 데이터를 늘릴 뿐만 아니라 모델이 실제 테스트 환경에서 잘 동작할 수 있도록 도와준다.
- 이미지 데이터 augmentation
1) 이미지 데이터의 augmentation은 포토샵, SNS의 사진 필터, 각종 카메라 앱에서 흔히 발견할 수 있는 기능들과 비슷하다.
2) 쉬운 예로는 사진의 색상을 바꾸거나, 좌우 대칭이나 상하 반전과 같이 이미지의 공간적 배치를 조작할 수 있다.
4. Data Augmentation 이란? (2) 다양한 Image Augmentation 방법
- 이번에는 image augmentation 기법에는 구체적으로 어떤 것들이 있는지 살펴본다.
- 먼저 텐서플로우 튜토리얼에 소개된 image augmentation 예제들로부터 시작한다.
- Flipping
1) Flip은 이미지를 대칭하는 기능이다.
2) 우리가 거울을 보면 반전이 되듯이 좌우 또는 상하로 이미지를 반전시키는 방법이다.
3) 분류 문제에서는 문제가 없을 수 있지만 물체 탐지(detection), 세그멘테이션(segmentation) 문제 등 정확한 정답 영역이 존재하는 문제에 적용할 때에는 라벨도 같이 좌우 반전을 해주어야 한다.
4) 만약 숫자나 알파벳 문자를 인식(recognition)하는 문제에 적용할 때도 주의해야 할 것이다. 상하나 좌우가 반전될 경우 다른 글자가 될 가능성이 있다.
- Gray scale
1) Gray scale은 3가지 채널(channel)을 가진 RGB이미지를 하나의 채널을 가지도록 해준다.
2) RGB 각각의 채널마다 가중치(weight)를 주어 가중합(weighted sum)을 한다.
- Saturation
1) Saturation은 RGB 이미지를 HSV(Hue(색조), Saturation(채도), Vlaue(명도)의 3가지 성분으로 색을 표현) 이미지로 변경하고,
2) S(saturation) 채널에 오프셋(offset)을 적용, 조금 더 이미지를 선명하게 만들어 준다.
3) 이후 우리가 사용하는 RGB 색상 모델로 변경해준다.
- Brightness
1) 밝기를 조절할 수 있다.
2) 우리가 주로 사용하는 RGB에서 (255, 255, 255)는 흰색을, (0, 0, 0)은 검은색을 의미한다.
3) 따라서, 이미지는 RGB 채널에서 값을 더해주면 밝아지고, 빼주면 어두워진다.
4) 이를 통해서 Brightness를 변경할 수 있다.
- Rotation
1) Rotation은 이미지의 각도를 변환해 준다.
2) 90도의 경우 직사각형 형태가 유지되기 때문에 이미지의 크기만 조절해 주면 바로 사용할 수 있다.
3) 하지만 90도 단위로 돌리지 않는 경우 직사각형 형태에서 기존 이미지로 채우지 못하는 영역을 어떻게 처리해야 할지 유의해야 한다.
- Center Crop
1) Center crop은 이미지의 중앙을 기준으로 확대하는 방법이다.
2) 너무 작게 center crop을 할 경우 본래 가진 라벨과 맞지 않게 되는 상황이 발생할 수 있으니 주의가 필요하다.
3) 예를 들어 고양이 라벨의 이미지를 확대하여 한 장 더 만들 때, 이미지 내에 고양이의 형상을 유지해야 한다. 털만 보이는 이미지는 고양이가 아니다.
- 위에서 언급하지 않았지만 Gaussian noise, Contrast change, Sharpen, Affine transformation, Padding, Blurring 등 다양한 방법이 있다.
5. 텐서플로우를 사용한 Image Augmentation (1) Flip
- 코드의 실습 위주로 고양이 사진을 다양하게 Flip 해봤다.
6. 텐서플로우를 사용한 Image Augmentation (2) Center Crop
- 코드의 실습 위주로 고양이 사진을 Center Crop 해봤다.
7. 텐서플로우를 사용한 Image Augmentation (3) 직접 해보기
- 코드를 이용해서 random_crop과 random_brightness를 해봤다.
8. imgaug 라이브러리 사용하기
- imgaug를 이용하여 지금까지 배운 augmentation 기법들을 사용했다.