Augmentation은 원래 데이터를 부풀려서 성능을 더 좋게 만든다는 뜻이다.
대표적인 케이스가 VGG모델에서 많이 사용하고 벤치마킹하였다.
VGG-D모델에서 256*256 데이터를 넣어주는 것보다 똑같은 사진을 256*256과 512*512 데이터를 따로 넣어주는 것이 미묘하지만 성능이 올라갔다.
에러가 3~5%까지 줄어든다고 한다.

기본적으로 Augmentation을 넣어주면, 기본적으로 성능이 좋아진다는 결론도 나왔다.
image


Augmentation

Augmentation을 하는 중요한 이유

1. Preprocessing과 augmentation을 하면, 거의 성능이 좋아진다.
2. 원본에 추가되는 개념이니 성능이 떨어지지 않는다.
3. 쉽고 패턴이 정해져있다.


단기간에  성능을 올리고 싶다면, 1) Transfer learning 2)Augmentation으로 해결하면 된다.


기본적인 예로,
1) 좌우반전
왼쪽만 바라보는 고양이를 70개를 넣어준다고 치자. 오른쪽을 보는 고양이는 못맞추게 된다.
왼쪽보는 고양이 70 + 오른쪽 고양이 70  총 140개를 넣어주면 어느쪽을 보더라도 다 맞추게 된다.
image

2)이미지를 잘라준다.
확률적으로 꼬리를 보고 고양으로 판단할 확률 50%, 귀를 보고 30%로 판단한다고 할 때,
고양이가 상자속에 들어가서 꼬리만 있는 사진을 사람은 꼬리만 보고도 고양이라고 판단할 수 있으나 딥러닝은 꼬리뿐만 아니라 상자도 인식하느라 고양이의 특징을 제대로 파악 못할 것이다.
사람을 인식방법을 모방하기 위해  사물+꼬리 있는 사진을 넣어주기 보다는, 꼬리만 잘라서 넣어준다면 더 성능이 좋아질 것이다.
각 부분만 보고도 고양이로 판단할 수 있도록 해준다.

image

3) 밝기 조절
만약 딥러닝 모델로 앱을 만들게 되면, 사진을 찍는사람마다 빛의 양이 다를 것이다. 다 인식할 수 있도록 어두운 것부터 밝은 것까지 밝기를 조절해서 다 넣어준다.
image


그 외에도 많은 응용방법이 있다.


AlexNet

이미지 챌린지에서 나왔던 AlexNet이라는 모델이 있다. AlexNet에서 처음으로 Augmentation을 heavy하게 썼다고 한다.

  1. 좌우반전
  2. 224*224px 를 ---> 256*256px로 resize한 다음 ---> 224*224px로 랜덤하게 2048번 잘라서 데이터를 2048배 늘림
  3. 테스트시에는 2048배 늘이면 너무 느리니까,
    256*256px로 resize한 다음  ---> 좌상단/우상단/좌하단/우하단/가운데 5번만 잘라서 5배늘림 ---> 좌우반전까지 총 10배 늘림
    ---> 10개 따로 predict한다음, 평균을 낸다.
  4. PCA를 통해 RGB채널을 조절하주었는데 요즘은 안쓰는 방식


VGGNet

사진데이터에서 가장 많이 사용하는 Preprocessing & Augmentation방식VGGNet이 했던 방식이다.

VGGNet은 굉장히 많은 방식으로 벤치마킹하고 실험했었는데 결과적으로

  1. RGB값을 각각 빼서, RGB값의 평균을 0으로 만든다 --> loss 수렴이 빨라진다.
    weight초기화할 때도 E(X)와 E(Y) = 0에서 시작한 이유가, loss 수렴이 좋아져였다.
    X와 Y는 모두 activation output이었다. hidden Layer 사이의 input과 output의 평균이 0인 것만 유지하도록 해주면 Layer를 더 쌓을 수 있는 개념이었다.
    우리가 처음 이미지를 넣는 input은 세로,가로,RGB 값은 activation output이 아니므로
    강제로 RGB값을 평균에서 빼주면, 사실상 input값의 평균이 0이 되어서 수렴이 빨라진다!
  2. 같은 이미지를 256*256px, 384*384px, 512*512px 3가지 버전으로 만든 뒤,--> 224*224px로 랜덤 Crop한다.
    256*256px에서 224*224px로 Crop하면 대부분의 이미지가 들어간다.
    하지만 512*512px에서 224*224px은 이미지의 1/4정도밖에 안들어간다. 고양이로 치면 고양이 한마리 전체가 들어갈 일은 거의 없다.
    즉, 고양이의 귀, 꼬리, 털 등등이 짤려서 들어간다. 사람처럼 일부만 보고도 고양이로 인식하도록 train되는 효과가 난다.
  3. 테스트시에는 마찬가지로 하는 것이 가장 error가 낮았다.

결과적으로 이러한 방식으로 전처리를 하면 error가 10.4% -> 7.1%로 줄어들었다고 한다.

image

간단용어설명)
Multi-crop : Alexnet에서 했던, 좌상단~가운데 5개 크롭 + 좌우반전 2개 -> 10배 늘리는 방법
Dense : (1,1) conv Layer처럼 , Fully-connected Layer를 바꿔주면, test할 때 이미지를 더 크게 넣어 줄 수 있다. 크게 넣어주면 (1,1)으로 나오던 결과가 (2,2)로 나오는데, 그 결과값은 5군데 Crop하는 것과 동일하고, 그것을 평균내준다.

VGGnet에서는 Multi-Crop과 Dense를 따로 써주면, 성능이 좋아지지만 결과는 거의 비슷하고, 같이 써주면 더 성능이 좋아졌다.
굳이 따지면 실행속도가 빠른 Dense를 쓰는 것을 권장했지만, 결국엔 같이 쓰는 것을 택했다.
image


ResNet

VGGNet과 유사하므로 패스


그외 Preprocessing & Augmentation 방식

4) rotation : 0 ~360도 사이로 랜덤하게 회전시킨다. predict할 데이터가 회전된상태로 찍힐 가능성이 높다.
5) shifting : 랜덤하게 10px씩 상/하/좌/우 로 움직여준다. 그러면 외각쪽으로 고양이의 귀나 꼬리가 빠진 사진이 들어갈 것이다.
6) rescaling : 사진의 크기를 키우거나 줄이는 VGGNet에서 했던 방식. 보통 1.0 ~ 1.6배로 사진을 키운다.
7) flipping : 상하/좌우 반전, 좌우반전은 가장 많이 쓰는 방식이다.
8) shearing : 강제로 사진을 찌그러뜨린다. -20~ 20도 사이로 랜덤하게 해준다.
9) stretching : 강제로 랜덤하게 사진을 1.0 ~ 1.3배로 늘어뜨린다.



실무에서는 가장 성능을 끌어올리는 방식이 이 Preprocessing이다.
자신의 도메인 지식을 Preprocessing에 적용해야한다.

가주 자주 사용하는 방식은

  1. RGB 값의 평균을 빼는 것(99% 쓴다) -> 성능이 좋아지는게 아니라 train시 loss 수렴이 빨라진다.(Preprocessing)
  2. 좌우반전(Augmentation)
  3. 다양한 사이즈로 넣기(Augmentation)


요즘은 overfitting을 방지하기 위한 Random noise방식은 거의 쓰이지 않는다고 한다.



실습

로컬 노트북

+ Recent posts