히비스서커스의 블로그

[CS231n 12] Visualizing and Understanding 본문

Theory/Computer Vision

[CS231n 12] Visualizing and Understanding

HibisCircus 2021. 9. 11. 01:34
728x90

 내용들은 전적으로 stanford university의 CS231n 2017 12강 강의 내용을 기반으로 작성하였음을 먼저 밝힙니다.

앞선 강의 내용의 대부분의 내용들은 CNN에 입력으로 이미지가 들어가고 출력값은 Class score나 BBox, lebeled pixels 등 다양한 결과들로 나타나게 할 수 있다. 그렇다면 CNN안의 내부에서는 어떤 일들이 일어나는지 알아보자.

 

1. 레이어에서 시각화

첫 번째 layer 먼저 살펴보자

 

Alexnet 첫번째 Conv의 결과로는 3X11X11 feature map이 나오게 되며  필터의 가중치와 입력 이미지의 내적을 통해 구해진다. feature map을 시각화 시키는 것으로 필터들이 무엇을 찾는지를 알 수 있는데 보통 엣지나 보색 등을 찾아낸다. 첫번째 레이어는 이미지와 가장 가까운 곳에 접하기 때문에 이미지의 특징을 잡아내는데 유리하다.

 

 

다음으로 중간 레이어들을 살펴보자

 

중간레이어들을 살펴보면 이들은 대게 첫번째 feature map의 특징들에서 한 번 더 특징들을 뽑아내는 것이기에 그럴듯 한 직관을 얻기가 힘들다. 아래의 그림에서 layer1에서는 7X7 크기의 이미지가 3 chanel(RGB)의 값으로 16개의 필터를 가진 것을 나타낸다. (RBG를 하나로 합쳐서 나타내어 컬러 이미지로 나타난다.) layer 2에서는 7X7 크기의 이미지가 16개의 채널씩 20개의 필터로 layer 3에서는 7X7 크기의 이미지가 20개의 채널씩 20개의 필터로 나타나지는 것을 표현하였다.

 

 

그렇다면 공간적인 정보를 없앤 (픽셀공간에서 벗어난) FC layer인 마지막 레이어에서는 어떨까? 

 

FC layer에서는 4096 dimension을 가지게 된다. 이때 픽셀 공간에서 벗어나게 되면서 근접한 이미지들의 특징들을 잘 추출할 수 있게 된다. 아래의 슬라이드에서 왼쪽의 꽃, 코끼리, 등대, 할로윈호박, 개 이미지는 Test dataset이고 오른쪽의 이미지들은 특징 공간에서 L2 Nearest neighbors로 비슷한 이미지들을 모은 것이다. 코끼리 이미지를 살펴보면 왼쪽에 있는 코끼리 사진과 오른쪽에 있는 코끼리 사진은 픽셀공간에서는 다르게 인식을 하여야 정상이다. 하지만 특징공간에서는 이들은 비슷한 이미지로 인식할 수 있다. 이는 loss function을 통해 학습한 것이 아니라 네트워크를 거치며 저절로 학습하게 된 것이다.

 

 

2. 다양한 고정 입력 이미지에 대해서 시각화

 

차원축소를 통해서 더욱 두드러지게 살펴볼 수 있다.

 

PCA라는 비교적 간단한 알고리즘을 통해서도 볼 수 있지만 특정공간의 시각화에 우수한 t-SNE를 통해서 살펴본다면 더 이미지들의 특징에 따라 분류가 되는 것을 관찰할 수 있다. 아래의 이미지는 MNIST 손글씨 이미지를 차원축소하여 각 숫자별로 군집화된 것을 관찰 할 수 있다.

 

 

즉, 정리해보면 입력이미지라는 첫번째 데이터가 주어진다. 그리고 CNN을 거쳐서 4096 dimension의 데이터를 가지게 되고 t-SNE를 거쳐 2 dimension의 데이터를 얻어 총 3종류의 데이터를 활용할 수 있다.

 

Visualizing Activations

 

