2020. 3. 15. 14:38ㆍArtificial Intelligence
*본 포스팅은 Stanford CS231n 강의를 참조하였음을 미리 밝힙니다.
*캡쳐된 일부 강의 자료들은 CS231n에서 제공하는 PPT 슬라이드를 참조하였습니다.
현대 딥러닝의 아쉬운 점 중 하나는 딥러닝의 학습 과정을 딥러닝 코드를 작성한 사람조차 알기가 어렵다는 점입니다.
모델 학습이 성공했다면 왜 성공했는지, 실패했다면 왜 실패했는지를 해석하기가 어려운데, 그 이유는 기본적으로 딥러닝 모델은 많은 데이터를 한꺼번에 처리하며, 여러 겹의 레이어를 학습시키는 과정에서 적어도 수만 가지의 파라미터를 다루어야 하기 때문입니다.
따라서 VIsualize(시각화)를 통해 각각의 레이어에서 무슨 일이 일어나고 있는지, 더 나아가서 학습 전반적이 과정에서 무슨 일이 일어나고 있는지를 연구하려는 여러 시도들이 있고, 이러한 시도들은 비단 딥러닝 뿐 아니라 Data Science등의 여러 컴퓨터 과학 분야에서 다루고 있습니다.
이번 포스팅에서는 앞서 언급한 이 여러 시도들 중 하나인 Saliency Map에 대해서 다루어보려고 합니다.
(Deep Learning Visualization에 대해서는 이어지는 여러 포스팅들에서 차례로 다루려고 합니다.)
Saliency Map
Definition
Saliency는 한글로 '돌출', '요점' 등을 의미합니다.
Saliency Map은 사람이 사물을 인지하는 방법이 Pixelwise하지 않다는 점에서 착안된 방법입니다.
사람은 특정한 사물을 인지할 때, 그것을 왼쪽 위에서부터 오른쪽 아래로 차례로 훑어가면서 바라보지 않고, 눈에 띄는 영역 혹은 객체를 가리키는 '관심영역'을 먼저 인지하여 그 곳에 시선을 집중합니다. 예를 들어 아래의 그림에서 개를 인지 하기 위해서, 왼쪽 위부터 보는 것이 아니라, 눈에 띄는 영역(개가 있는 영역)을 먼저 보는 것처럼 말이죠.
Saliency Map은 이러한 인지 방식을 컴퓨터에 적용해서 Mapping한 것이라고 정의할 수 있습니다.
즉, 화면에서 눈에 띄는 영역, 다른 영역에 비해 픽셀값의 변화가 급격한 부분들을 모아서 매핑하여 결과적으로 관심있는 물체를 관심이 없는 배경으로부터 분리시키는 것을 의미하는 것입니다. (아래 그림의 오른쪽 아래 있는 그림이 강아지 그림을 Saliency Map으로 처리한 결과)
이러한 방법은 이미지에서 가장 중요한 부분을 추출하는데에 드는 비용을 절약할 수 있게 만든다는 장점이 있습니다.
Usage
Saliency Map은 앞서 정의에서 밝힌 것과 같이 이미지에서 중요한 특징 부분들만 모아줄 수 있다는 장점이 있기 때문에,
Object Detection(객체 인식), Scene Classification(장면 분류), Action Recognition(행동 추적)등의 분야에서 사용되고 있습니다.
Principle
Saliency Map은 앞서 말씀드린 바와 같이, 배경에서 중심 물체를 분리하는데 있어서 사람의 시각적 인지 방법과 비슷한 방법을 사용합니다. 즉, 주변(배경)과 비교했을 떄에 눈에 띌 만한 특징들을 보이는 부분들(밝기가 달라지거나, 색깔이 달라지는 등)을 구분하여 객체로 인지하는 것입니다.
예를 들어 위의 사진들 중 돛단배가 있는 사진에서, 파란 하늘과 바다와는 대조적으로 하얀색의 돛단배가 있는 것을 돛단배의 대조되는 색깔과, 밝기 값으로 인지할 수 있는 것입니다.
Saliency Map은 대조되는 색깔, 밝기 값을 픽셀 값을 통해 인지하며, 이미지의 픽셀 값에 급격한 변화가 있는 부분들을 찾아내어 그 부분을 독립된 물체로 인지하게 됩니다.
따라서 이미지의 픽셀 값에 급격한 변화가 있는 부분을 찾아내는 것이 Saliency Map의 주요 과제가 되며, 이는 Gradient Descent(경사 하강법)을 통해 구할 수 있습니다.
자세한 원리는 다음과 같습니다.
이미 답이 알려져 있는 이미지를 잘 훈련된 네트워크에 훈련시켜 Loss를 구합니다.
예를 들어 Label이 전체 10개 (개, 고양이, 원숭이...)인 네트워크가 있다고 가정하면, 잘 훈련된 네트워크(Squeeze Net을 사용하였음.) 고양이 그림을 넣었을 때, 고양이라는 결과를 내놓는 그 고양이 이미지
1. 답이 주어진 이미지를 준비합니다. (X: input image의 픽셀값 (e.g 28 * 28 * 3), y: 해당 이미지의 label)
- 여기서 답이 주어진 이미지라는 의미는 이미 잘 알려진 네트워크에서 올바른 값을 내놓는 (e.g 사용하려 하는 딥 러닝 네트워크에서 '고양이'라는 결과를 내놓는 고양이 그림)이미지를 의미합니다.
2. 이미 훈련된 잘 알려진 딥 러닝 네트워크(Alexnet, SqueezeNet등)를 준비합니다.
- SquezzeNet을 사용하는 이유는, 모델이 가벼우면서 AlexNet과 거의 비슷한 성과를 내는 네트워크이기 때문입니다.
이 네트워크에 1번에서 준비한 이미지를 넣고 Forward Propagation을 통해 Loss를 구한 후 저장합니다.
3. 잘 훈련된 네트워크(2에서 준비한)에 X를 넣고 output을 저장합니다. Output은 Input Image의 Loss Vector를 의미.
- 이때 저장하는 Vector는 [0.91, 0, 0.22, 0.1 ...] 로, 딥 러닝 모델이 '고양이'라는 결과를 내놓기 전에 거치는 Fully Connected Layer의 Vectorized Result를 의미합니다. 실제로 BackPropagation을 할 때에는 '고양이' 라는 label이 아닌 이 Vector를 사용하기 때문입니다.
4. Loss Vector를 Gradient Descent를 통해 Input Image에 pixelwise하게 편미분합니다.
- Tensorflow를 통해 간단하게 편미분을 수행할 수 있습니다.
5. 나타나는 결과의 절댓값을 취하고, 3개의 필터 값(R, G, B)중의 최댓값을 취한 뒤에, 이를 Map으로 변환한다.
- 일반적인 이미지가 갖는 Depth는 3으로 알려져 있습니다. (R, G, B Channel) 따라서 4에서 미분한 결과물도 3개의 Depth로 이루어져 있는데, Saliency map은 이미지에 대해서 2차원이므로, 최댓값과 절댓값을 취하여 강조해줍니다.
이 최댓값들로 이루어진 pixel value들이 Saliency Map이 됩니다.
Code
코드는 CS231n강의의 Assignment3을 바탕으로 작성되었으며, 제 Github Repository에 자세한 코드가 작성되어 있습니다. 아래 링크를 통해 자세한 코드를 확인해 주세요.
https://github.com/sckimynwa/ComputerVision_CS231/tree/master/assignment3
'Artificial Intelligence' 카테고리의 다른 글
Image Style Transfer Using Convolutional Neural Networks (0) | 2020.03.17 |
---|---|
Gradient Ascent (0) | 2020.03.15 |
Anomaly Detection (0) | 2019.02.21 |
Learning Curves (0) | 2019.02.20 |
Dimensionality Reduction - Data Compression & PCA (0) | 2019.02.16 |