본문 바로가기

AIFFEL/GoingDeeper-CV

[AIFFEL/GoingDeeper] CAM(Class Activation Map)

728x90

https://3months.tistory.com/465

분류모델에 강아지, 고양이 이미지가 입력으로 들어온다고 생각해보자. 먼저 일반적인 이미지 분류 모델은 이미지의 local feature를 추출하기 위해 CNN으로 구성된 특성 추출용 백본 네트워크가 앞에 있다. 백본 네트워크에서 추출된 특성 맵을 fully connected layer에 통과시켜 얻어진 logit을 소프트맥스 활성화 함수에 통과시키면, 입력 이미지가 강아지인지 고양이인지 확률을 얻을 수 있다

 

그렇다면 대체 CNN 모델이 입력 이미지의 어떤 부분을 중점적으로 보고 해당 입력 이미지가 강아지 사진이라는 것을 예측했을까? 인공지능이라도 그렇게 판단한 정량적인 이유가 분명히 있을 것이다. 이러한 이유를 알 수 있는 방법 중 하나가 CAM(Class Activation Map)이다. 


 

📍 CAM(Class Activation Map)

- 모델이 어떤 곳을 보고 어떤 클래스임을 짐작하고 있는지 확인할 수 있는 지도

- 관련논문 :  http://cnnlocalization.csail.mit.edu/Zhou_Learning_Deep_Features_CVPR_2016_paper.pdf

 


✔ 1. GAP를 활용한 CAM

 

1) GAP(Global Average Pooling)

http://taewan.kim/post/cnn/
https://alexisbcook.github.io/2017/global-average-pooling-layers-for-object-localization/

 

- 매 채널별로, average pooling을 채널의 값 전체에 global하게 적용

- 위 그림에서 볼 수 있듯이 크기가 6x6이고 채널이 3개인 특성맵에 대해서 GAP을 수행하면 각 채널이 딱 한 개의 숫자로 요약되어, 1x1 크기의 채널이 3개인 벡터를 얻게 된다. 이때 결과 벡터의 각 차원의 값은 6x6 크기의 특성 맵을 채널별로 평균을 낸 값이다. 

https://gaussian37.github.io/dl-concept-global_average_pooling/

 

Global Average Pooling 이란

gaussian37's blog

gaussian37.github.io

 

분류 모델의 마지막 부분에서 fully connected layer 대신 GAP을 사용하는 방법은 Network in Network라는 논문에서 제안되었다.

일반적으로 이미지 분류에서는 여러 CNN 레이어를 거쳐 우선 특성을 추출하고, 그 특성 맵을 flattening 한 후 fully connected layer에 입력해 줌으로써 각 클래스에 따른 logit을 구하고 최종적으로 활성화 함수를 거치게 한다.

그러나 Network in Network 논문에서는 CNN 이후 fully connected layer 대신 GAP 연산을 한다.

아래 그림처럼 GAP 연산을 하고, 그 연산 결과에 소프트맥스 활성화 함수를 적용한다. 이때 마지막 CNN 레이어의 채널 수는 데이터의 클래스 수에 맞춰 각 클래스에 따른 확률을 얻을 수 있도록 했다. 원 논문에서는 이렇게 하면 특성 맵의 각 채널이 클래스별 신뢰도를 나타내게 되어 해석이 쉬울 뿐만 아니라, fully connected layer와 달리 최적화할 파라미터가 존재하지 않으므로 과적합(overfitting)을 방지할 수 있다고 설명한다.

 

https://arxiv.org/abs/1312.4400

 

2) CAM

  • 클래스가 활성화되는 지도
  • 일반적인 CNN은 커널 윈도우에 따라서 특성을 추출하므로 CNN레이어를 거친 특성 맵에도 입력값의 위치정보가 유지된다.
  • 따라서 특성 맵의 정보를 이미지 검출이나 세그멘테이션 등의 문제를 푸는 데 이용하기도 한다

http://cnnlocalization.csail.mit.edu/Zhou_Learning_Deep_Features_CVPR_2016_paper.pdf

CAM을 얻을 수 있는 네트워크는 위 그림에서 볼 수 있다. 먼저 CNN 레이어를 거쳐 뽑아낸 특성 맵에 대해서 GAP을 적용한다. 그리고 이에 대해서 소프트맥스 레이어(소프트맥스 활성화 함수를 가지고 bias가 없는 fully connected layer)를 적용한다.

CNN을 거친 특성맵에서 각 클래스에 대한 정보는 결괏값의 여러 채널에 걸쳐 나타나게 된다. GAP을 통해 각 채널별 정보를 요약하면 소프트맥스 레이어는 이 정보를 보고 각 클래스에 대한 개별 채널의 중요도를 결정한다. 이렇게 클래스별로 소프트맥스 레이어를 통해 각 채널의 가중합을 구하면 각 클래스가 활성화 맵의 어떤 부분을 주로 활성화시키는지 확인할 수 있다.