활성화 맵을 통해서도 이미지의 특징들이 추출되는 것을 확인할 수 있다. 아래의 그림은 각 레이어에서의 activation map을 시각화한 것이다. 어떤 레이어든지 이미지의 특징을 담을 수 있으나 이는 어떤 레이어에서 이미지의 특징을 잘 드러내는 feature map이 나타날지 모른다는 의미이기도 하다.

 

 

Maximally Acivating Patches

 

어떤 이미지가 들어와야 각 뉴런들의 활성이 최대화되는지 시각화하는 방법이다. 아래의 슬라이드를 살펴보면 Conv5 에서 128 X 13 X 13인 한 덩이리 activation volumn을 가지는데 128개의 channel 중 17번째 channel 하나를 골라 어떤 이미지를 입력하였을 때 가장 활성이 잘 일어나는지를 확인해보자. Conv5는 convolution layer이기 때문에 receptive field가 작은 편이다. 따라서, Conv5의 하나의 뉴런(한 뉴런은 Conv5 activation map의 하나의 scalar값을 의미)은 하나의 이미지에서 특정 부분만 보고 있다. 따라서, 하나의 뉴런은 어떤 이미지의 특정 부분의 특징 잘 추출하여 활성화하는지를 알 수 있다. 그런데 Conv5는 convolution layer이기 때문에 한 채널 안의 모든 뉴런들은 모두 같은 filter의 가중치를 공유한다. 따라서, 모든 뉴런들이 각각 다르게 이미지의 특정부분을 보고 동일한 특징들을 활성화하는지를 볼 수 있다.

또한, 슬라이드에서 위에서의 patch보다 아래에서의 patch의 receptive field가 좀 더 넓은데 이는 아래가 좀 더 깊은 layer에서 추출한 것이기 때문이다.

 

 

Occlusion Experiment

 

입력의 어떤 부분이 분류를 결정짓는 근거가 되는지에 관한 실험을 진행한 것이다.  핵심 아이디어는 이미지에서 특정 패치를 뽑아 가린 후에 네트워크가 이미지를 예측한 확률값을 기록한다. 이를 sliding window 방식으로 전체를 진행한다. 이미지의 중요한 부분을 뽑아냈다면 당연히 이미지의 예측확률이 현저히 줄어들 것이다. 슬라이드에서 오른쪽의 heatmap은 patch의 위치에 따른 네트워크의 예측 확률의 변화를 의미한다. 빨간 부분을 가렸을 시에 이미지 예측 확률이 많이 떨어진 것인데 빨간부분은 이미지의 label과 대응되는 것을 확인할 수 있다.

 

 

Saliency Maps

 

Sailency Maps도 Occlusion Experiment와 동일하게 픽셀의 어느 부분을 보고 이미지를 판단하였는지에 관하여 진행한 것이다. 이 방법은 입력 이미지의 각 픽셀들에 대해서, 예측한 클래스 스코어의 그레디언트를 계산하는 방법이다.

1차적 근사방법이지만 어떤 픽셀이 영향력있는지를 알 수 있다. 이는 Semantic Segmentation에 적용하여 논문으로 나온바도 있다. (supervision을 사용하지 않는다는 점에서 놀라운 결과라고 할 수 있다.)

 

 

Guided Back Propagation

 

어떤 한 이미지가 들어왔을 때 네트워크의 중간 뉴런의 값을 선택한다. 이미지의 어떤 부분이 내가 선택한 뉴런에 영향을 주는 것인지 보는 것이다. 이 경우에는 이미지의 각 픽셀에 대한 "클래스 스코어"의 그래디언트를 계산하는 것이 아니라 입력 이미지의 각 픽셀에 대한 "네트워크 중간 뉴런"의 그레디언트를 계산한다. 이를 통해 어떤 픽셀이 해당 뉴런에 영향을 주는지 알 수 있다.

 

 

backpropagation 과정에서 Relu 함수의 양의 값만 back propagation을 진행하고 음의 값은 버린다면(back propagation 진행 X) 조금 더 깨끗한 이미지를 얻을 수 있다. (guided back propagaion 논문 참조)

 

 

