공부/AIFFEL

Going Deeper(CV)_DJ 4 : 이미지 어디까지 우려볼까?

dong_dong_2 2021. 4. 13. 20:43

1. 데이터 불러오기
    - 이번 노드에서는 augmentation을 텐서플로우 모델 학습에 어떻게 적용할 수 있는지 공부한다.
    - 지금까지 모델을 훈련시키기 전, 데이터를 전처리해 입력값으로 사용해 왔다.
    - Augmentation도 이처럼 입력 이미지의 데이터를 변경해주는 과정이므로 일반적인 이미지 데이터 전처리 방법과 활용방법이 동일하다.
    - 코드를 통해 필요한 라이브러리를 불러오고, GPU 상태를 확인했다.
    - 그리고 사용할 데이터셋을 불러온다. 이번에는 stanford_dogs 데이터셋을 사용했다.
    - stanford_dogs 데이터셋에는 120개 견종의 이미지가 포함되어 있다. 총 20,580장의 이미지에서 12,000장은 학습셋, 나머지 8,580장은 평가용 데이터셋이다.
    - 데이터를 처음 사용하면 다운로드 받아야 하기 때문에 시간이 10분 이상 오래 걸릴 수 있다. 코드를 통해서 데이터를 불러왔다.
2. Augmentation 적용하기
    - 텐서플로우 Random Augmentation API 사용하기
       1) 많은 augmentation 기법들이 있지만 그 중에서 텐서플로우 API로 바로 사용할 수 있는 방법들을 먼저 적용해 보겠다.
       2) 먼저 이미지셋에 대해서 랜덤한 확률로 바로 적용할 수 있는 augmentation 함수들은 아래의 사진과 같다.


       3) 코드를 통해 Augmentation을 적용하기 전 기본적인 전처리 함수를 만들었다. (resize를 해주고, Normalize를 하는 함수)
       4) 노드의 코드처엄 하면 이미지 변환의 결과로 리턴받은 이미지를 그 다음 전처리 함수의 입력으로 연거푸 재사용할 수 있는 구조가 되어 편리하다.
       5) 코드로 만든 기본적인 전처리 함수는 입력 받은 이미지를 0~1 사이의 float32로 normalize하고, (224, 224) 사이즈로 resize한다. 이 함수는 훈련용과 테스트용으로 사용될 모든 이미지에 적용된다.
       6) 사진에서 언급한 random augmentation들 중 flip과 brightness를 코드 실습을 통해 사용해봤다.
          (1) filp의 경우 좌우 대칭을 해준다. 예컨대 이미지 분류 문제에서 개 이미지는 좌우를 대칭해도 문제가 되지 않는다. 아라서 좌우대칭의 적용을 통해 이미지를 늘릴 수 있다.
          (2) brightness를 조절하여 다양한 환경에서 얻어진 이미지에 대응할 수 있도록 한다.
       7) 그리고 Augmentation을 통해 원본 데이터셋에 다양한 형태의 가공한 형태의 새로운 데이터셋을 얻게 되는 모든 과정을 구현한 메인 함수를 만들었다.
       8) 이 메인 함수는 일반적인 전처리 과정(normalize, resize, augmentation, shuffle)을 해준다. 이 때 주의할 점은 shuffle이나 augmentation은 테스트셋에 적용하지 않아야 한다.
       9) 그리고 Random Augmentation을 코드를 짜서 직접 구현해봤다.
3. 비교실험 하기
    - 이제 augmentation을 적용한 이미지셋을 훈련한 모델과 augmentation을 적용하지 않은 이미지셋을 훈련한 모델의 성능을 비교해봤다.
    - 이 때 사용된 모델은 resnet50이다.
    - 결과는 EPOCH 10을 전후해서 augmentation을 적용한 모델이 accuracy가 높게 형성 되었다.
4. Cutmix Augmentation
    - 지금부터 조금 더 복잡한 augmentation 방법을 알아본다. 먼저 Cutmix augmentation이다.
    - CutMix는 네이버 클로바(CLOVA)에서 발표한 논문에서 제안된 방법이다.
    - 이름인 CutMix를 보고 유추할 수 있듯 이미지 데이터를 자르고 섞는다고 생각할 수 있다.


    - 위 표에서 ResNet-50 컬럼은 우리가 일반적으로 사용해왔던 방식을 나타낸다.
    - Mixup은 특정 비율로 픽셀별 값을 섞는 방식이고, Cutout은 이미지를 잘라내는 방식이다.
    - CutMix는 Mixup과 비슷하지만 일정 영역을 잘라서 붙여주는 방법이다.
    - CutMix는 이미지를 섞는 부분과 섞은 이미지에 맞추어 라벨을 섞는 부분을 포함한다. 이 다음에는 설명과 코드 실습을 통해 한 부분씩 구현했다.
    - 이미지 섞기
       1) 가장 먼저 두 개의 이미지를 섞어주는 것부터 생각해 본다.
       2) 배치 내의 이미지를 두 개 골라서 섞어준다.
       3) 이 때 이미지에서 잘라서 섞어주는 영역을 바운딩 박스(bounding box)라고 부른다
       4) 코드를 통해 훈련데이터셋에서 이미지를 2개를 가져와서 함수를 만들어서 실습을 했다.
    - 라벨 섞기
       1) 이미지를 섞었다면 라벨도 이에 맞게 섞어주어야 한다.
       2) 우리가 만약 강아지와 고양이의 이미지를 섞었다면 라벨 또한 적절한 비율로 섞여야 한다.
       3) CutMix에서는 면적에 비례해서 라벨을 섞어준다.
       4) 섞인 이미지의 전체 이미지 대비 비율을 계산해서 두 가지 라벨의 비율로 더해준다.
       5) 예를 들어 A 클래스를 가진 원래 이미지 image_a와 B 클래스를 가진 이미지 image_b를 섞을 때 image_a를 0.4만큼 섞었을 경우, 0.4만큼의 클래스 A, 0.6만큼의 클래스 B를 가지도록 해준다.
       6) 이 때 라벨 벡터는 보통 클래스를 표시하듯 클래스 1개만 1의 값을 가지는 원-핫 인코딩이 아니라 A와 B클래스에 해당하는 인덱스에 각각 0.4, 0.6 배분하는 방식으로 사용한다.
       7) 코드를 통해 이 또한 실습했다.
       8) 그리고 실습한 2개의 함수를 합쳐서 cutmix 함수를 만들었다.
5. Mixup Augmentation
    - Mixup은 위에서 본 CutMix보다 간단하게 이미지와 라벨을 섞어준다.
    - mixup은 두 개 이미지 픽셀별 값을 비율에 따라 섞어주는 방식으로 CutMix보다 구현이 간단하다고 볼 수 있다.
    - 코드를 통해 Mixup 함수를 구현했다. 두 이미지 쌍을 섞을 비율은 일정한 범위 내에서 랜덤하게 뽑ㄱ, 해당 비율값에 따라 두 이미지의 픽셀별 값과 라벨을 섞어주면 된다.
6. 프로젝트 : CutMix 또는 Mixup 비교실험하기
    - 지금까지 기본적인 augmentation 방법을 적용해 모델을 훈련시키고, 최신 augmentation 기법을 배웠다.
    - 이제까지 augmentation을 적용하지 않은 데이터셋, random augmentation을 적용한 데이터셋, CutMix를 적용한 데이터셋, Mixup을 적용한 데이터셋 4개를 만들어 모델에 각각 훈련시켜 보고 성능을 비교해보자.