티스토리 뷰

728x90

이번 포스팅은 standford university의 cs231 lecture 8를 공부하고, 강의와 슬라이드를 바탕으로 정리한 글임을 밝힙니다.

 

What's going on inside ConvNets?

 

이전 lecture에서 CNN Architecture를 살펴보고, 지금까지는 어떻게 CNN을 학습시킬 것인지를 배웠고, 다양한 문제를 풀기 위해서 CNN Architecture를 어떻게 설계하고 조합해야 하는지를 배웠습니다.

 

그렇다면 Convolution Neural Networks 안에서는 무슨 일이 일어나고 있을까요? CNN의 내부는 어떻게 생겼을까요? CNN이 어떤 종류의 feature를 찾고 있는 것일까요? 

 

이번 Lec8의 내용은 Visualizing and Understanding입니다.

 

컨볼루션 신경망(CNN)은 이미지 인식에 널리 적용되는 인공 신경망이며, 이미지 인식에 있어 예측을 잘하지만 해석하기 어렵다는 특징을 지녔습니다. 이러한 이유로 흔히 블랙박스 모델이라 불렀습니다.

 

CNN의 한쪽에서는 입력 이미지가 들어가고, Conv layer를 거치면서 아주 다양한 변환을 거칩니다. 결국 CNN의 출력 값은 우리가 이해하고 해석할 수 있는 class score의 형태로 나옵니다. 이뿐만 아니라 bounding box의 위치, labeled pixels와 같은 형태의 출력도 있습니다. 

 

이번 강의를 통해 컨볼루션 신경망이 feature를 학습하는 방법을 시각화를 통해 이해할 수 있습니다.

 

First Layer

따라서 가장 만만하게 접근할 수 있는 것이 첫 번째 레이어입니다.

 

  • AlexNet의 첫 번째 Conv layers에는 많은 필터들이 있습니다.
  • Conv filters는 sliding window로 이미지를 돌고, 이미지의 일부 영역과 내적을 수행합니다.
  • 이렇게 filter의 가중치와 내적한 결과가 첫 번째 레이어의 출력입니다.
  • 첫 번째 레이어는 입력 이미지와 직접 내적을 수행하기 때문에 이 필터를 단순히 시각화 시키는 것만으로도 이 필터가 이미지에서 무엇을 찾고 있는지 알아낼 수 있습니다.
  • 그리고 순서대로 AlexNet, ResNet-18, ResNet-101, DenseNet-121의 첫 번째 Conv filter의 가중치들입니다.

 

이를 통해 필터들이 무엇을 찾는지 알 수 있습니다. 우선 가장 많이 찾는 것은 edge입니다. 다양한 각도와 위치에서의 흰검 같은 보색으로 이루어진 엣지가 있습니다. 인간의 시각 체계에서도 Oriented edges를 감지한다고 알려져 있습니다. 이러한 점이 CNN의 초기 레이어와 비슷합니다.

 

흥미로운 점은 CNN을 어떤 모델과 데이터로 학습하든 간에 첫 번째 레이어는 전부 다 이런식으로 생겼다는 비슷한 점을 발견할 수 있습니다. 

 

  • 질문: 필터의 가중치를 시각화한다고 해서 필터가 무엇을 찾고 있는지 알 수 있는가?
  • 이는 Templete matching이나 내적을 생각하면 됩니다. 만약 Templete vector를 가지고 있다고 하면 임의의 데이터를 내적해서 어떤 scalar output을 계산합니다.
  • 필터값을 가장 활성화 시키는 입력을 생각해보면 입력값과 필터의 가중치 값이 동일한 경우입니다.
  • 내적을 생각해봤을 때, 내적 값을 최대화 시키려면 동일한 값 두 개를 내적하는 경우가 그렇습니다.
  • 그렇기 때문에 첫 번째 레이어의 가중치를 시각화 시키면 첫 번째 레이어가 무엇을 찾고 있는지 알 수 있습니다.

 

템플릿 매칭(template matching)은 참조 영상(reference image)에서 템플릿(template) 영상과 매칭되는 위치를 탐색하는 방법이다. 일반적으로 템플릿 매칭은 이동(translation) 문제는 해결할 수 있는 반면, 회전 및 스케일링된 물체의 매칭은 어려운 문제이다. 템플릿 매칭에서 영상의 밝기를 그대로 사용할 수도 있고, 에지, 코너점, 주파수 변환 등의 특징 공간으로 변환하여 템플릿 매칭을 수행할 수 있으며, 영상의 밝기 등에 덜 민감하도록 정규화 과정이 필요하다.

 

더 자세히 살펴보면 이렇습니다.

  • 학습된 필터는 단순한 가중치이지만, 필터는 2차원 구조를 가져서 가중치 값은 서로 spatial relationship을 갖습니다.
  • 각 필터를 2차원 이미지로 시각화한 모습입니다.
  • 즉, fileter의 weight를 시각화 한 모습
  • 동일하게 edges를 볼 수 있습니다.

 

Higher Layer

  • 이 네트워크에서 첫 번째 레이어는 7x7 filter 16개입니다. 아까 앞의 첫 번째 레이어와 동일합니다.
  • 두 번째 레이어의 가중치들을 살펴보면, 수 차례 Conv와 ReLU를 거치게 됩니다.
  • 두 번째 레이어는 Conv layer의 16 channels의 입력을 받습니다. 그리고 20개의 7x7 conv filters가 있습니다.
  • 이 필터들은 직접적으로 이미지의 형태로 시각화 시킬 수 없다는 문제점이 있으며, 이 필터들을 직접 살펴보는 것만으로 이해할만한 정보를 얻을 수 없습니다.
  • 즉, 더 높은 layer의 필터를 시각화 할 수 있지만, 그닥 흥미로운 결과는 아닙니다.
  • 첫 번째 레이어에 비해 Input Image와 직접적으로 연결되지 않고 해석하기 어렵습니다.
  • 그러나 레이어는 연결되어 있기 때문에 그 이후의 activation 패턴을 알 수 있습니다.

 