3. 입력이미지가 일반적인 경우

 

Gradient Ascent

 

gradient decent(backprop)

- loss를 최소화시켜 네트워크를 학습하는 방법하였다. (가중치의 값들이 유동적)

- regularization term: 가중치들이 학습데이터의 과정합을 방지하기 위함

 

gradient ascent

- 가중치를 고정시킨 후 중간 뉴런 혹은 클래스 스코어를 최대화시키는 이미지 픽셀들을 바꿔주는 것이다. (가중치의 값들은 고정이나 입력이미지의 픽셀값이 유동적임)

  • 이미지가 특정 뉴런의 값을 최대화시키는 방향으로 생성되도록

- regularization term: 생성된 이미지가 특정 네트워크의 특성에 완전히 과적합되는 것을 방지하기 위함

  • 이미지가 자연스럽게(statistics) 보이도록 (네트워크가 어떤 것을 찾고 있는지 이해하기 힘들기 때문에 추가하는 것)

 

gradient ascent를 위한 초기이미지로 zeros, uniform, noise 등으로 초기화를 시켜준 후 다음과 같은 일련의 과정을 거쳐 이미지를 탄생시킨다. 

 

 

1. 제로픽셀 이미지

2. 현재 스코어값 계산을 위해 이미지 forward

3. 이미지 픽셀의 뉴런값과 기울기를 얻기 위해  backprop

4. 이미지 업데이트

 

regularization term으로 보통 L2 norm만을 쓰나 다른 것들을 추가시킨 방법들이 존재한다.

 

1. Gaussian blur 이미지

2. 픽셀 중 작은 value를 가지는 것은 0으로

3. 픽셀 중 작은 gradient를 가지는 것은 0으로 

 

최종 클래스 스코어 뿐 아니라 중간 뉴런에도 사용이 가능한데 이는 중간 뉴런이 무엇을 찾고 있는지를 짐작할 수 있게 해준다. 아래 슬라이드에서 예제 이미지가 클수록 receptive field가 더 큰 뉴런이고 더 복잡한 패턴을 찾는 경향을 가진다.

 

 

multimodality

 

클래스마다 클러스터링 알고리즘을 수행하여 한 클래스 내 서로 다른 모드들끼리 다시 클래스가 나뉘게 한다. 그리고 나뉜 모드들과 가까운 곳으로 초기화 해준다. 이와 같은 방법을 수행하면 아래 슬라이드에서 식료품점 이미지 8장 중 한 장이 다른 이미지와 다름에도 multimodality를 명시하게 되면 이미지 생성 시 다양한 결과를 얻을 수 있게 된다.

 

 

prior information (feature inversion network)

 

아래 슬라이드는 Imagenet의 특정 클래스를 최대화하는 이미지를 생성해낸 것이다. 이는 입력 이미지의 픽셀을 곧장 최적화하는 것 대신 FC6를 최적화하는 것으로 feature inversion network를 사용해야 한다. 핵심은 사전정보를 통해 좀 더 real 이미지에 가깝게 생성을 할 수 있다는 것이다.

 

 

Fooling Images

 

이미지 픽셀의 그라디언트를 이용하여 이미지를 합성하는 방법을 이용하여 네트워크를 속이는 이미지를 만들 수 있다.

 

 

1. 임의의 이미지에서 시작 (ex. 코끼리 이미지)

2. 임의의 클래스를 선택 (ex. 코알라 클래스)

3. 클래스를 극대화하기 위해 이미지를 변경 (ex. 코끼리 -> 코알라로 분류하도록 이미지 픽셀값을 랜덤하게 변경)

4. network가 fooled될 때까지 반복

 

아래의 슬라이드를 보면 왼쪽 2개의 이미지는 우리가 보기에는 동일하나 네트워크는 맨 왼쪽은 정상적으로 오른쪽은 fool image class로 분류한다.

 

 

4. style transfer

 

Deepdream

 

