일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- dtype
- type hints
- 최대가능도 추정법
- Numpy
- Python 특징
- 카테고리분포 MLE
- groupby
- subplot
- BOXPLOT
- linalg
- Comparisons
- 딥러닝
- 정규분포 MLE
- unstack
- 가능도
- Operation function
- ndarray
- boolean & fancy index
- Array operations
- namedtuple
- Python 유래
- seaborn
- VSCode
- Python
- scatter
- 표집분포
- python 문법
- 부스트캠프 AI테크
- Numpy data I/O
- pivot table
- Today
- Total
또르르's 개발 Story
[33-1] CNN visualization 본문
CNN visualization은 Convolution neural network를 시각화하는 방법입니다.
Visualization은 CNN에서 Debugging tool 역할을 합니다.
일반 debugging으로는 CNN의 구조나 weight들이 복잡하게 되어있어서 무슨 의미인지 잘 모르기 때문입니다.
1️⃣ Visualizing CNN
1) ZFNet
Deconvolution을 이용해서 Visualization을 시도한 2014년 논문입니다.
Low 계층에는 방향성이 있는, 선을 찾는 filter들, block을 찾는기본적인 영상처리 filter 모양을 가지고 있습니다.
High 계층에는 의미가 있는 표현을 학습한다는 것을 알 수 있습니다.
2) filter visualization
AlexNet의 1st conv.layer의 filter은 11 x 11 size의 입력 channel입니다.
1st conv.layer의 filter는 다양한 operation들이 학습되었다는 것을 알 수 있습니다.
또한, Filter visualization에다가 Convolution을 취한 Activation map에서는 영상의 각도에 해당하는 결과나 소소한 detail, 색깔로 경계선을 구분한 결과 등을 알 수 있습니다.
하지만 Mid layer나 High layer의 경우에는 Filter의 차원수가 높아서 직관적으로 Visualization을 하기 어려움이 있습니다.
3) Neural Network Visualization 종류
- Analysis of model behaviors : 모델 자체의 특성을 분석
- Model decision explanation : 하나의 입력 데이터에서부터 모델이 어떤 결론을 내었을 때 어디서 그러한 결론으 도출되었는지 출력을 분석
왼쪽으로 갈수록 model을 이해하기 위한 노력, 오른쪽으로 갈수록 data 결과를 분석하는데 초점을 맞췄습니다.
2️⃣ Analysis of model behaviors
1) Embedding feature analysis
- Nearest neighbors (NN) Search : 질의하고 싶은 query data를 DB에 저장되어있는 사진들과 비교해서 찾는 방법, 검색을 통해 유사한 사진들을 찾아냅니다.
빨간색 부분을 통해 similar한 concept을 가진 사진들끼리 clustering되어 있다는 것을 알 수 있습니다.
파란색 부분은 강아지 모양이 다른 위치에 있음에도 불구하고 같은 강아지의 사진이 골라진 것을 알 수 있습니다. 즉, 학습된 feature가 물체의 위치변화에 강인하게, 대신에 concept을 잘 학습했다는 것을 알 수 있습니다.
query 영상을 넣으면 query 영상이 들어간 feature와 거리가 가까운 feature들의 영상을 return해주면 주변 사진을 분석할 수 있습니다.
2) Dimensionality reduction
Backbone network를 활용해서 feature를 추출하게되면 고차원 feature vector가 나오게 됩니다.
이러한 고차원 feature vector는 해석하기 어렵다는 단점이 있습니다.
따라서 아래와 같은 차원 축소를 통해 눈으로 쉽게 확인 가능하게 만들어줍니다.
- t-distributed stochastic neighbor embedding (t-SNE)
0-9까지 들어있는 MNIST들의 feature들을 추출한 값입니다.
비슷한 class들끼리 분포가 잘되어있는 것을 알 수 있습니다.
여기서 3(연두), 5(하늘), 8(보라) 는 형태가 비슷하기 때문에 cluster가 비슷한 곳에 분포되어 있는 것을 알 수 있습니다.
3) Activation investigation
또한, 각 layer의 channel들의 hidden node이 어떤 역할을 하는지 visualization할 수 있습니다. (계단, 난간, 얼굴 등 일정한 특징을 찾아냄)
Mid에 있는 channel 정보를 가지고 오기 위해서는 Mid channel에 있는 activation map을 추출합니다.
이후, 추출된 Activation map에서 가장 큰 값을 가지는 위치를 저장하고, 그 위치의 입력 도메인의 receptive field 부분을 가지고 오게되면 아래와 같이 특정부분이 나오게 됩니다. 그렇다면 이 hidden layer가 원본 image에서 어떤 부분을 주의깊게 살펴보는지를 알 수 있습니다.
4) Class Visulization
Data를 가지고 visualization하는 것이 아닌 모델에 저장된 Class 자체에서 visualization하는 방법입니다.
여기서는 Gradient Ascent 개념을 사용하는데 합성 영상을 만들기 위해서 Loss를 만들어줍니다.
일단, 두 개의 Loss를 합성해서 사용합니다.
- $I$ : 입력 영상
- $f$ : CNN 모델
- $f_{dog} (I)$ : dog 관련 score만 출력하는 부분
- $argmax f_{dog} (I)$ : dog 관련 score가 최대가 되는 $I$의 값
- $Reg(I)$ : Regularzation(정규화) 부분
따라서 $Reg(I)$는 다음과 같이 사용합니다.
제곱이 붙었기 때문에 $argmax$를 구할 때 $I$의 크기가 0이 될수록 유리해집니다. (그러면 $argmax$값이 커짐)
원래 Loss는 최소값($argmin$)을 구하지만, 여기서는 argmax를 구하기 때문에 gradient ascent라는 개념으로 사용합니다.
순서는 다음과 같습니다.
(1) 빈 image 또는 random값으로 초기화된 image를 넣어서 최종 prediction score을 받아옵니다.
(2) Backpropagation을 통해서 입력단의 gradient를 구합니다. 따라서 입력이 어떻게 변해야지 이 target class score가 높아지는지를 찾습니다. 즉, target score를 높이는 방향으로 빈 image를 update해줍니다.
그래서 Loss를 측정할 때, Score값에 마이너스를 붙여서 내려가는 방향으로 만들어놓고 gradient를 계산하면 이전 neural network에서 학습했던 gradient descent 알고리즘을 그대로 사용할 수 있습니다.
(3) image를 update해줍니다.
(4) 이 update 과정을 가지고 (1)을 다시 반복합니다.
(5) 이 과정을 여러번 반복하게 되면 target class에 들어있던 이미지의 형태를 구할 수 있습니다.
Gradient descent는 현재 영상을 어떤식으로 update할지 local search하기 때문에 조금조금씩 변화를 주면서 이 score를 올리는 방법을 찾습니다. 이 말을 바꿔서 이야기하면 초기값을 어떻게 설정하냐에 따라서 다양한 결과를 얻어볼 수 있습니다.
3️⃣ Model decision explanation
Model이 어떤 특정 각도로 영상을 바라보고 있는지에 대해 해석하는 방법입니다.
1) Occlusion map
영상이 주어졌을 때, 영상이 제대로 판정되기 위한 각 영역의 중요도를 추출하는 방법입니다.
아래 사진과 같이 코끼리 사진을 넣어줬을 때 A라는 큰 패치를 이용해서 Occlusion으로 가려줍니다.
따라서 model이 이 사진을 코끼리라고 인식할 확률을 구하는 것입니다.
따라서 영상에서 Occlusion으로 어떤 위치를 가려주냐에따라 확률이 바뀌게 됩니다.
물체의 중요한 부분을 가리게 되면 Score가 많이 떨어지고, 물체와 상관없는 배경 부분을 가리게 되면 Score가 적게 떨어집니다.
따라서 Occlusion 패치를 다양한 부분에 가려본 후, 패치의 위치에 따라 변하는 지도를 그릴 수 있습니다.
위 Heatmap에서 보이듯이 검정색 부분은 물체의 검출에 민감한 부분이고, 밝은 부분은 별로 상관없는 부분이라는 것을 알 수 있습니다.
2) via Backpropagation
앞서보였던 gradient ascent를 이용해서 특정 image를 classification한 후, 최종 결론이 나온 class에 결정적으로 영향을 미친 부분이 어디인지를 heatmap 형태로 나타내는 기법입니다.
이 사진에서는 흰색 부분이 물체 검출에 민감한 부분이고, Model이 흰색 부분을 보고 최종 score를 결정합니다.
구하는 순서는 다음과 같습니다.
(1) 강아지 사진을 넣게되면 해당 Class의 score가 나오게 됩니다.
(2) Backpropagation을 입력 domain까지 계산해서 구합니다. 이렇게 얻어진 gradient에 절대값(또는 제곱)을 취해줍니다. 그리고 구한 값을 이미지 형태로 출력합니다.
여기서 gradient에 제곱이나 절대값을 취해주는 이유가 gradient의 크기 자체가 중요한 정보이기 때문에, 입력에서 gradient가 큰 부분이 바껴야 score가 크게 바뀐다는 의미입니다. 즉, gradient가 큰 부분은 민감한 부분이라는 것을 의미합니다. 따라서 부호보다는 크기가 더 중요해서 gradient에 제곱이나 절대값을 취해줍니다.
(3) 다시 (1)부터 반복합니다.
3) Rectified unit (backward pass)
- Saliency Map
일반적으로 CNN에서는 ReLU가 많이 사용되는데 ReLU를 사용할 때 forward pass에서 음수가 나온 부분을 0으로 masking해 가려줍니다. 이런 masking pattern을 저장해놓았다가 Backpropagation을 수행할 때 양수와 음수가 합쳐진 gradient가 오게 되면, 음수 mask로 저장되어있던 masking pattern으로 masking을 해줍니다(오른쪽 Backward pass에서 빨간색이 masking pattern이며, backpropagation이 왔을 때 빨간색 모양대로 '0'처리).
- Deconvolution (Zeiler et al)
Foward 시의 ReLU pattern을 사용하는 것이 아니라 Deconvolution된 activation이 backward되어서 내려올 때 (오른쪽 Backward pass : "deconvnet") 양수와 음수 값을 따져서 activation의 음수값을 masking을 합니다.
이것을 수식으로 나타내면 다음과 같습니다.
첫번째 수식 $h^{l+1} = max(0, h^{l)}$은 ReLU가 적용된 모습입니다.
두번째 수식 $\frac {\partial L} {\partial h^{l}} = [(h^{l} > 0) \frac {\partial L} {\partial h^{l+1}}]$은 ReLU부분 $[(h^{l} >0)]$ 을 그대로 사용해서 곱해서 사용했습니다.
세번째 수식 $\frac {\partial L} {\partial h^{l}} = [(h^{l+1} > 0) \frac {\partial L} {\partial h^{l+1}}]$에서는 상위의 Actiation의 ReLU를 적용한 mask $[(h^{l+1} >0)]$를 사용해서 곱해서 사용했습니다.
두 개의 Backward pass 과정을 섞어서 사용하면 다음과 같습니다.
이 과정을 Guided backpropagation이라고 합니다.
Guided backpropagation을 사용하면 Backpropagation이나 Deconvolution을 수행한 것보다 훨씬 직관적으로 잘 나오는 것을 알 수 있습니다.
두 mask를 모두 사용한 것이 (1) Foward를 할 때도 결과에 긍정적인 영향을 미친 양수들을 참조하고, (2) Backward를 할 때도 gradient를 통해서 더 강화하는 방향으로 움직이는 Activation을 고른 것입니다.
그래서 위 두개의 조건들을 모두 만족하는 Activation들이 Guided backpropagation에 나탄나는 것입니다.
4) CAM (Class activation mapping)
CAM은 사용하게되면 어떤 부분을 참조해서 어떤 결과가 나왔는지 보기 좋은 heatmap 형태로 표현해줍니다.
CAM은 CNN에서 마지막으로 나온 Convolution Feature map을 FC layer를 바로 통과하지 않고 Global average pooling(GAP) layer를 통과하도록 바꿔주어야 합니다. 그 다음에 FC layer를 하나만 통과하여 classification을 수행합니다.
수식은 다음과 같습니다.
- $c$ : 하나의 Class
- $S_{c}$ : 하나의 Class에 대한 score
- $W^{c}_{k}$ : 마지막 FC layer의 Class에 해당하는 weight들
- $F_{k}$ : 마지막의 GAP feature
- $k$ : channel 수
$\sum_{k}w^{c}_{k}F_{k}$ : 각각의 공간축에 평균값을 낸 부분
각각의 feature vector들의 element들의 $W$가 linear combination으로 곱해져서 최종 $S_{c}$를 만듭니다.
여기서 GAP feature $F_{k} = \sum_{(x,y)} f_{k}(x,y)$를 나타내는데 모든 pixel $(x,y)$에 대해서 convolution feature map $f_{k}(x,y)$를 각 channel $k$마다 평균을 취한 것입니다.
$S_{c}$를 구하는 수식은 모두 선형이기 때문에 순서를 바꿔줄 수 있습니다. ($\sum$의 위치 바꿈)
아래의 빨간색 box 부분을 CAM이라고 부릅니다.
CAM은 Global average pooling $\sum_{(x,y)}$을 아직 적용하기 전이기 때문에 "공간에 대한 정보"가 남아있게 됩니다.
그래서 영상처럼 visualization을 수행하면 아래와 같은 형태가 나오게 됩니다.
Class Activation Map (CAM)은 어떤 부분을 참조했는지 결과가 눈에 보이게 됩니다.
CAM이 놀라운 이유가 어떤 물체에 대한 위치 정보를 주지 않았는데도 단순한 영상 인식기를 학습을 해서 위치를 파악할 수 있다는 점입니다.
다만 CAM이 적용이 가능한 제약으로는 마지막 layer 구성이 FC layer로 만들어져야한다는 것이 단점입니다.
아래와 같이 FC layer로 구조를 변경한 후에 사용이 가능합니다.
다만 GoogLeNet이나 ResNet의 구조에서는 마지막에 Global average pooling이 들어가기 때문에 CAM을 활용하기에 유용한 구조입니다. 즉, 구조를 수정하지 않고 CAM을 추출하는 것이 가능합니다.
5) Grad-CAM
Model의 구조를 변경하지 않고 pre-trained된 Model에서 CAM을 뽑아낼 수 있는 방법입니다.
Grad-CAM은 기존 pre-trained된 network를 변경하지 않고 구할 수 있기 떄문에 꼭 영상 인식 task에 국한될 필요가 없습니다. 어떤 task던지 backbone이 CNN이기만 하면 사용할 수 있습니다.
이전에는 입력영상까지 Backpropagation을 수행했지만, 이번에는 우리가 관심을 가지고 있는 Activation map까지만 backpropagation을 수행합니다.
- $y^{c}$ : 현재 task에서 해석하고 싶은 결과 (class에 대한 score)
- $A^{k}_{ij}$ : 마지막 conv layer의 k번째 feature map
- $\frac {\partial y^{c}} {\partial A^{k}_{ij}}$ : backprogagation의 gradients
- $Z$ : $i \times j$ 크기의 모든 pixel 수 (receptive field의 크기)
- $\frac {1} {Z} \sum_{i} \sum_{j}$ : Global average pooling
따라서 각 channel $c$의 gradient 성분의 크기 $\alpha^{c}_{k}$를 구합니다.
그리고 이 $\alpha$를 activation map을 결합하기 위한 성분으로 사용합니다.
즉, A가 마지막 fully connected layer의 feature map인데 '사람' class를 검출하는 과정이라면
A heatmap의 어떤 pixel 값을 높게 줬더니 '사람' class의 score 값 (y)이 크게 향상 된 경우(변화율 증가) -> 그곳에 사람이 있다고 생각되서 alpha 값을 크게주고
A heatmap의 어떤 pixel 값을 높게 줬더니 '사람' class의 score 값 (y)이 낮게 향상 된 경우(변화율 감소) -> 그곳에 사람이 없다고 생각되서 alpha 값을 낮게 줍니다.
그리고는 ReLU를 사용해서 선형 결합을 하게 됩니다. 이때, ReLU를 사용했기 떄문에 양수값만 사용하게 됩니다.
여기서 A heatmap의 $\alpha$를 계수로 사용해, "$alpha$값이 강한 곳 * 물체 위치 (A feature map에서 강하게 나온 값)"은 강한색으로 나타냅니다.
따라서 Grad-CAM은 Image Classification, Image Captioning, Visual Question Answering 모든 부분에 사용이 가능합니다. BackBone model만 CNN이면 됩니다.
여기서 Guided Backpropagation과 Grad-CAM 방법을 결합해서 사용할 수 있습니다.
Grad-CAM은 smooth한 특성을 가지고 있고, Guided Backprop은 sharp한 특성(class에 대한 구분성)을 가지고 있기 떄문에 두 개를 곱해서 좀 더 sensitive한 Guided Grad-CAM이 나올 수 있습니다.
'부스트캠프 AI 테크 U stage > 이론' 카테고리의 다른 글
[34-1] Conditional generative model (0) | 2021.03.11 |
---|---|
[34] Instance/Panoptic segmentation (0) | 2021.03.11 |
[33] Object detection (0) | 2021.03.10 |
[32-1] Semantic Segmentation (0) | 2021.03.09 |
[32] Image Classification (2) (0) | 2021.03.09 |