해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
오태현 교수님 - Object Detection
1) Object Detection
Object Detection은 객체의 위치와 클래스를 검출하는 방법입니다. 기존의 Semantic Segmentation의 경우, 사람이 어깨동무했을 때, 같은 클래스라고 인식해서 인스턴스끼리 분리가 안되지만 Object detection은 분리가 가능합니다. 보통 주어진 인스턴스에 대한 클래스정보와 바운딩 박스의 4개 점들이 포함되어 있습니다. 이 방법은 주로 자율주행, OCR에 사용하고 있고 많은 회사들에서 발전시키려고 노력하는 기술 중 하나입니다. Object Detection에는 대표적으로 Two-stage detector, Single-stage detector가 존재합니다.
2) Two-stage detector
Two-stage detector에는 가장 처음 나왔던 R-CNN 모델이 있습니다. R-CNN은 객체 탐지를 위해서 input image에 대해서 Selective Search를 통해서 관심 영역(약 2000개)을 추출합니다. 그렇게 얻어진 영역들을 미리 학습된 CNN에 넣어서 SVM 선형 분류기를 통해서 분류하는 형태입니다. 그렇지만 이 방법은 관심 영역들을 하나씩 모델을 넣어서 확인해야 하기에 속도가 느리고, Selective Search를 사용해서 이 부분에 대해서는 학습이 되지 않는 단점이 있습니다.
그래서 다음으로 Fast R-CNN이 나왔습니다. 이 방법은 입력사이즈를 따로 warping해서 각각 CNN을 넣어주지 않고 영상 전체에 대한 Feature들을 한번에 추출하고 이를 재활용해서 여러 object를 detection하게 했습니다. 하지만, 역시 Region Proposal을 위해 여전히 Selective Search 방법을 사용했습니다. 이 방법을 보완하기 위해 Faster R-CNN이 등장했습니다. 여기서는 Region Proposal을 CNN 기반으로 변경하여 학습할 수 있는 형태를 가지게 되었습니다.
Object Detection에서 영역에 대한 metric인 IoU(Intersection over Union)이 제안되었는데, 이 방법은 GT와 prediction 값이 겹치는 영역을 GT와 예측한 Prediction 값의 합집합 영역으로 나눠주는 방식입니다. Faster R-CNN에서는 Anchor Box가 도입되었는 데, Anchor Box는 주어진 픽셀에 대해 미리 정해놓은 여러가지 형태의 바운딩 박스들을 이야기 합니다. 그래서 IoU의 값을 기준으로 해당 영역이 positive sample인지 negative sample인지 정하게 됩니다.
Faster R-CNN은 가장 먼저 주어진 이미지에 대한 Feature map을 뽑아낸 뒤 Region Proposal Network를 통해서 Region Proposal을 제안하고, ROI pooling을 해서 분류하는 방식으로 진행합니다. 여기서는 anchor box를 최종적으로 사용하지 않고 RPN에서 regression layer에서 4개의 좌표를 새로 지정합니다. 이렇게 다시 지정하는 것은 anchor box는 대략적인 위치라서 더 좋은 것으로 선별하기 위한 과정입니다. 이렇게 anchor box를 효과적으로 필터링하는 작업인 NMS(non-Maximum Suppression)이 존재합니다.
3) Single-stage vs Two-stage
지금까지 Two-stage 방식에 대해 알아봤는데, Single-stage와 다른 차이는 가장 큰 것은 ROI pooling을 사용하지 않아서 two-stage에 비해 빠른 속도를 얻을 수 있습니다.
4) Single-stage
Single-stage에는 대표적으로 YOLO(you only look once)라는 방법이 존재합니다. 작동원리는 input을 s*s개의 grid로 나눠줍니다. 각 grid는 어떤 클래스인지 확인하고, 바운딩 박스를 찾으면서 해당 바운딩 박스가 필요한지를 확인하는 confidence도 얻습니다. 이렇게 얻어진 bounding box에서 좋은 box를 얻기 위해 NMS 알고리즘을 사용합니다. YOLO는 그리드가 정해져있어서 더 적절한 바운딩 박스를 찾기 위해 SSD(Single Shot MultiBox Detector)를 사용합니다. 이 방법은 그리드를 다양하게 얻어서 다양한 Feature map을 활용하는 방법입니다.
5) Focal loss
일반적인 영상에서는 실제 물체 영역보다 배경 영역이 넓은데, 이럴 때 발생하는 문제 중 하나는 일정 기준을 넘는 positive sample이 negative sample에 비해 훨씬 작다는 것입니다. 이러한 현상을 class imbalance라고 부르는데 주로 Single-stage detector에서 발생합니다. 이 현상을 해결하기 위해 제안된 방법이 Focal loss입니다. Focal loss는 분류하지 못한 영역에 대해서 큰 weight를 부여하는 방법입니다. 이러한 방법으로 학습을 망치지 않도록 방지할 수 있습니다. Focal loss는 처음으로 Retinanet에서 제안되었습니다.
Retinanet은 U-net과 유사한 형태의 Feature Pyramid Networks가 추가된 방법입니다. (추가적인 내용은 추후 추가하겠습니다ㅠㅠ)
6) Object Detection을 위한 발전
위에서 언급한 One-stage, Two-stage 이외에도 Transformer를 사용한 방법도 존재합니다. NLP에서 적용되던 Transformer를 computer Vision 분야에도 적용하게 되었습니다. ViT, DeiT, DETR 등 다양하게 적용했습니다. 또한 bounding box외에도 CornerNet, CenterNet 등으로도 발전해왔습니다. 이 내용은 다음에 적도록 하겠습니다.
오태현 교수님 - Visualizing CNN
CNN은 흔히 복잡한 연산이 포함되어 있어서 보통 블랙박스라고 표현하는 경우가 많습니다. 안에서는 어떤 동작에 의해 feature들을 학습하고, 왜 잘 되는지, 어떻게 해야 잘 학습할 수 있는 지를 알 수 있는 방법이 Visualizing입니다. 그럼 어떻게 Visualizing할 수 있을까요?
1) ZFNet
처음으로 Visualizing방법을 사용한 논문이였습니다. 논문에서는 Visualizing을 적용해서 모델의 parameter를 조정해서 더 좋은 결과를 얻어낼 수 있음을 보여줬습니다. Low level에서는 방향성이 있는 필터(원, 선)를 파악하는 데 용이했고, High level로 갈수록 사진의 특징을 볼 수 있습니다.
이처럼 Neural Network하는 방법에는 크게 모델 특성을 분석하는 방법과 모델의 결과를 확인하는 방법을 통해서 visualizing 할 수 있습니다. 모델의 특성을 분석하는 방법에는 Parameter examination(Filter visualization, Factorization lens), Featrue analysis(t-SNE, Gradient ascent)이 있습니다. 모델의 결과를 확인해서 분석하는 방법에는 Sentivity analysis(Saliency map, GradCAM), Decomposition(DeepLIFT, LRP) 방법이 있습니다.
2) Analysis of model behaviors
가장 먼저, Embedding feature analysis로 High level의 feature들을 분석하는 방법입니다. Nearest neighbors(NN)로 Query image와 가장 가까이 있는 이미지들을 찾아내는 방법입니다. embedding feature들은 pixel-wise 비교의 한계를 가지고 있지 않습니다. 강아지가 서 있는 query를 줬음에도 앉아있는 강아지가 나오는 것처럼 강아지의 특성을 잘 학습한 것을 알 수 있습니다.
두 번째로는 t-SNE(t-distributed stochastic neighbor embedding) 방법이 존재합니다. 이 방법은 차원을 축소해서 고차원의 형태를 저차원으로 만들어서 알아보기 쉽도록 바꾸는 방법입니다. 위의 그림은 MNIST 데이터를 저차원으로 만들어서 표현한 것인데, 3, 5, 8이 가운데에 몰려있는 것을 보실 수 있습니다. 이런식으로 데이터의 유사도를 대략적으로 판단할 수 있는 방법입니다.
다음으로는 Mid, High level을 해석하기 위해 Layer의 activation을 분석해서 특성을 파악하는 방법입니다. 위의 사진은 AlexNet에서 적당한 값으로 thresholding을 해서 mask를 생성한 화면입니다. conv5 Layer에서 138번 채널은 얼굴부분을 확인하는 특징을 갖는다는 것을 알 수 있고, 아래 부분에 있는 53번 채널의 경우에는 계단을 찾는다는 것을 확인할 수 있습니다.
비슷하게 Maximally activating patches는 중간계층을 확인하는 데 적합한 방법입니다. 위 사진의 patch들은 각 사진에서 채널이 하는 일을 파악하기 위해서 Hidden node들에서 가장 높은 값을 갖는 근방의 patch들입니다. 그 이야기는 위에서 보는 patch 부분이 해당 채널이 주의 깊게 확인하는 특성들이 포함하고 있다는 것입니다. 그래서 첫번째 줄은 원형을 detect하는 채널이 될 것입니다.
세 번째로는 Class visualization(Gradient ascent)방법이 있습니다. 이 방법은 따로 예제 데이터를 사용하지 않고 네트워크가 기억하고 있는 이미지가 어떤 것인지 분석하는 방법입니다. 또한 학습에 사용된 데이터셋이 편향이 있는 지도 확인할 수 있는 방법이기도 합니다. dog에 대한 클래스를 보시면 사람의 모습이 포함된 것을 확인하실 수 있습니다. 이것처럼 강아지랑 사람이 찍힌 사진이 많이 학습되었다는 것들도 확인할 수 있습니다. Gradient descent 같은 방법으로 합성영상을 얻을 수 있습니다.
$$I^{*} = \underset{I}{argmax} (f(I) - \lambda ||I||_{2}) $$
위에서 $f(I)$는 CNN으로 출력된 score를 최대화하는 방식입니다. $I$는 input image입니다. Regularization term은 앞의 term이 해석가능한 숫자를 넘어가는 것을 막기 위한 방법으로 사용됩니다. 그래서 위의 식에 음수를 붙여서 최소화하는 방향으로 학습을 진행하게 되면, dummy image나 blank image를 넣어주고 특정 class의 값을 구하고, 이를 입력단까지 backpropagation을 통해서 target score가 높아지는 방향으로 input 이미지에 더해줍니다. 이런 방식으로 여러번 학습하게 되면 위의 그림처럼 몽환적인 영상을 확인할 수 있습니다.
3) Model decision explanation
이번에는 모델의 결과를 보고 어떻게 모델이 결정을 했는 지를 확인하는 방법입니다. Saliency map을 설명하기 위해서 먼저 Occlusion map을 알아봐야 합니다.
Occlusion은 위의 그림처럼 사진의 일부를 가리는 역할을 합니다. 그래서 가렸을 때의 확률을 통해서 어떤 부분이 Network가 중요하게 생각하는 부분인지를 확인할 수 있습니다. 우측의 히트맵을 보면 빨간색 부분이 가장 중요한 부분인 것을 알 수 있습니다.
위에서 보이는 backpropagation 과 deconvnet을 두개를 합쳐서 사용하면, 아래 그림의 가장 우측처럼 깔끔한 화면을 확인할 수 있습니다.
Guided backprop 외에도 다양한 방법의 visualization이 존재합니다.
Class activation mapping(CAM) 방법은 가장 많이 사용되는 방법으로 위의 그림처럼 사진의 일부를 히트맵 형태로 확인할 수 있어서, 모델이 어떤 부분을 주로 보고 클래스를 정하게 되었는 지를 확인이 가능합니다.
기본적으로 $F_{k}$는 Global average pooling에 의해 공간축으로 평균값을 낸 노드들입니다. 원래대로는 $F_{k}$와 각각 클래스에 대한 $w_{k}^{c}$를 곱해서 더한 값이 클래스에 대한 score($S_{c}$)가 됩니다. Global average pooling하기 전에는 공간정보를 가지고 있기 때문에, 공간 정보를 가진 feature map $f_{k}(x, y)$를 $w_{k}^{c}$를 먼저 곱하게 되면 아래 그림처럼 각 feature map이 나타내는 부분이 어디인지를 확인할 수 있습니다.
이렇게 하면 특별한 위치정보를 주지 않아도 어느 위치에 어떤 클래스가 존재하는 지 확인할 수 있게 됩니다. 그렇지만 이 방법은 대부분의 architecture들에 대해서 재학습을 시켜줘야 합니다. ResNet과 GoogLeNet은 이미 GAP Layer가 존재하기 때문에 재학습없이도 사용이 가능합니다.
이렇게 재사용의 불편함을 줄여주는 방법으로 Grad-CAM이라는 방법이 제안되었습니다. 위에서 언급했던 CAM에서 weight 값을 따로 구해줘야 하는 데, Grad-CAM에서는 $y^{c}$는 class에 대한 score로부터 feature map인 $A$까지 gradient를 보내서 얻은 값을 Global average pooling으로 새로운 weight $\alpha_{k}^{c}$를 구할 수 있습니다. 기존의 CAM방법과 다르게 Grad-CAM에서는 RELU function을 적용해서 양수 값만 사용합니다.
그래서 위의 그림처럼 다양한 Task의 네트워크가 뒤에 붙어도 재학습하지 않아도 Visualization이 가능합니다. 물론, input 이미지가 들어가는 backbone 네트워크는 CNN 형태를 가져야 합니다. 또한 위에서 설명한 Grad-CAM과 Guided Backprop을 곱해서 더 좋은 Feature를 볼 수 있는 Guided Grad-CAM도 구할 수 있습니다.
Grad-CAM을 개선해서 SCOUTER라는 것을 만들었는 데, 여기서는 왜 7이 1이 아닌지, 2가 아닌지에 대해서도 확인할 수 있습니다.
위의 그림처럼 생성모델도 어떤 노드가 어디 부분을 생성하는지 해석이 가능해서 문을 추가하는 방식으로 응용도 가능합니다. 이처럼 다양한 면에서 Visualization 기술이 사용될 수 있습니다.