재미있는 이미지를 만들기 위한 목적으로 구글에서 Deepdream이란 블로그 포스팅을 하였는데 이를 통해 모델이 이미지의 어떤 특징들을 찾고 있는지를 짐작할 수 있다.

 

 

1. Forward: 선택된 레이어에서 activation을 계산

2. activation과 동등한 선택된 레이어의 기울기를 설정 (네트워크가 이미지에서 뽑아낸 특징들을 더욱 증폭시키는 역할)

3. backward: 이미지의 기울기를 계산 (L2 norm을 최대화시키는 것)

4. 이미지를 업데이트

 

얕은층으로 Deepdream 수행 시 엣지나 소용돌이 모양이, 깊은 층으로 수행 시 개와 달팽이의 모습이 많이 보인다. (개와 달팽이가 많이 보이는 이유는 개와 달팽이 데이터의 수가 많기 때문이다.)

 

Feature Inversion

 

feature inversion 또한 모델이 이미지의 어떤 특징들을 찾고 있는지를 짐작할 수 있다. 

 

 

이미지를 네트워크에 통과시킨 후 특징(activation map)을 저장해준다. 그리고 이 특징만을 가지고 이미지를 재구성한다. 이로부터 이미지의 어떤 정보가 특징 벡터에서 포착되는지를 짐작할 수 있다.

gradient ascent 방법을 이용하기에 스코어를 최대화시키는 것 대신 특징 벡터 간(기존에 계산해 놓은 특징벡터와 새롭게 생성한 이미지로 계산한 특징벡터 간)의 거리를 최소화하는 방법을 이용한다.

 

아래 슬라이드를 보면 feature inversion을 통해 네트워크가 깊어질수록 저수준의 정보들은 사라지고(픽셀값이 정확히 얼만인가) 의미론적 정보들(색이나 텍스쳐)을 유지하려는 것으로 보인다.

 

 

Text Synthesis

 

신경망 대신 scan line을 따라서 한 픽셀씩 이미지를 생성해 나가는 방식으로 컴퓨터 그래픽 분야에서 전통적으로 연구해오던 분야 중 하나이다. 세밀한 방식은 다음과 같다. 현재 생성해야 할 픽셀 주변의 이미 생성된 픽셀들을 살핀 후 입력 패치에서 가장 가까운 픽셀을 계산하여 입력 패치에서 복사하여 붙여넣는 방식이다.

 

 

Neural Texture Synthesis: Gram Matrix

 

신경망을 활용한 텍스쳐 합성문제를 해결하려고 한 시도들 중 gram matrix를 이용한 방법이 있다. 

이미지를 네트워크에 통과시킨 후 특정 네트워크에서의 특징 맵을 가져온다. 이때 특징맵의 크기는 C(channel) x H(image height) x W(image width)를 가진다. 여기서 이미지의 한 픽셀 (HxW에서의 한 점)을 뽑아 C차원의 벡터로 뽑는다고 해보자. 이때 벡터는 이미지의 해당지역의 특징을 담고 있다.(이를 통해 입력 이미지의 텍스트 기술자를 계산할 수 있다.) 이제 이와 같이 HxW에서 두 점을 택하여 C차원의 벡터를 뽑아 외적을 한 CxC 행렬은 두 점의 특징들 간의 co-occurrence를 가지고 있다. 이 행렬의 (i,j)요소가 크다는 것은 (i,j)의 값 모두 크다는 것이고 이는 두 점이 동시에 활성화되는 특징이 무엇인지 알 수 있다는 것을 말한다. 이 과정을 HxW grid에서 전부 수행한 후 평균을 계산하여 CxC gram matrix를 구한다. 이 CxC matrix는 이미지 각 지점에 해당하는 값들을 모두 평균화한 것이기에 공간정보를 모두 날려버린 것과 같다.

 

 

