CBAM: Convolutional Block Attention Module

Tags
Model Architecture
Attention
Created
2021/01/31 08:52
Publication
ECCV'18
Rate
2.5
Source
https://arxiv.org/abs/1807.06521
Summary
(상세 페이지 참고)

Reference

Bottleneck Attention Module: https://arxiv.org/abs/1807.06514
우리는 무언가를 눈으로 보고 식별할 때, 시야에 있는 모든 공간에 집중하지 않는다. 사람을 알아볼 때는 넓게는 사람의 실루엣, 좁게는 사람의 얼굴에 집중할 것이고, 사물을 알아볼 때도 그 사물의 차별적인 주요 지점에 집중할 것이다. 신경망이 이렇게 주어진 정보에서 도움이 되는 특정 정보에 집중하도록 하는 테크닉을 폭넓게 attention이라 부른다. 원래는 NLP 분야에서 고안되고 발전되어 온 테크닉인데, vision 분야에도 종종 쓰인다고 한다.
특히나 BAM은 이전의 task-specific하고 computation overhead가 컸던 vision 분야의 attention 알고리즘에 비해 1) module식으로 어떤 CNN에도 갖다붙이기 쉽고 2) computation overhead가 거의 없는 효율적인 attention 알고리즘을 제안한다. 놀랍게도 (KAIST에서) 한국인들이 쓴 페이퍼이다.

BAM (Bottleneck Attention Module)

이전의 attention 알고리즘들은 3D attention map을 형성하여 사용했지만, BAM에서는 효율성을 위해 이를 decompose하여 spatial attention map(이미지의 어떤 지점에 집중할 것인가?)과 channel attention map(이미지의 어떤 특징에 집중할 것인가?)을 따로 형성한 뒤 이 둘을 concatenate하여 attetion map을 형성한다.

Channel Attention Branch

Channel attention branch는 feature map FRC×H×WF \in R^{C \times H \times W}를 입력받아 attention map FcRC×1×1F_c \in R^{C \times 1 \times 1}을 출력한다. 그 과정은 다음과 같다.
FF에 GAP(Global Average Pooling)을 가하여 채널별 feature map을 aggregate한다.
두 번의(CC/rCC \rightarrow C/r \rightarrow C) fully connected layer 연산을 거친다.
Scale alignment를 위해 Batch Normalization 연산을 거친다.
이 때 rr은 계산의 효율을 위한 reduction ratio이다. 식으로 표현하면 다음과 같다.
Mc(F)=BN(W1(W0AvgPool(F)+b0)+b1)M_c(F) = BN(W_1(W_0 \text{AvgPool}(F) + b_0) + b_1)

Spatial Attention Branch

Spatial attention branch는 feature map FRC×H×WF \in R^{C \times H \times W}를 입력받아 attention map FsR1×H×WF_s \in R^{1 \times H \times W}를 출력한다. 그 과정은 다음과 같다.
FF1×11 \times 1 convolution 연산(CC/rC \rightarrow C/r)을 가한다.
두 번의 3×33 \times 3 dilated convolution 연산을 거친다.
다시 convolution 연산(C/r1C/r \rightarrow 1)을 거친다.
마지막으로 역시 scale alignment를 위해 Batch Normalization 연산을 거친다.
역시 rr은 위와 동일한 reduction ratio이며, 추가적으로 dilation에 대한 하이퍼파라미터를 가진다. 식으로 표현하면 다음과 같다.
Ms(F)=BN(f31×1(f23×3(f13×3(f01×1(F)))))M_s(F) = BN(f_3^{1 \times 1}(f_2^{3 \times 3}(f_1^{3 \times 3}(f_0^{1 \times 1}(F)))))
이제 두 attention map Fc,FsF_c, F_s가 있다. 페이퍼에서는 이 두 attention map을 element-wise summation로 결합한다. 이렇게 결합된 attention map를 통해 원래의 feature map FF를 element-wise multiplication으로 보정하고, 이를 다시 feature map FF에 더함으로써 BAM module은 자신의 일을 마친다. 도식화하면 다음과 같다.
FF+Fσ(Mc(F)+Ms(F))F \rightarrow F + F \otimes \sigma{( M_c(F) + M_s(F) )}

