본문 바로가기
  • 우당탕탕속의 잔잔함
Programming/Deep Learning Network

[Model] Grad-CAM

by zpstls 2023. 2. 15.
반응형

Model 내부에서 Object Detection등과 같은 연산을 진행할 때, 어느 곳이 활성화되어서 Detection을 수행하는지에 대해 확인할 수 있는 방안이 필요할 수도 있습니다.

이를 위한 Grid-CAM 부분을 정리하고자 합니다.

 

Example of Grad-CAM

 

 

CAM

학습 이미지와 이에 대한 Label만 있는 상황에서 DL Model이 Image의 어느 부분을 보았는지를 알고 싶을 때, 학습 이미지와 이에 대한 Bounding Box만 있는 상황에서 각 Pixel에 대한 Label을 알고 싶을 때가 있습니다.

위와 같은 상황은 학습할 이미지에 대한 정보보다 예측해야 할 정보가 더 디테일한 경우라고 할 수 있고, 이를 Weakly Supervised Learning이라고 하는데, 이는 CAM을 통해서 알 수 있습니다.

CAM은 CNN 구조로 구성되어 있으며, 일반적인 CNN과 다른 부분은 GAP이라는 부분입니다. 이는 마지막 Convolution Layer와 Target Class 정보 간의 Weight를 통해 Class Activation Mapping이라는 연산을 수행합니다.

일반적인 CNN의 구조는 Convolution Layer가 몇 개 있고 이후, Fully-Connected Layer가 붙는 구조를 갖습니다. 그러나 CAM의 경우, Convolution Layer이후를 Global Average Pooling(= GAP) Layer로 바꾼 형태를 가집니다.

이러한 GAP의 연산 과정은 다음과 같습니다.

우선, GAP Layer는 Input Image의 모든 값의 평균을 산출합니다. 즉 GAP Layer로 들어오는 Input Image의 Feature Map의 Depth가 4라고 한다면 총 4개의 값으로 이루어진 Vector를 얻게 되는 것이죠. 이는 극단적인 Dimension Reduction이라고 볼 수도 있습니다.

이후, 각 Class로 연결되는 Fully-Connected Layer를 붙여 Fine-Tuning을 시킵니다.

 

Fine-Tuning의 구체적인 연산과정은 다음과 같습니다.

우선, $f_k(j, j)$는 k번째 Feature Image를 의미합니다. 이때 i, j는 x, y축 좌표를 의미합니다. 그리고 $W_{k}^{c}$는 k번째 Feature Image $f_k(j, j)$에서 Class C로 가는 Weight를 의미합니다.

각 Feature Map $f_k(i,j)$ 에 각 Class에 대한 가중치 $W_{k}^{c}$를 곱해주면 Heatmap을 Feature Map 개수 k만큼 얻을 수 있게 됩니다. 이렇게 얻은 Heatmap Image를 모두 Pixel-wise sum을 해주면 하나의 Heatmap을 얻을 수 있는데 이것이 CAM입니다.

CAM의 특징은 Class마다 계산할 수 있다는 것입니다. 즉 Dog Class로 CAM을 계산할 경우에는 다른 Heatmap을 얻게 됩니다.

 

다음은 CAM의 결과 이미지입니다.

Object가 위치한 부분에서 Heatmap이 활성화되어 있는 것을 확인할 수 있습니다.

CAM은 간단히 계산할 수 있는 Tool이지만 Global Average Pooling (= GAP) Layer를 사용해야 한다는 한계점을 갖습니다. GAP 연산으로 대치하게 되면 뒷부분에서 Fine tuning을 수행해야 하는 것이죠. 또한 마지막 Convolution Layer에 대해서만 CAM을 추출할 수 있다는 한계도 있습니다.

 

 

Grad-CAM

위와 같은 CAM의 한계점을 보완하기 위해 Grad-CAM이 발표되었으며 이는 Gradient를 이용하는 방식입니다.

우선, Gradient의 특징을 보면 다음과 같습니다.

Hidden Layer가 없는 경우 각 Input Node는 Output Node에 하나의 Weight를 통해 영향을 주며, 이러한 Path를 통해 Gradient가 역전파됩니다. Hidden Layer가 추가되면 각 Input Node는 모든 Hidden Layer의 Node를 거쳐 Output Node에 영향을 줍니다. 이때 Gradient는 모든 Hidden Layer를 통해 역전파됩니다. 즉, Gradient는 Class에 대해 Input이 주는 영향력이라고 할 수 있습니다.

이러한 Gradient의 특성을 이용해 개발된 것이 Grad-CAM이며, 이는 다음과 같이 별도의 GAP Layer를 사용하지 않아도 됩니다.

Grad-CAM은 GAP를 사용할 필요가 없다는 점에서 일반화된 CAM이라고도 볼 수 있습니다.

CAM과 Grad-CAM의 수식 차이점은 다음과 같습니다.

Grad-CAM에는 ReLU함수가 추가되었고 $W_{k}^{c}$가 $a_{k}^{c}$로 변경되었다는 점에서 차이가 있습니다. $a_{k}^{c}$는 k번째 Feature Map $f_k(i, j)$의 각 원소 i, j가 Output Class C의 matmul값 $S_{}^{c}$에 주는 영향력의 평균입니다. 즉, CAM에서는 Weight로 주었던 Feature Map의 가중치를 Grad-CAM에서는 Gradient로 바꾸어 주었다고 보시면 됩니다.

Gradient의 Pixel별 평균 값인 $a_{k}^{c}$를 각 Feature Map $f_k(i, j)$에 곱해 Heatmap을 만듭니다. 그리고 CAM과 마찬가지로 Pixel-wise sum을 한 후, ReLU함수를 적용해 양의 가중치를 갖는 부분을 골라냅니다. 이 결과 값이 Grad-CAM이 되며, 해당 결과 이미지는 다음과 같습니다.

Object 부분이 활성화되어 있는 것을 확인할 수 있습니다. 이를 통해 Model이 어느 부분을 중점적으로 보고 있는지, 잘 보고 있는지를 확인할 수 있을 것입니다.

 

 

이렇게 Grad-CAM에 대해 정리해보았습니다. 이 자체가 어떤 산출물을 만들어내진 않겠지만, Model을 설계하고 실행시키는 과정에서 Model을 개선해야 할 때 많이 활용될 수 있지 않을까 싶습니다.

 

이번 포스트는 여기서 마무리하도록 하겠습니다.

반응형

'Programming > Deep Learning Network' 카테고리의 다른 글

[Model] FPN  (0) 2023.02.22
[Model] RetinaNet  (0) 2023.02.22
[Model] MobileNet v1  (0) 2023.02.21
[Model] ResNet  (0) 2023.02.13
[Deep Learning] GAN(Generative Adversarial Network)이라는 것에 대하여.  (0) 2023.01.09

댓글