공분산 행렬을 쓰지 않고 gram matrix를 사용하는 이유는 성능은 당연 공분산 행렬이 좋지만 연산이 공분산 행렬은 C x H x W와 같이 3차원 텐서의 연산으로 구해야 해서 계산비용이 매우 비싸지만 gram matrix의 경우에는 C x (HW)의 연산을 하는 것이기에 매우 효율적이기 때문이다. 결론적으로 gram matrix를 통해서 이미지 텍스처 기술자를 만든다.

 

이미지 생성과정 (gradient ascent procedure와 유사)

 

 

1. 입력이미지를 pretrain 된 VGG network에 통과시켜 다양한 레이어에서 gram matrix를 계산한다.

2. 원본 이미지와 생성된 이미지의 gram matrix 간의 차이를 L2 norm을 이용해 loss를 계산한다.

3. 계산된 loss를 이용하여 backprob을 통해 생성된 이미지 픽셀의 그레디언트를 계산한다.

4. gradient ascent를 통해 이미지 픽셀을 조금씩 업데이트 한다.

5. 위와 같은 방법으로 Gram Matrix계산 -> Loss 계산 -> backprob을 반복하여 입력 텍스처와 유사한 텍스처를 만들어낸다.

 

아래 슬라이드를 통해 레이어가 깊어질수록 이미지의 더 큰 패턴들을 재구성해냄을 확인할 수 있다.

 

 

Neural Style Transfer

 

이와 같은 방식을 예술 작품에 적용하려는 시도도 등장한다. gram matrix를 이용한 텍스처 합성을 두 이미지에 대해 적용하고 feature inversion을 조합한다. 즉, textre snythesis와 feature inversion을 조합하는데 이것이 style transfer이다.

 

 

최종 이미지를 만들어내기 위해 content image와 style image가 필요하다. content image는 네트워크에게 우리의 최종 이미지의 형태 혹은 뼈대를 알려주는 이미지이고, style image는 네트워크에게 어떤 스스타일 (혹은 텍스처)인지를 알려주는 이미지이다. 최종 이미지는 content image의 feature reconstruction loss를 최소화하고 style image의 gram matrix loss도 최소화하여 최적의 이미지를 생성해낸다.

 

 

content image와 style image 입력을 달리하여 출력의 변화를 줄 수 있고, 이들의 joint loss function의 가중치를 조절하여 어느 부분에 더 집중할 것인지도 결정할 수 있다. 심지어 style image의 크기를 resize하여 넣어주면 스타일 (혹은 텍스처)의 스케일도 조정할 수 있고 여러 style image를 입력할 수도 있다.

 

 

Problem - solution

문제점 : 많은 backward/forward 과정이 반복되어야 하므로 매우 느리다.

해결책: style transfer를 위한 또 다른 네트워크를 학습시키는 것

 

 

Fast Style Transfer

 

style image를 고정시킨 후 content image 만을 입력 받아 결과를 출력할 수 있는 단일 네트워크를 학습시키는 방법이다. 학습 시 content loss와 style loss를 동시에 학습시켜 네트워크 가중치를 업데이트 한다. 학습에는 오랜 시간이 걸리나 학습을 마친 후 이미지를 네트워크에 입력하면 곧바로 결과가 나온다. 이는 출력이 RGB라는 점을 제외하면 semantics segmentation과 매우 유사하다.

 

 

One network, many style

 

위의 방법의 단점은 하나의 네트워크가 하나의 스타일 (혹은 텍스처)만 표현할 수 있다는 것이다. 구글에서는 하나의 네트워크만 학습시켜서 다양한 style result를 만들 수 있는 방법을 제안하였다. 실시간으로도 가능하며 심지어 다양한 스타일도 합칠 수 있다.

 

 

 

 

-히비스서커스-

 

 

 

 

 

 

728x90

'Theory > Computer Vision' 카테고리의 다른 글

[WSSS] ACoL 논문 정리  (2) 2022.02.13
[WSSS] AE-PSL 논문 정리  (0) 2022.02.13
[CS231n 11] Detection and Segmentation  (0) 2021.09.06
[CS231n Midterm] Short Answer  (12) 2021.03.25
[CS231n 9] CNN Architectures  (2) 2021.02.21