본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

Weakly Supervised Localization

학습목표

이번 강의에서는 Weakly Supervised Localization과 Class Activation Map에 대해 알아보도록 하겠습니다. 어떤 물체를 인식하여 분류해내는 것을 넘어서서 이미지 내의 어디에 분류해낸 물체가 있는지 알아보는 방법을 위의 2가지 방법론을 통해 알아보겠습니다.

핵심 키워드

  • Weakly Supervised Localization
  • Class Activation Map(CAM)
  • Detection / Localization

학습하기

 Weakly Supervised Localization 이름에서 알 수 있듯, Weakly supervised 방법론을 통해 Localization 문제를 푸는 것입니다. 이미지를 분류할 때, 이 이미지가 뭐다 라고 분류하는 것도 중요하지만, 그 물체가 이미지의 어디에 위치해 있는지도 굉장히 중요한 요소겠지요. Localization은 바로 이런 물체의 위치를 잡아내는 겁니다. 또는 Detection이라고도 하는데 이미지에서 어떤 영역, 찾고자 하는 물체가 존재하는 영역에 박스를 그리는 게 목적이 되겟죠. 때문에 이런 Localization을 위해서는 준비되어야하는 훈련 데이터셋도, 어떤 이미지와, 이미지 속 찾고자하는 물체가 존재하는 위치가 각각 X,y로 할당이 되어야합니다. 준비하기가 좀 어렵죠

 그런데 WSL, CAM은 X,y가 그렇게 안생겼어요. 그냥 이미지와 라벨 이렇게 데이터가 주어집니다. 그런데 알아서 네트워크가 Localization을 시행하죠. 

 이제부터 이런 내용들을, "Learning Deep Features for Discriminative Localization"이라는 논문을 통해 알아볼건데요. 이 글의 목적은 이겁니다. Visualizing the internal representation of CNNs. CNN이 분류작업을 시행하는데 그 안에서 어떤 Representation이 나오는지를 시각화해보자는 거죠. 핵심 내용들은 음.. 첫째는 Localization by Class Activation Map. 다른게 아니라 CAM으로 Localization을 하자는 거구요. 둘째는 in One CNN forward pass. 그러니까 CNN을 한번만 통과시키면 어떤 Output이 나오는 겁니다. 이건 의료영상에서 중요한데요. 의료영상은 단순히 이 사람이 결핵이다 폐암이다 이런게 중요할 뿐 아니라, 어떤 뭐 X-ray같은 사진을 보고 어떤 위치를 보면 이거 때문에 결핵이다 이런게 중요합니다. 두번째로, CNN을 디버깅하는 입장에서도 중요합니다. 결국 모델을 해석하는게 굉장히 중요할 때가 많다는 말인데요. 아까 말했던 CNN 내부의 Representation을 시각화해봄으로써, 모델이 어느 부분을 중점적으로 보고 판단하는지를, 우리가 해석할 수 있게된다는 거죠. 

 대개 Supervised learning of localization의 경우에는 아까 말씀드렸다싶이, 물체가 있는 Bounding box 데이터가 필요합니다. 이와다르게, Weakly supervised localization은 이런 Bounding box 없이 한 번 해보자 하는 움직임이죠. 이런 성공적으로 구현시킨 Architecturs는 간단합니다. AlexNet에 11x11 Avg Pooling(Gloval Average Pooling,GAP)을 연결한게 핵심이였습니다. 자 그래서, 우리가 일반적으로 알고있는게, Semantic segmentation은 어떤 이미지를 넣으면, Class activation map이 된다 라는 건데요. CAM은 결국, Output의 Weight를 Conv feature map으로 투사시켜서, 중요한 이미지 영역을 찾아내는 겁니다. Feautre map이란 건, Conv filter를 통해 얻어진, 이미지의 Representation입니다. 여기에 GAP을 적용한다는건, 그 Representation을 평균 내는 거잖아요. Feature map에는 물체에 대한 위치 정보가 아직 남아있어요. 오른쪽 상단에는 얼마나 값이 높은지, 하단은 얼마나 낮은지 이런, Conv filter랑 Input이 비슷하면 값이 높았죠?, 쨋든, 그런데 거기에 GAP를 씌워버리면, 단순히 전체 이미지가 내가 찾는 것과 얼마나 비슷한지 정도로 퉁쳐집니다. 다시. 예를 들어서, 사람이 앉아있는 사진을 Input으로 넣고 CNN을 돌렸는데, 첫번째 Conv filter 모양이 사람 머리 모양이라고 해봅시다. 그러면 Feature map에서는 사람의 머리에 해당하는 위치에서 높은 값이 나오겠죠. 그런데 이걸 평균을 내게되면, 전체 이미지 속에 사람 머리가 얼마나 차지하고 있는지, 이런 식의 부위 별로, 특징 별로 포함하고 있는 정도의 정보가 들어가 있는거죠. 그럼 이걸 취합해서 최종 분류가 나오겠죠? 자 다시, 최종분류를 하기전에는 GAP의 결과물에 (각 Conv feature map에 GAP를 거친 결과, 결국 Conv feature map의 채널 수만큼으로 Flatten되겠죠)에 Weight를 곱하는 방식이 시행될텐데, 각각의 Conv feature map은 서로 다른 특징들을 잡고 있겠죠? 1번은 사람 머리, 사람 손, 사람 가슴, 배경, 옆에 있는 강아지 뭐 이런 식으로요. 사람 머리라는 판단을 내려야하는데 사람 손, 가슴 배경 이런 것들에게 높은 Weight를 줄까요? 아니겠죠? 결국 대상을 분류하는데 높은 중요도를 가진 Feature map에 높은 Weight를 설정하겠죠. 쨋든, 이렇게 결과가 나왔으면, Weight가 의미하는건 각각의 Feature들의 중요도입니다. 뭐에 대한? Class에 대한. 다시한번, CNN의 학습이 끝나면, GAP을 통해 이미지의 어디를 보고 최종 분류를 한 건지에 대한, Heatmap을 얻을수있는거죠.

 결과를 보면, 하나의 이미지를 보고, 어디를 보면 이거더라, 저기를 보면 저거더라 이런식의 정보를 우리가 알 수 있고, 이걸 보면 모델을 디버깅하기가 조금 수월하죠.

 이제 GAP 와 GMP(Gloval Max Pooling)을 한 번 볼게요. GAP는 평균이잖아요? 그래서 물체 전체에 대한 정보롤 끌어내요. 전반적인 느낌을 아는거죠. 그런데 GMP는 최대값이니까, 단 하나의 Discriminative parts를 집중해서 보게 됩니다. 그래서 GAP가 Localization에서 장점을 갖죠. Back ground noise에도 좀 더 robust하구요. 실제 실험 결과도 그렇습니다. Fully connected layers를 모두 제거하고, GAP와 FC softmax layer를 사용했고, GAP 전의 Conv layer가 높은 Spatial resolution을 가지면 더 좋다. 뭐 그래서 3x3x512 Filter보다 3x3x1024 Filter를 쓰는게 더 좋다 뭐 이런 것들을 포함해서요. 

 자 다시한번 정리하죠. 우리가 하고자했던건, 기존의 Classification을 실행하면서 Localization. 물체의 위치에 대한 정보까지 가져와야했죠. 그래서 GAP를 사용한거에요. 기존의 VGGnet 같은 것들은 Classification만을 위한 Architecture였습니다. 그래서, 이런 기존의 Architecture와 Architecture+GAP를 단순 Classification error를 비교하면, 뭐가 더 좋을까요? 당연히 GAP를 적용하지 않은게 좋습니다. Avg Pooling이란게 애초에 정보를 일그러뜨리니까 뭐 그럴 수 있죠. 그래도 생각보다 엄청난 차이를 보이진 않습니다 약 1~2%정도 하락합니다. GMP와 GAP의 Classification performance는 뭐 비슷합니다.

 자 이제, 중요한 Localization. 원래 이건 Bouding box가 필요한데, 지금까지의 결과로는 Heatmap을 얻게되잖아요. 그래서 Heatmap 근처에 Bounding box를 그려보는 겁니다. 그랬더니 아 결과가 그럴듯해요. 그래서 더 시험을 해봤죠. 먼저 Weakly supervised와 Fully supervised. 위치정보 없이 학습시킨 Ws와, 위치정보를 주고 학습시킨 Fs. 당연히 같은 모델에서는 Fs가 더 좋은 정확도가 나와요. 그런데 Ws를 학습시킬 때는 조금 더 좋은 모델을 주고, GoogLeNet같은, Fs를 학습시킬 때는 AlexNet을 줬더니 결과는 비슷했습니다. 결국 GAP로 뽑아낸 벡터가, 이미지를 설명하는 좋은 벡터가 된다는 말이죠. 

 결론을 내자면, GAP를 이용한 CAM. 그리고 이걸 통해 훈련된 CNN은 Object localzation을 배울 수 있다. 바운딩 박스 데이터 없이도. 그리고 CAM은 예측된 클래스 점수를 시각화하는 것이 가능하다나. 그러니까 이 모델이 어디를 보고 이런 결과를 도출했는지에 대한 해석에 유용합니다. 그리고 Conept localization 등 여러 분야에 접목이 가능하면서, 뒤에 GAP만 연결하면되니까 굉장히 쉽죠. 이상입니다.