이렇게 얻은 특성 맵은 CNN의 출력값 크기와 같게 된다. 이를 보간(interpolation)을 통해 적절히 원본 이미지 크기로 확대해 주면 위와 같은 CAM을 얻을 수 있다.

 

 


 

✔ 2. Grad-CAM

기존 CAM은 GAP(Global Average Pooling)을 활용했지만 Grad CAM 기법은 GAP를 사용하지 않는다. GAP를 왜 사용하지 않을까? 

 

GAP는 위에서 알아보았던 것처럼 Feature Map의 각 채널마다 GAP를 취한 값을 하나의 Input으로 설정해서 뉴럴네트워크를 학습시켜야 한다. 결국 필수적으로 하나의 추가적인 뉴럴 네트워크를 사용하고 이는 결국 높은 컴퓨팅 비용 문제가 자연스럽게 발생한다. 이러한 문제점에 착안하여 Grad CAM은 기존 CAM 처럼 새로운 뉴럴 네트워크를 추가하지 않고 이미지 분류 결과를 설명할 수 있는 방법을 제시한다.

 

Grad-CAM을 사용하면 CNN 기반의 네트워크는 굳이 모델 구조를 변경할 필요가 없으며, 분류 문제 외의 다른 태스크들에 유연하게 대처할 수 있다.

 

  • 위의 이미지는 개와 고양이가 있는 이미지에 대해서 Guided Backprop, Grad-CAM, Occlussion map의 시각화를 비교
  • Grad-CAM에서는 높은 분별력과 큰 dimension을 갖는 CAM을 만드는 것을 중요하게 보았다

Grad-CAM의 전체적인 구조는 위와 같다. 그림의 왼쪽에서 모델의 구조를 볼 수 있다. 위에서 보았던 이미지를 입력으로 CNN을 거쳐 특성 맵을 추출하고 그 뒤로 태스크에 따라서 다양한 레이어들이 사용된다.

오른쪽의 "Image Classification"과 "Image captioning", "Visual question Answering"은 Grad-CAM이 적용될 수 있는 다양한 컴퓨터 비전 문제들을 설명한다.

- Image Captioning은 이미지에 대한 설명을 만들어내는 태스크.

- Visual question answering은 VQA라고도 불리며, 어떤 질문과 이미지가 주어졌을 때 이에 대한 답변을 내는 태스크

 

1) 그래디언트를 통한 Weight Score 계산

Grad-CAM에서는 그래디언트(gradient) 를 사용해서 CAM을 얻어 낼 수 있다. 원하는 클래스에 대해서 관찰하는 레이어로 들어오는 그래디언트를 구할 수 있다면, 해당 클래스를 활성화할 때, 레이어의 특성 맵에서 어떤 채널이 중요하게 작용하는지 알 수 있다. 

아래의 식은 클래스에 대해서 backpropagation을 통해 얻은 k번째 채널의 그래디언트를 사용해 가중치 점수(Weight score)를 구하는 식으로 y는 모델의 출력값이고 A는 활성화 맵을 의미한다. i,j는 각각 x축, y축이고, Z는 전체 map의 크기이다. 

[k번째 채널의 그래디언트를 통해 가중치 점수를 구하는 식]

위의 식을 통해서 k 개의 채널을 가진 활성화 맵에서 각 채널이 어떤 클래스를 활성화하는 데 얼마나 중요하게 작용하는지 가중치 점수를 구할 수 있다. 이 가중치를 구하기 위해 CAM처럼 별도의 weight 파라미터를 도입할 필요가 없다는 것을 알 수 있다. 

Grad-CAM은 번째 활성화 맵과 이 가중치를 곱해주어 합한 뒤 ReLU 활성화 함수를 통해서 클래스에 따른 Grad-CAM을 얻는다. 

https://arxiv.org/pdf/1610.02391.pdf

 


https://techblog-history-younghunjo1.tistory.com/201

 

[ML] Explainable AI - CAM & Grad CAM

🔉해당 포스팅에서 사용된 자료는 고려대학교 산업경영공학부 김성범교수님의 Youtube 강의자료에 기반했음을 알려드립니다. 혹여나 출처를 밝혔음에도 불구하고 저작권의 문제가 된다면 joyh9

techblog-history-younghunjo1.tistory.com

 

CAM 실습 : https://github.com/Journey99/AIFFEL_PROJECT/blob/main/%5BGD-06%5DClass%20Activation%20Map.ipynb

 

GitHub - Journey99/AIFFEL_PROJECT

Contribute to Journey99/AIFFEL_PROJECT development by creating an account on GitHub.

github.com