CBAM (Convolutional BAM)

CBAM은 attention map을 얻어내는 방식을 다소 수정하여 BAM보다 높은 성능을 끌어낸 attention 알고리즘이다. 개념적인 부분은 BAM과 같고, 다음과 같은 부분이 다소 다르다.
Attention map을 얻어내는 데 average pooling뿐 아니라 max pooling도 함께 동원한다.
또한 위와 같은 pooling을 channel attention뿐 아니라 spatial attention을 얻는 데에도 활용한다.
BAM이 두 attention branch를 병렬배치한 것에 비해, CBAM은 이 두 branch를 직렬배치한다.

Channel Attention Branch

마찬가지로 channel attention branch는 feature map FRC×H×WF \in R^{C \times H \times W}를 입력받아 attention map FcRC×1×1F_c \in R^{C \times 1 \times 1}을 출력한다. 이 때, 페이퍼에서는 average pooling으로 얻어낼 수 있는 공간적 정보와 max pooling으로 얻어낼 수 있는 공간적 정보를 모두 활용하고자 한다.
각각 average pooling, max pooling을 이용하여 Fcavg,FcmaxF_c^{avg}, F_c^{max}를 얻어낸다.
위의 두 FcF_c에 대해 BAM과 동일한 구조의 MLP(Multi-Layer Perceptron) 연산을 거친다. 이 때 두 attention map에 적용되는 MLP는 구조뿐 아니라 parameter 역시 공유한다.
두 attention map을 더한 후 sigmoid 연산을 거쳐 최종적인 channel attention map을 얻는다.
식으로 표현하면 다음과 같다. (페이퍼의 식이랑은 조금 다른데, 언급하지 않은 bias를 포함하였고, 언급되었는데 식에 포함되지 않은 ReLU를 포함한다. 공식 repository를 봐도 bias = False 같은 옵션은 없으니 이렇게 구현되어있는 듯하다.)
Mc(F)=σ(W1(ReLU(W0Fcavg+b0))+W1(ReLU(W0Fcmax+b0))+2b1)M_c(F) = \sigma{( W_1(\text{ReLU}(W_0 F_c^{avg} + b_0)) + W_1(\text{ReLU}(W_0 F_c^{max} + b_0)) + 2 b_1 )}

Spatial Attention Branch

역시 마찬가지로 spatial attention branch는 feature map FRC×H×WF \in R^{C \times H \times W}를 입력받아 attention map Fs1×H×WF_s^{1 \times H \times W}를 출력한다. 다만 BAM과 달리 average pooling과 max pooling을 활용한다.
각각 average pooling, max pooling을 이용하여 Fsavg,FsmaxF_s^{avg}, F_s^{max}를 얻어낸다.
두 attention map을 concatenate한 후 7×77 \times 7 convolution 연산을 거친다.
Sigmoid activation을 통해 최종적인 spatial attention map을 얻는다.
식으로 표현하면 다음과 같다.
Ms(F)=σ(f7×7([Fsavg;Fsmax]))M_s(F) = \sigma{( f^{7 \times 7}{([ F_s^{avg}; F_s^{max} ])} )}
또 페이퍼에서는 이러한 두 attention branch의 배치에 대한 실험을 가하는데, 병렬 배치보다 직렬 배치가 더 효율적임을 발견했고, 더하여 spatial branch보다 channel branch가 먼저 배치되는 것이 (약간) 더 효율적임을 발견한다. 각 branch는 입력 feature map FF에 attention을 곱하여 보정한 feature map을 출력한다. 이에 전체적인 모듈을 다음과 같이 도식화할 수 있다.
F=Mc(F)FF=Ms(F)FFF+FF' = M_c(F) \otimes F \\ F'' = M_s(F') \otimes F' \\ F \rightarrow F + F''
다양한 benchmark를 통해 이러한 attention map을 통해 네트워크의 성능을 보다 효율적으로 제고할 수 있음이 증명되었다. 또한 Grad-CAM을 통해 확인한 결과, 이러한 attention map이 실제로 모델이 보다 적절한 구간에 집중하도록 돕는다는 것을 확인할 수 있었다... 하지만 내가 직접 적용해보았을 때는, 큰 효과가 없었다. 안타까운 일이다.
E.O.D.