네트워크의 중간 레이어의 필터들이 무엇을 찾고 있는지 알아내려면 조금 더 fancy한 기법이 필요합니다. 

 


Last Layer: Nearest Neighbors

컨볼루션의 마지막 레이어는 어떤 일을 하고 있을까요? AlexNet의 마지막 레이어는 이미지를 표현하는 4096 dim의 feature vector를 입력으로 최종 class score를 출력합니다.

이 방법은 많은 이미지로 CNN을 돌려서 이미지에서 나온 feature vector를 모두 저장합니다. 앞선 방법에서는 첫 번째 Conv layer를 시각화 시켰지만 이제는 마지막 hidden layer를 시각화 시킵니다. 여기서 시도해 볼 수 있는 방법 중 하나는 Nearest Neighbor를 이용한 방법입니다.

  • 단순히 생각하면 Nearest Neighbors라 생각할 수 있습니다.
  • 다만 픽셀 공간에서 Nearest neighbors를 계산하는 것이 아니라 CNN에서 나온 4096 dim의 feature vector 공간에서 계산합니다.
  • 왼쪽의 pixel sapce에서 이웃인 것을 찾은 것과, 오른쪽의 test image를 feature space에서 이웃인 것을 찾은 것은 아주 다릅니다.
  • feature space의 경우 픽셀 값의 차이가 매우 큰 경우가 존재합니다.
  • 서로 픽셀 값의 차이는 커도 feature space 내에서는 아주 유사한 특성을 지닌다는 것을 알 수 있습니다.
  • 코끼리의 좌측면이 test image로 주어졌는데, 우측면이 이웃으로 나온 것으로 봐서 pixel 관점에선 매우 다르지만 featur 관점에선 유사하다고 해석할 수 있습니다.
  • 이는 network가 학습을 통해서 이미지의 semantic content한 특징을 잘 포착한다는 의미입니다. (feature space에서 이웃인 것을 찾기 때문)

 

  • 질문: 마지막 레이어에 nearest neighbor를 적용하려면 어떻게 해야하는지?
  • 우선 이미지를 네트워크에 통과시키고, 뒤에서 두 번째에 있는 hidden layer는 4096-dim vector입니다. 네트워크의 마지막 단에는 FC-layer가 있습니다. 그럼 각 이미지들에 해당되는 4096-dim vector들을 전부 다 저장해 놓고, 저장된 4096-dim vector를 가지고 nearest neighbors를 계산합니다.

 

Last Layer: Dimensionality Reduction

최종 레이어에서 어떤 일이 벌어지는지 시각화하고자 할 때, '차원 축소'의 관점으로 볼 수도 있습니다.

 

  • PCA는 4096-dim과 같은 고차원 feature vector들을 2-dim으로 압축시키는 기법입니다.
  • 간단한 알고리즘으로 PCA가 있으며, 복잡한 알고리즘으론 t-SNE가 있습니다.
  • t-SNE는 더 파워풀한 알고리즘입니다.
  • AlexNet의 경우, 4096 dimension을 2 dim으로 차원을 축소 시킨 FC layer의 feature vector를 시각화했을 때입니다.

 

이런식의 시각화 기법을 ImageNet을 분류하려고 학습시킨 네트워크의 마지막 레이어에도 적용해 볼 수 있습니다.

엄청나게 많은 이미지를 네트워크에 통과시키고, 각 이미지에 대해 마지막 레이어 4096-dim에 feature vector를 기록합니다. 그리고 이 feature vector에 t-SNE를 적용시키면 2-dim으로 압축된 feature space에서 시각화 됩니다.

 

한 이미지 당 3가지의 다른 정보가 담겨 있습니다.

  1. 픽셀로 된 원본 이미지
  2. 4096-dim vector (FC-layer의 output)
  3. t-SNE를 이용해 4096-dim vector를 2-dim vector로 변환시킨 값이 있습니다.

 

결국 원본 이미지를 CNN으로 4096-dim 으로 줄이고, 다시 t-SNE를 2-dim으로 줄였다고 보면 됩니다.

 

첫 번째, 중간, 마지막 레이어의 가중치를 시각화 시켜서 해석해보려 했습니다. 하지만 레이어의 가중치가 아니라 activation map을 시각화 해보면 일부 해석할 수 있는 것들을 볼 수 있습니다.

 

