본문 바로가기

AI/CV

[10/19] 아이펠 리서치 15기 TIL | Grad-CAM

반응형

오늘 배운 내용

오늘은 Grad-CAM(Gradient-weighted Class Activation Mapping)에 대해 공부했다.


Grad-CAM

Grad-CAM(Gradient-weighted Class Activation Mapping)이란 설명 가능한 인공지능(eXpainable Intelligence, XAI) 기술 중 하나로, 딥러닝 모델의 내부 동작 원리를 시각화하는 방법이다.

 

XAI는 AI 모델이 도출한 결과를 인간이 이해하고 검증할 수 있게 하는 방법이다.

딥러닝 모델이 이미지 분류와 같은 작업을 수행하기 위해서는 입력 이미지에서 중요한 영역을 파악해 예측해야 한다. 하지만 이러한 예측 과정은 블랙박스 문제(Black Box Problem)를 유발한다.

 

Grad-CAM을 보기 전에 CAM이 무엇인지 먼저 알아보자.


CAM

클래스 활성화 맵(Class Activation Map, CAM)이란 XAI 중 하나로 딥러닝 모델에서 특정 클래스와 관련된 입력 이미지 영역을 시각화하는 방법이다.

 

주로 CNN에서 활용되는데, CAM은 피처 맵을 활용해 입력 이미지의 어떠한 부분이 특정 클래스와 관련 있는지 시각화한다.

(피처 맵에 대한 자세한 설명은 여기에서 확인할 수 있다.)

 

아래 그림은 CAM을 히트맵으로 시각화한 결과이다.

 

CAM 생성 방식

CAM은 CNN의 피처 맵의 채널과 분류기의 파라미터 값을 활용해 생성되는데, 피처 맵의 각 채널과 분류기의 가중치를 곱해 채널마다 가중치의 합을 계산한다. 이 값을 정규화해 어느 영역에서 가장 강하게 활성화되는지를 수치화하고, 이를 시각화하여 분류 결과에 영향을 미치는 영역을 파악한다.

 

아래 그림은 CAM의 생성 과정이다.

 

CNN의 마지막 CL은 피처 맵을 계산하는 레이어인데, 이 레이어에서 GAP(Global Average Pooling)을 적용해 각 픽셀에 대한 정보를 1차원으로 펴고 이를 출력으로 사용한다.

 

GAP를 통과하면서 피처 맵의 채널별로 특징값들을 통합하고 이 값을 분류기에 전달한다. 이때 사용한 분류기의 파라미터가 출력 클래스에 대한 특징값 가중치가 되는데, 이 가중치가 높을수록 분류에 많은 영향을 주게 된다.

 

그러므로 GAP를 사용하면 CNN이 각 클래스에 어떤 특징을 활용해 분류를 수행하는지 확인할 수 있고, 시각화할 수 있다.

CNN의 클래스 분류 과정

 

아래는 CAM 생성 수식이다.

  • M_c(x, y): 클래스 c에 대한 최종 CAM.
    • x, y는 히트맵의 픽셀 좌표를 의미하는데, 이 값이 높을수록 원본 이미지의 해당 영역이 클래스 c라고 판단하는 데 중요한 역할을 했다는 뜻이다.
  • k: 피처 맵의 index
  • A^k(x, y): 피처 맵 k번째 채널의 x행 y열.
    • GAP를 하기 전 마지막 CL의 활성화 값이다.
  • w: k번째 피처 맵(A^k)이 특정 클래스 c의 최종 예측에 얼마나 중요한 기여를 했는지를 나타내는 가중치. (핵심 요소)

CAM을 생성하는 코드는 아래 깃허브 링크에서 볼 수 있다.

https://github.com/choiwonjini/AIFFEL_practice/blob/main/CV/4_CAM.ipynb

 

AIFFEL_practice/CV/4_CAM.ipynb at main · choiwonjini/AIFFEL_practice

Contribute to choiwonjini/AIFFEL_practice development by creating an account on GitHub.

github.com


Grad-CAM

Grad-CAM(Gradient-weighted Class Activation Mapping)은 CAM과 유사하지만 GAP를 사용하지 않고 마지막 CL에서 역전파를 통해 클래스에 대한 중요도를 계산한다는 차이가 있다.

 

1. CAM의 단점, Grad-CAM의 장점

기존 CAM의 한계는 모델의 구조가 무조건 아래의 순서여야만 작동한다는 것이다.

[마지막 Conv Layer] → [Global Average Pooling(GAP)] → [Fully Connected Layer]

 

이 구조가 아닌 VGG, AlexNet 등 대부분의 모델에서는 사용할 수 없어 모델 구조를 변경해야 했다.

반면, Grad-CAM은 모델 구조와 상관없이 마지막 CL만 있다면 어떤 CNN 모델에도 적용할 수 있다는 장점이 있다.

 

2. Grad-CAM의 아이디어

CAM은 FC 레이어의 가중치를 피처 맵의 중요도로 사용했다.

하지만 Grad-CAM은 FC 가중치를 직접 쓰지 않고 기울기를 이용해 중요도를 계산했다.

 

핵심 질문:

특정 클래스 c의 점수 S에 대해, k번째 피처 맵(A)이 얼마나 큰 영향을 미치는가?

→ 클래스 점수 S를 k번째 피처 맵 A로 미분한 값(기울기)를 보면 된다.

기울기 값이 크다는 것은 해당 피처 맵의 값이 조금만 변해도 특정 클래스 c 점수가 크게 변한다는 뜻이므로 중요한 피처 맵이라는 의미이다.

 

3. Grad-CAM의 수식

3.1. 피처 맵의 중요도 α 계산

  • α_k^c: 클래스 c에 대한 k번재 피처 맵의 최종 중요도 가중치
  • S^c: 특정 클래스 c의 최종 점수
  • A^k: 마지막 CL의 k번째 피처 맵
  • ∂S/∂A(i, j): 클래스 c의 점수를 피처 맵 A^k의 (i, j) 위치의 픽셀로 미분한 값. 즉, 기울기
    • 이 값은 역전파를 통한 기울기를 계산하는 연산이다.
  • Z: 피처 맵의 픽셀 수

3.2. 히트맵 생성

모든 피처 맵을 중요도 가중치에 따라 가중합(weighted sum) 한다.

마지막으로 ReLU를 거쳐 최종 결과에서 음수 값을 0으로 만든다. (클래스 예측에 긍정적인 영향을 주는(양수) 값에만 관심이 있기 때문.)

 

최종 결과 예시:

 

자세한 Grad-CAM의 구현 코드는 아래 깃허브 링크에서 확인할 수 있다.

https://github.com/choiwonjini/AIFFEL_practice/blob/main/CV/5_Grad_CAM.ipynb

 

AIFFEL_practice/CV/5_Grad_CAM.ipynb at main · choiwonjini/AIFFEL_practice

Contribute to choiwonjini/AIFFEL_practice development by creating an account on GitHub.

github.com


느낀 점, 어려웠던 점

딥러닝의 중간 과정은 인간이 이해할 수 없다고 알고 있었는데, 이렇게 피처 맵과 가중치를 활용해 시각화를 해보니 재미있었다.

반응형