Visualizing Activataions

 

  • Activation을 시각화 할 수 있습니다. 어떤 이미지에서 특정 뉴런이 최대 활성화를 가지는지를 살펴 보는 방법입니다.
  • 이는 가장 직관적인 시각화 방법이 되고, forward pass 동안 network의 activation을 표시할 수 있습니다.
  • ReLU의 경우, 일반적으로 활성화가 상대적으로 blobby하고 dense해 보이지만, 훈련이 진행됨에 따라 활성화는 일반적으로 더 sparse 해지고 localized합니다.
  • 이 의미는 중요한 feature에 더 집중하고 위치를 찾아간다고 해석할 수 있습니다.
  • (ReLU는 0으로 만드는 특성이 있기 때문입니다.
  • 위 이미지는 고양이 사진을 훈련한 예시입니다.
  • 왼쪽은 첫 번째 레이어이고 오른쪽은 5번째 레이어입니다.
  • 모든 상자 안은 일부 필터에 해당되는 활성화 맵이 표시되고, 대부분의 값이 0이며 대부분 local입니다.

 

다시 AlexNet의 예시를 살펴보겠습니다. AlexNet의 conv5의 feature는 128 x 13 x 13 dim의 tensor입니다. 128개의 13x13 dim grid로 볼 수 있으며, 이 feature map을 gray scale 이미지로 시각화 해볼 수 있습니다.

  • 중간 feature들의 대부분은 noisy하고 볼만한 게 없지만, 초록색의 feature map을 보면 이는 사람의 얼굴에 activation 되는 것 같아 보입니다.
  • 사람의 얼굴 feature로 해석할 수 있습니다.
  • 여기서 검은색 부분은 특정 입력에 대해서 활성회되지 않은 경우를 의미합니다.

 

Maximally Activation Patches

따라서 중간 feature를 시각화 할 수 있는 또다른 방법이 있습니다. 어떤 이미지가 들어와야 각 뉴런들의 활성이 최대화되는지를 시각화 해보는 방법입니다. 해당 예시에서도 다시 AlexNet의 conv5 layer를 사용합니다.128 x 13 x 13의 한 덩어리 activation volume을 갖습니다. 그리고 128 channels 중에 하나를 뽑는데, 17번째 채널을 선택합니다.

 

현재 뉴런은 conv layer이며, receptive field가 작은 편입니다. 각 뉴런이 전체 이미지를 보고 있지는 않으며, 이미지의 일부만을 보고 있습니다. 따라서 특정 레이어의 feature를 최대화 시키는 일부분(patches)를 시각화 시킵니다. 그리고 특정 레이어의 활성화 정도를 기준으로 패치들을 정렬시킵니다. 

 

  • 입력 이미지의 특정 patch를 시각화 한 경우입니다.
  • 네트워크에 이미지를 많이 학습 시킨 후에 선택된 채널의 값을 기록합니다.
  • 그 후 최대 activation에 해당하는 이미지 패치를 시각화하는 방법입니다.
  • 각 행에 있는 패치들은 하나의 뉴런에서 나온 것이며, 각 패치들은 데이터셋에서 나온 패치를 정렬한 값입니다.
  • 패치의 특징을 살펴봄으로써 해당 뉴런이 무엇을 찾고 있는지 짐작 가능합니다.
  • (한 뉴런은 conv5 activation map의 하나의 scalar 값을 의미합니다.)

 

Important pixels?

 

그 전에 Saliency의 의미에 대해 짚고 넘어가겠습니다. 단어의 의미는 돌출, 요점 등을 의미합니다. Saliency map은 사람이 사물을 인지하는 방법이 Pixelwise 하지 않다는 점에서 제안된 방법입니다. 사람이 사물을 인지할 대, 눈에 띄는 영역을 먼저 인지한다는 점이죠. CNN이 filter를 도는 것처럼 인식하지 않고, 중요한 feature 먼저 본능적으로 바라보게 되는 것입니다.

 

따라서 이런 방식을 적용하여 Mapping한 것이라 볼 수 있습니다. 눈에 띄는 영역, 다른 영역에 비해 pixel 값의 변화가 급격한 부분을 모아 매핑하고, 결과적으로 관심 있는 object를 관심 없는 background와 분리 시키는 것을 의미합니다. 이런 방법은 이미지에서 가장 중요한 부분을 추출하는데 비용을 절약할 수 있습니다.

 

Occlusion Experiments

이 실험에서 알고자 하는 것은 입력의 어떤 부분이 분류를 결정짓는 근거가 되는지에 대한 실험입니다.

  • CNN에 넣기 전에 이미지의 일부를 masking하고 mask 위치에서 이 이미지를 예측한 확률의 히트맵을 그립니다.

  • 3개의 입력 이미지가 있습니다.
  • occlusion 시키려는 영역이 gray box로 표시됩니다.
  • 이미지 위로 occluder(occluded patch)를 슬라이딩하며 class의 확률을 기록한 다음 히트맵으로 시각화합니다.
  • 예를 들어, 가장 왼쪽 이미지에서 우리는 occluder가 강아지의 얼굴을 덮을 떄 포메라니안의 확률이 급감하는 것을 알 수 있으며,
  • 이는 강아지의 얼굴이 주로 높은 class score에 responbility가 있다는 것을 알 수 있습니다.
  • 반대로 이미지의 다른 부분을 0으로 만드는 것은 상대적으로 무시할 수 있는 영향력을 가집니다.

  • 이 실험은 이미지의 특정 부분을 block해서 occlusion 시킴으로서 network socre가 극단적으로 변화하는 것을 살펴보고, 특정 부분이 classification decision에 중요한 영향을 끼칠 것이라는 아이디어에서 나왔습sl다.
  • 빨간색은 low probability이며, 노란색 영역으로 갈수록 high probability를 가집니다.
  • go-kark를 시각화한 경우를 살펴보니, kart를 가려버린다면 go-kart class의 확률이 내려가는 것을 통해 실제로 go-kart를 아주 많이 고려한다는 사실을 알 수 있습니다.
  • 또한, go-kart 히트맵을 더 살펴보면 백그라운드 부분에 확률이 많이 낮은데 이 경우 뒤의 go-kart도 인식한 것으로 해석할 수 있으며 수평선(horizon)의 영향으로 이를 검출하는데 유용한 feature로 작용했을 가능성이 큽니다.

 

Saliency map

입력 이미지가 들어옵니다. 이 경우에는 "Dog"입니다. 그리고 이 이미지를 "Dog"라고 예측했을 때, 우리가 알고 싶은 것은 네트워크가 픽셀들을 보고서 이미지를 "Dog"라고 분류했는지입니다.

 

앞에선 특정 픽셀 자체를 가려버리는 masking 방법도 있었지만, Saliency maps은 조금 더 다른 접근법을 취합니다.

 

이 방법은 입력 이미지의 각 픽셀들에 대해서, 예측한 class score의 gradient를 계산하는 방법입니다. 이 방법은 일종의 1차 근사적 방법으로 어떤 픽셀이 영향력이 있는지를 알려줍니다. 입력 이미지의 각 픽셀에 대해, 그 픽셀을 조금 바꿨을 때class score가 얼마나 바뀌는지를 알아봅니다.

  • 이미지 픽셀이 갖는 class score의 gradient를 계산합니다.
  • RGB 채널을 넘어 절대값과 max 값을 취합니다.

  • 귀여운 강아지의 gradient를 시각화 시킨 값입니다.
  • "Dog" 이미지의 Saliency map을 만들어보면 윤곽이 나타남을 볼 수 있습니다.
  • 이를 통해 네트워크가 어떤 픽셀을 찾고 있는지 알 수 있습니다.

 

다른 이미지의 예시도 살펴볼 수 있습니다.

 

Saliency Maps: Segmentation without Supervision

  • Saliency Map은 대조되는 색깔, 밝기 값을 픽셀 값을 통해 인지하며, 이미지의 픽셀 값에 급격한 변화가 있는 부분들을 찾아내어 그 부분을 독립된 물체로 인지하게 됩니다.
  • 예를 들어 위의 사진들 중 돛단배가 있는 사진에서, 파란 하늘과 바다와는 대조적으로 하얀색의 돛단배가 있는 것을 돛단배의 대조되는 색깔과, 밝기 값으로 인지합니다.
  • 따라서 이미지의 픽셀 값에 급격한 변화가 있는 부분을 찾아내는 것이 Saliency Map의 주요 과제가 되며, 이는 Gradient Descent(경사 하강법)을 통해 구할 수 있습니다.

segmentation label 없이 Saliency Maps만 가지고 semantic segmentation을 수행한 것입니다. 이는 Saliency map에 GrabCut을 사용한 경우입니다. Grabcut은 interactive segmentation algorithm의 일종입니다. 여기서 Saliency Map과 Grabcut을 잘 조합하면 이미지 내에서 객체를 segmentation 할 수 있습니다.

 

 

Intermediate Features via (guided) backprop

또 다른 아이디어로는 guided back propagation이 있습니다. 어떤 한 이미지가 있을 때, 이젠 class score가 아닌 네트워크의 중간 뉴런을 하나 고릅니다. 그리고 입력 이미지의 어떤 부분이 내가 선택한 중간 뉴런의 값에 영향을 주는지 찾습니다.

 

하지만 back propagation 과정에서 조금의 트릭을 가미하면 조금 더 깨끗한 이미지를 얻을 수 있습니다.

 

이 방법은 backprop 시 ReLU를 통과할 때, 조금의 변형을 가해줍니다. ReLU의 gradient 부호가 양수이면 그대로 음수이면 backprop하지 않는 방법입니다. 이로 인해 전체 네트워크가 실제 gradient를 이용하는 것이 아닌 양의 부호인 gradient만 고려하게 됩니다.

 

 

 

  • 왼쪽은 최대화 된 활성화 패치들입니다.
  • 오른쪽은 Backprop으로 가이드된 값입니다.
  • 실험 결과를 비교해보면, guided backprop이 그냥에 비해 훨씬 더 선명하고 좋은 이미지를 얻을 수 있습니다.
  • 이렇게 중간 레이어가 무엇을 찾고 있는지를 이해하기 위해 

 

하지만 guided backprop이나 saliency maps을 계산하는 방법들은 고정된 입력 이미지에 대한 연산을 수행할 뿐입니다. 이 방법은 고정된 입력 이미지, 또는 입력 패티의 어떤 부분이 해당 뉴런에 영향을 미치는지 말해줍니다.

 

Gradient Ascent

  • 지금까지 우리는 이미지 데이터 세트를 사용해서 레이어 내의 채널을 해석하려고 했습니다. 주어진 레이어에서 특정 채널을 최대로 활성화하는 이미지 영역으로의 patch 및 map cropping을 살펴보았습니다.
  • CNN을 시각화하는 또 다른 방법은 어떤 종류의 이미지가 뉴런의 활성화를 최대화하는지 또는 어떤 이미지가 특정 범주/클래스에 대해 최대 점수를 달성하는지 파악하는 것입니다.
  • 따라서 특정 새 뉴런의 활성화를 최대화하거나 사전 훈련된 주어진 네트워크의 마지막 크래스 점수까지 최대화하기 위해 빈 이미지에서 계속 backprop을 하면 어떻게 될까요?

 

Gradient ascent라는 방법을 사용해서 이를 수행할 수 있습니다.

기본적으로 역전파와 같지만 임의의 이미지로 시작해서 해당 이미지로 계속 역전파해서 네트워크의 주어진 계층에서 활성화를 최대화합니다.

즉, gradient ascent를 통해 특정 클래스의 활성화를 최대화하는 이미지를 학습하는 것이 목표입니다.

 

공식적으로 관심 있는 특정 활성화를 나타내는 $f(I)$를 최대로 활성화 시키는 입력 이미지 $I^*$을 찾으려고 합니다.

최종적인 class socre로 해석할 수 있습니다.

$R(I)$는 생성된 이미지가 실제 이미지와 유사한지, 실제로 사실적인 이미지인지 확인하는 정규화 텀입니다.

기본적인 아이디어는 모델을 훈련할 때, 가중치를 계속 역전파하는 대신 모델을 훈련한 후에는 비어 있거나 임의로 초기화된 이미지로 역전파하여 특정 활성화를 극대화하는 입력 이미지가 무엇인지 파악할 수 있다는 접근입니다.

일부 클래스 $C$에 대해서 score를 최대화하려는 경우, $f$가 $S_c$의 값을 가져와서 dog class에 대해 점수를 최대화한다고 가정합니다.

0 또는 임의의 이미지로 시작해서 개에 대한 점수를 최대화하는 이미지를 생성할 때까지 계속 역전파합니다.

 

정규화를 통해 기본적으로 수행하는 작업은 본질적으로 이미지의 특정 부분이 많이 활성화되지 않도록 하는 것입니다.

이로 L2-norm과 같은 단순한 기법을 사용할 수 있습니다.

즉, 활성화가 가능한 한 이미지 전체에 퍼져 있고 하나의 큰 값이 없는 이미지를 원합니다.

  1. Input Image를 0과 가까운 랜덤 값으로 초기화
  2. 초기화한 input image를 pre-trained 된 네트워크에 통과 시켜 score를 얻어냄
  3. BackProp을 통해 최종 score 변화량에 따른 input image의 변화량(gradient)를 계산
  4. 얻어낸 gradient로 input image의 각 픽셀 값을 업데이트

 

아래 이미지는 아령 클래스, 컵 클래스 또는 달마시안 클래스를 최대화하는 생성된 이미지의 일부 시각화를 보여줍니다.

예를 들어, 덤벨의 경우 실제로 서로 위에 있는 것처럼 보이는 덤벨 묶음을 식별할 수 있습니다.

다음으로 컵 케이스에 있는 컵을 볼 수 있고, 달마시안의 경우 실제로 개가 생성되진 않았지만 이미지 전체에 많은 흑백 패치 또는 개의 일부를 배치한다는 것을 알 수 있습니다.

 

  1. Gaussian blur image
  2. Clip pixels with small values to 0
  3. Clip pixels with small gradients to 0
  4. Use the same approach to visualize intermediate features

 

일부 후속 작업은 이런 아이디어에서 더 나은 정규화를 시도했습니다.

  • 한 가지 방법은 입력 이미지를 네트워크에 전달하기 전에 가우시안 블러를 사용하는 것이었습니다.
  • 가우시안 블러를 사용하는 이유는 gradient를 분산 시키기 위함이고, 기본적으로 입력 픽셀의 local region을 합산하는 것이므로 gradient도 local 영역으로 퍼집니다. = 또한, 작은 값이 있는 픽셀과 gradient가 작은 픽셀 값을 0으로 자르면서 gradient가 작은 픽셀이 변경되는 픽셀에 영향을 주지 않도록 했습니다.

 

Adversarial Examples

  1. Start from an arbitrary image
  2. Pick an arbitrary category
  3. Modify the image (via gradient ascent) to maximize the class score
  4. Stop when the network is fooled

 

이번엔 코끼리 이미지를 가져와 네트워크에서 코알라로 인식하도록 수정하려고 하면 어떤 일이 발생하는지를 살펴봅니다.

기본적으로 하려는 것은 특정 클래스의 기존 이미지로 시작하여 해당 이미지를 변경하여 다른 클래스가 되도록 하는 것입니다.

 

이를 달성할 수 있는 방법은 코끼리의 임의 이미지로 시작한 다음 코알라와 같은 다른 클래스를 선택하고, 코끼리의 입력 이미지와 관련하여 gradient를 최대화하며 수정하려고 시도하는 것입니다.

 

  • 코끼리가 코알라가 될 때까지 이미지를 변경합니다.
  • 이미지를 다른 것으로 변경하여 네트워크를 속이는 것으로 해석할 수 있습니다.

 

절차를 다시 한 번 정리하면,

  1. 임의의 이미지에서 시작합니다.
  2. 임의의 클래스를 선택합니다.
  3. 이미지를 수정하여 클래스를 최대화하십시오.
  4. 네트워크가 속을 때까지 반복합니다.
  5. ConvNet을 속일 수 있습니다.

 

아프리카 코끼리 이미지에 추가해야 하는 "차이"는 세 번째 칸으로 표시됩니다. 이 차이는 네트워크가 두 번째 이미지가 코알라라고 생각하게 만듭니다.

만약 변화시킨 것을 정확히 확대하기 위해 이 차이를 10배로 확대한다면, 그것은 실제로 noise처럼 보입니다. 다시 말해서, 우리는 우리에게 감지할 수 없는 방식으로 이미지를 바꾸고 있는 것입니다.

 

실제로 약간의 noise만 추가하면 모든 종류의 이미지에 대해 해당 작업을 수행할 수 있는데, 아래의 schoone는 iPod로 바꾸지만 이렇게 눈에 띄지 않는 변화는 ConvNet 모델이 테스트 세트에서 이미지 분류를 실패하게 만듭니다.

 

 

Adversarial example과 training은 컴퓨터 비전의 전제 작업 과정의 라인으로 이어졌습니다. 이런 adversial example이 어떻게 발생하는지, 이러한 노이즈를 입력에 추가할 때 네트워크가 어떤 속성을 가져야 하는지 생각할 수 있습니다.

 

구체적으로 adverisal example은 다음을 조사합니다.

  • 모든 모델이 실패하게 만드는 노이즈 벡터는 무엇입니까?
  • 우리가 추가해야 할 가장 좋은 종류의 노이즈는 무엇입니까?
  • 노이즈가 추가된 이미지를 교육하여 모델을 강화(하지만 여전히 올바른 클래스로 교육)한 다음 모든 모델을 training 합니다.
  • 우리 모델은 언제 충분히 견고합니까? (원하는 만큼 모델을 프라이밍할 수 있지만 사람들이 이미지의 차이를 알아차리기 시작할 정도로 너무 많이 추가하고 싶지는 않기 때문입니다!)

 

Universal adversarial perturbations

이 아이디어 뒤에 있는 그래픽 직관은 모델을 훈련할 때 특정 클래스에 속하는 (실제) 이미지가 어디에 있는지 다양하게 배우기 위해 표현/활성화의 고차원 공간을 탐색한다는 것입니다.

 

따라서 모델은 특정 클래스에 지정된 매니폴드 내에 있는 이미지를 표현하고 분류하는 방법을 배우고 있습니다.

 

각 클래스에는 다양한 종류가 있습니다. 이 perturbations을 배울 때, 여러분은 이 manifold의 경계를 알아내려고 합니다. 이 manifold를 넘으면, 모델이 이전에 갖고 있던 manifold에서 완전히 벗어낫기 때문에 완전히 눈이 먼 미지의 영역으로 모험을 떠납니다.

 

이러한 공간에서 완전히 예측할 수 없는 작동합니다. 따라서 이미지에 adversarial noise를 추가하면 모델이 학습한 manifold에서 target 이미지를 밀어내게 됩니다.

 

Perturbed된 이미지 및 해당 레이블의 예입니다.

Universal adversarial perturbations이란 논문에서는 모든 범주/클래스에 대한 단일 이미지에 추가하면 모든 단일 모델이 시간의 90% 이상 실패하는 단 하나의 단일 노이즈 벡터만 학습할 수 있음을 보여주었습니다. 이 모든 것은 우리 가 볼 때 인식할 수 없는 하나의 노이즈 벡터를 추가하기만 하면 됩니다.

 

Deep Dream

구글에서는 DeepDream이라는 방법을 제안했습니다. 이 아이디어는 후에 Style Transfer와 같은 다른 중요한 프로젝트에 영향을 미쳤습니다. 접근 방식은 앞에서 논의했던 gradient ascent 방법과 유사합니다.

 

모델을 통해 기본 이미지를 앞으로 전파하고, 선택한 layer에서 활성화를 계산합니다. 관심 있는 layer에서 뉴런 활성화를 최대화하려면 선택한 계층의 gradient를 activation과 동일하게 설정합니다. Backward pass 중에 input image의 loss에 대한 gradient를 계산합니다.

 

  • 이전의 gradient ascent 접근 방식과 지금의 차이점은 0 또는 무작위 이미지에서 시작하는 것이 아니라 이미 관심이 있는 기존 이미지에서 시작한다는 점입니다.
  • 계산된 gradient를 원본 이미지로 backprop해서 흥미로운 출력 결과를 얻어냅니다.
  • 본질적으로 관심 있는 특정 활성화를 최대화해서 이미지의 feature를 증폭하려고 합니다.
  • 해당 하늘 이미지로 시작해서 이미지 업데이트를 시작하면 다음과 같은 나선이 나타나고, 이 작업을 반복하면 이상한 모양이 나타나기 시작합니다.

 

사실 ImageNet의 사전 훈련된 모델에서 DeepDream을 훈련시키면 몇 가지 매우 구체적인 사항이 계속 반복해서 나타납니다.

 

어떤 이미지로 시작하든 계속해서 나타나는 것들이고, 실제로 다른 scale과 해상도로 계속해서 이 작업을 수행하고 이런 이미지를 함께 연결하면 이와 같은 흥미로운 출력을 얻을 수 있었습니다.

 

ImageNet은 주로 object에 초점을 맞췄다고 볼 수 있습니다.

 

Feature Inversion

  • 네트워크의 다양한 layer에서 이미지의 어떤 요소들을 포착하고 있는지를 짐작할 수 있게 해준다.
  • 어떤 이미지를 네트워크에 통과시킵니다.
  • 네트워크를 통과시킨 activation map(features)를 저장합니다.
  • activation map만을 가지고 이미지를 재구성합니다.
  • 이를 통해서 이미지의 어떤 정보가 feature vector에서 포착되는지 짐작할 수 있습니다.
  • 이 방법 또한 regularization을 추가한 gradient ascent를 이용합니다.
  • score를 최대화시키는 것 대신, feature vector간의 거리를 최소화시키는 방법을 이용합니다.
  • 기존에 계산한 feature vector Φ0과 새롭게 생성한 이미지로 계산한 feature vector Φ(x) 간의 거리를 측정합니다.

 

Reconstructing from different layers of VGG16

  • 왼쪽 이미지는 원본 이미지입니다. 해당 이미지를 VGG-16에 통과시킵니다.
  • Feature map을 기록하고 이 feature map과 부합하도록 하는 새로운 이미지를 합성합니다.
  • 다양한 layer에서 나온 activation map(feature map)을 가지고 합성한 이미지들을 보고 어떤 정보들을 저장하고 있는지 짐작할 수 있습니다.
  • Relu2_2를 거쳐 나온 feature vectors를 가지고 이미지를 재구성해보면 원본과 거의 동일합니다.
  • 이를 통해 relu2_2에서는 이미지 정보를 많이 날리지 않는다는 것을 알 수 있습니다.
  • 그러나 깊은 layer에서 살펴보면 네트워크가 깊어질수록
  • 픽셀 값이 정확히 얼마인지와 같은 low-level 정보들은 사라지고
  • 대신 색이나 텍스쳐와 같은 미세한 변화에 더 강력한 의미론적 정보들을 유지하는 것처럼 보입니다.

 

Texture Synthesis

Given a sample patch of some texture,
can we generate a bigger image of the same texture?

  • 텍스처를 합성한다는 아이디어는 현재 컴퓨터 그래픽 분야에서 수십 년에 걸쳐 광범위하게 연구되어 온 아이디어입니다.
  • 입력 텍스처를 가져오고 이 텍스처를 복제할 수 있는 모델을 구축하는 딥러닝 이전 시대에는 많은 작업이 있었습니다.
  • 우리는 컴퓨터 그래픽에서 이와 같은 기술을 차용하여 컴퓨터 비전 작업에 적용해 왔고, 일반적으로 이러한 방법은 간단한 텍스처와 매우 잘 작동하며 실제로 신경망이 필요하지 않는다고 합니다.

 

 

 Fast Texture Synthesis using Tree structed Vector Quantization(2000)
• Generate pixels one at a time in scanline order form neighborhood of already generated pixels and copy nearest neighbor from input

  • 텍스처 합성의 일반적인 아이디어는 입력 텍스처를 가져와 더 큰 기하학적 영역에 대해 자연스럽게 보이도록 합성 할 수 있는 방법을 알아내는 것 입니다.
  • 이미 생성된 픽셀의 이웃을 scaeline 순서로 한 번에 하나씩 생성하고, 입력에서 가장 가까운 이웃을 복사합니다.
  • 물론 이런 텍스처 합성 방법은 완벽하지 않습니다.

 

  • 벽돌 벽을 생성하는 이 예를 생각해보면, 벽돌 크기가 다르기 때문에 사실적으로 보이지 않습니다.
  • 마찬가지로 단어를 복제하려고 하고 확대하면 실제로 문자를 나타내지 않는다는 것을 알 수 있으므로 제대로 작동하지 않습니다.
  • 그러나 멀리서 보면 질감이 이해가 됩니다.
  • 따라서 간단한 알고리즘은 복잡한 텍스처와 잘 작동하지 않습니다.
  • 우리는 지금까지 논의해 온 이러한 특성 반전 방법을 개선하기 위해 오늘날 우리가 가지고 있는 딥러닝 기술을 사용할 수 있는 방법에 대해 생각하기 시작했습니다.

 

Gram Matrix

  • 이러한 높은 수준의 feature 표현에서 실제로 이미지를 재생성하고 원하는 texture 유형을 계속 유지할 수 있는 방법으로 텍스처를 유지하기 위해 gram matrix라고 하는 아이디어가 나왔습니다.
  • Gram matrix는 신경 쓰는 texture에 있을 것으로 예상되지 않는 feature 종류의 일부 고차원 표현을 나타내는 행렬입니다.
  • 즉, 서로 다른 공간 정보에 있는 채널들을 가지고 외적을 계산하여 새로운 matrix를 만드는 것을 말합니다.
  • 복제하려는 텍스처가 다음 돌 이미지라고 가정해 보겠습니다.

 

  • 이미지를 네트워크에 통과시키고 특정 layer에서 feature map을 가져옵니다.
  • 위 그림에서처럼 $H*W$의 한 점에 있는 $C$차원 feature vecto은 해당 지점에 존재하는 이미지의 특징을 담고있다고 할 수 있다.
  • 우선 feature map에서 서로 다른 두개의 feature vector(red, blue)를 뽑는다.
  • 그리고 이 둘의 외적을 계산하여 $CxC$행렬을 만듭니다.
  • 이 $C*C$행렬은 이미지 내 서로 다른 두 지점에 있는 특징들 간의 co-occurrenc를 담고 있다.
  • $C*C$행렬의 $(i,j)$번째 요소의 값이 크다면 두 입력 벡터의 $i$번째, $j$번째 요소가 모두 크다는 의미이다.
  • 이를 통해 서로 다른 공간에서 동시에 활성화되는 특징이 무엇인지 어느정도 포착할 수 있습니다.

 

Neural Texture Synthesis

gradient ascent와 유사한 과정을 거쳐서 입력 이미지의 gram matrix를 재구성합니다.

  1. Input Image를 넣고 Pretrained 된 VGG Network에서 다양한 Gram Matrix를 생성한다.
  2. Random Noise로 초기화 된 Image를 VGG Network를 통과 시켜 Gram Matrix를 생성한다.
  3. Input Image와 만들어진 Image의 Gram Matrix를 비교하여 L2 distance가 최소가 되도록 Loss값을 계산한다.
  4. 계산된 Loss 값을 이용하여 Backpropagation을 진행하여 이미지 픽셀의 Gradient를 계산한다.
  5. Gradient Ascent 방법을 통해 이미지의 픽셀 값들을 update한다.
  6. 위 단계를 반복하여 입력 이미지와 유사한 이미지가 만들어지도록 한다.

 

 

  • Reconstructing texture from higher layers recovers larger features from the input texture

  • 결과적으로 gram cam 을 이용하여 input 이미지의 texture을 잘 파악하고 재구성할 수 있습니다.
  • 이때, 얕은 레이어보다 깊은 레이어에서 전체 이미지에 대한 공간적인 특징을 잘 이해한 것을 확인 수 있습니다.

 

 

Neural Style Transfer

  • Texture synthesis + Feature inversion
  • Feature inversion: to get back the original contents of an image from a feature.
  •  Gram matrices: allow us to distill the textures/style in an image.

 

 

  • 위의 아이디어를 미술 작품에 적용하면 어떻게 될까라는 아이디어에서 Style Transfer라는 방법이 시작했습니다.
  • 즉, texture synthesis 를 이용해 예술 작품에서의 질감 특징을 가져오고 다른 이미지에 feature inversion 을 이용하여 이미지를 재구성한다는 아이디어 입니다.

 

  • content 이미지와 style 이미지를 가져와 texture 및 style을 포함하는 이미지를 만들 수 있도록 함께 배치할 것을 제안했습니다.
  • 이 연구 분야를 Neural Style Transfer라고 합니다.
  • 따라서 Style transfer 에서 input 이미지는 2가지입니다.
  • Content image는 우리가 최종적으로 생성할 이미지가 어떻게 생겼는지에 대한 input image이고,
  • Style image 는 최종 이미지가 texture에 대해 어떤지에 대한 input image 입니다.

 

  1. Input an image generated using a random noise vector to a network pre-trained on ImageNet (the original paper used VGG).
  2. As part of training, seek to minimize the gram matrices loss with respect to the style image and the feature representations of the content image.
  3. Perform gradient ascent during backprop until you obtain your desired output.

 

Neural Style Transfer를 수행하는 단계:

  1. Input an image generated using a random noise vector to a network pre-trained on ImageNet (the original paper used VGG).
  2. As part of training, seek to minimize the gram matrices loss with respect to the style image and the feature representations of the content image.
  3. Perform gradient ascent during backprop until you obtain your desired output.

 

  • ImageNet(원본은 VGG를 사용함)에서 사전 훈련된 네트워크에 랜덤 노이즈 벡터를 사용하여 생성된 이미지를 입력합니다.
  • training의 일환으로 스타일 이미지 및 콘텐츠 이미지의 기능 표현과 관련하여 그램 매트릭스 손실을 최소화하려고 합니다.
  • 원하는 출력을 얻을 때까지 역전파 중에 gradient ascet를 수행합니다.

 

  • Style은 앞서 Gram Matrix때 보았던 것 처럼 Style에서 Texture들을 뽑아내게 됩니다.
  • Content는 Feature Inversion때 보았던 것 처럼 네트워크를 거쳐서 나온 Feature들을 재구성 하여
  • 디테일한 정보가 줄어들은 Content 사진도 뽑아냅니다.
  • 저희의 목표는 이 Content 이미지와 Output이미지의 Loss를 줄임과 동시에 Style에 대한 Loss도 줄이고 싶습니다.
  • 따라서 Output 이미지에 대한 Loss Function은 두 Loss를 합해서 구해주게 됩니다.

 

  • 아래 다이어그램에서 네트워크의 이전 레이어가 많은 색상, 블롭 및 텍스처 를 캡처하기 때문에 이미지 스타일 을 표현하는 데 능숙 합니다
  • 이것이 초기 레이어에서 스타일을 추출하는 것을 선호하는 이유입니다.
  • 반면 네트워크의 나중 레이어 는 모양을 캡처 하므로 콘텐츠를 나타냅니다
  • 이것이 우리가 이미지의 콘텐츠를 추출하기 위해 나중 레이어를 사용하는 이유입니다.

 

  • 아래에 표시된 것은 신경 스타일 전송의 그래픽 프로세스입니다(반복 단계 100으로 표시됨).
  • 아래에서 볼 수 있듯이 예상 출력을 살짝 보기 전에 상당히 많은 반복을 위해 noise가 많은 입력 이미지로 역전파해야 합니다.
  • 역전파 반복 횟수는 일반적으로 하이퍼파라미터입니다.

 

  • 콘텐츠 손실과 스타일 손실 사이에서 논의한 장단점이 있습니다.
  • 여기에서 이 두 구성 요소를 결합하여 전체 손실을 공식화할 때 이 두 구성 요소의 가중치를 정확히 파악해야 합니다
  • Style loss에 크게 비중을 두면 texture는 얻을 수 있지만 content는 얻을 수 없습니다.
  • 반면에 content loss에 크게 무게를 두는 경우 style은 많이 얻지 못하고 content만 얻을 수 있습니다.
  • 아래에는 content와 style을 절충하는 방법에 따라 생성할 수 있는 이미지의 예가 나와 있습니다.

 

  • 마찬가지로 작거나 큰 스타일 이미지를 사용하는 것 사이에도 장단점이 있습니다.

 

Take a weighted average of Gram matrices

  • Multiple style images can also be used

 

 

Fast Style Transfer

  • Problem: Style transfer requires many forward / backward passes through VGG; very slow!
  • Solution: Train another neural network to perform style transfer for us!

 

  • 신경 스타일 전송의 문제는 사전 훈련된 VGG 네트워크를 통해 많은 forward/backward pass가 필요하고 원하는 최종 제품을 달성하기 위해 여러 경사 상승 업데이트 단계가 필요하므로 매우 느리다는 것 입니다.
  • Solution: 빠른 스타일 전송. 스타일 전송 이미지를 자동으로 생성하도록 다른 네트워크 를 훈련 시킵니다.
  • 빠른 스타일 전송은 기본적으로 이미지 스타일화 프로세스를 더 빠르게 만들고 너무 많은 경사 상승 업데이트 단계를 사용하지 않고 이 작업을 수행하는 방법을 파악합니다.

 

 

  • 빠른 스타일 전송은 다음 단계를 사용하여 이를 수행합니다.
  • 특정 스타일 에 대해 하나의 네트워크 훈련
  • 사전 훈련된 CNN(예: VGG)을 사용하여 이전과 유사한 그램 매트릭스 기반 손실을 계산합니다.
  • 빈 이미지 로 역전파하는 대신 피드 포워드 네트워크의 가중치를 훈련하고 있습니다.
  • 이것이 feed forward network라고 불리는 이유는 역전파 과정에서 자체 forward pass를 사용하여 역전파를 수행하지 않고 대신 미리 훈련된 네트워크의 순방향 패스를 사용 하여 손실을 계산하기 때문입니다.
  • 훈련이 완료되면 단일 순방향 패스를 사용하여 네트워크가 훈련된 특정 스타일로 이미지의 스타일을 지정할 수 있습니다 .

 

 

  • Some examples of images generated using fast style transfer:

 

 

Recall Normalization Methods

  • Instance Normalization was developed for style transfer!

 

  • 학습 시간을 개선하기 위해 픽셀 단위 L1/L2 거리 기반 손실 대신 지각 손실을 사용할 것을 제안했습니다. 
  • 마찬가지로 그들은 훈련 수렴 시간을 크게 개선하기 위해 인스턴스 정규화 (스타일 전송 훈련을 개선하기 위해 개발됨)를 사용할 것을 제안했습니다.

 

 

Summary

Visualizing and Understanding CNN representations

  1. Activations: Nearest neighbors, Dimensionality reduction, maximal patches, occlusion
  2. Gradients: Saliency maps, class visualization, fooling images, feature inversion
  3. Fun: DeepDream, Style Transfer.
728x90
댓글