Computer Science/CS231n

[CS231n] Lecture 11

  • -
728x90
반응형

 

이전까지는 Image Classification을 하기 위한 방법을 살펴보았었다.

Input image가 주어졌을 때, CNN이나 RNN 등의 방법을 활용하여 주어진 이미지가 어떠한 클래스에 속하는지를 판단하는 작업을 수행하였다.

 

Computer Vision에게 주어진 과제는 그외에도 여러가지가 존재하는데

크게 보면, 4가지 task가 존재한다.

Semantic Segmentation

첫번째로는 Semantic Segmentation이다.

해당 작업은 이미지를 받아 모든 pixel를 Category label에 대응시키는 작업이라고 할 수 있다.

각 pixel을 단순히 category에 대응시키는 것이므로, 동일한 category에 존재하면서 다른 object의 경우는 구분하지 못한다.

Don't differentiate instances

이를 수행하는 방법은 크게 2가지가 존재한다.

Sliding Window

원초적으로 접근하는 방법이다. 

전체 이미지에 작은 window를 옮겨가면서 해당 window를 CNN의 input으로 주입해서 Classification을 수행하는 것이다.

 

정말로 브루트포스처럼 window를 살짝씩 옮겨가면서 classification을 수행하는 것이므로 Semantic segmentation을 수행할 수 있으나, 시간복잡도가 매우 크다는 단점을 가지고 있다. 

 

이에, 겹치는 부분에 대한 정보를 활용해서 불필요한 계산을 줄일 수 없을까라는 생각에서 접근한 것이 Fully Convolutional이다.

Fully Convoluctional

구조 자체는 CNN에서 학습한 것과 상당히 유사하다. 

3 by 3 filter를 사용하면서, padding 등을 이용하여 spatial size를 유지시키면서 CNN을 진행시킨다.

(단, FC layer까지는 진행하지 않는다.)

 

마지막 Convolution의 결과 C x H x W가 나오는데, C는 고려하고 있는 카테고리의 수이다.

그리고 argmax를 처리하게 되면 각 픽셀 단위로 어느 카테고리에 속하는지를 추정할 수 있다.

 

이를 바탕으로 각 픽셀에 대해 Loss를 구하고, 이를 backpropagation을 통해 훈련시켜주면 된다. (당연히 위 작업은 Supervied learning이므로 각 pixel별로 labeling된 data가 존재하고, 이를 바탕으로 loss를 계산하는 것이다.) 

 

대략 이런 느낌으로 loss를 계산하게 된다.

$$L = \frac{1}{N} \sum\limits_{i = 1}^N L_i$$

 

다만, 위 방식으로 진행하게 되면 spatial size를 유지해야하는 문제떄문에 CNN을 처리하는 과정에서 연산량이 매우 많아지는 문제점이 발생하게 된다.

이에 대한 해결방법으로 등장한 개념이 downsampling과 upsampling이다.

(Downsampling의 경우는 spatial size가 감소시키는 작업이고, Upsampling의 경우는 spatial size를 증가시키는 작업이다..)

사진에서 볼 수 있는 것처럼, input image의 spatial size를 유지하지 않고 대칭적으로 사이즈를 줄였다가 늘리는 작업을 수행하게 된다. 이를 통해 기존보다 더 적은 연산량으로 해당 작업을 수행할 수 있게 된다.

 

Downsampling의 경우 CNN에서 학습한 것처럼 pooling이나 stride를 활용해서 처리할 수 있지만, Upsampling의 경우는 새로운 방법을 강구해야 한다.

 

Upsampling을 하는 방법은 여러가지가 존재한다.

위 사진처럼 단순히 current value에 해당하는 pixel를 넓히는 "Nearest Neighbor" 방법도 있고, 좌상단에 current value에 해당하는 value를 넣고 나머지는 0으로 initialize하는 "Bed of Nails"방법도 있다.

다른 방법으로는 "Max Pooling/Unpooling"이 잇다.

이 방식은 pooling시키는 과정에서 어느 pixel헤 해당하는 값으로 abbreviation되었는지를 기억하고, unpooling할 때 해당 위치로 복원시키게 된다.

 

기본적으로 Semantic segmentation을 할 때, pixel 사이의 관계가 최대한 유지되어야 한다. 그러나 Max pooling을 하게 되면 spatial information을 일부 잃게 되는데, Max unpooling을 하게 되면 이러한 단점을 일부 보완할 수 있게 된다.

마지막으로 살펴볼 방법은 "Transpose Convolution"이다.

 

CNN에서 살펴본 Convolution 연산과 달리, Transpose Convolution은 특정한 필터에 input값을 일종의 weight 값으로 사용해서 output값을 구하게 된다. (이 과정에서 겹치는 부분은 Sum 연산을 하게 된다.)

일반적인 Convolution 연산과 마찬가지로 Stride는 input과 output의 ratio를 결정짓는다. 다만, ratio가 일반적인 convolution 연산과 반대이기에 "Fractionally strided convolution"이라고 부르기도 한다.

Stride = 1
Stride > 1

추가적으로 Transpose Convolution이라고 부르는 이유는 위 연산을 Matrix 연산으로 표현할 수 있기 떄문이다.

위 사진에서 볼 수 있는 것처럼 기존의 convolution 연산도 matrix multiplication으로 표현할 수 있고, transpose convolution 또한 matrix를 transpose한 것의 multiplication으로 이해할 수 있다.

 

또한 stride가 1인 경우에는 padding의 정도가 차이가 발생하기는 하지만, 기존의 matrix와 해당 matrix의 transpose의 sparsity pattern이 유사하기에 연산 결과가 같게 나온다. 반면 stride가 1이상인 경우에는 이런식으로 해석할 수 없다.

다시 돌아와서, 기존의 Fully Convolution의 문제점은 spatial size를 유지시킨다는 점에 있었다. 위 사진에서 볼 수 있는 것처럼 해당 문제점을 Upsampling과 Downsampling을 통해 해결하였다.

Classification + Localization

두번째로는 Classification + Localization이다.

해당 작업은 기존의 Classification만 수행하는 것이 아니라, 물체가 어딨는지 알고 싶은 것이다.

유의해야할 지점은, 뒤에서 다룰 Object detection와 Instance segmentation과 달리 정해진 개수의 object의 위치만을 다룬다.

기본적인 학습과정은 다음과 같다. 기존에 학습한 CNN을 Transfer learning으로 가져오고, 2개의 갈래로 나누어 학습한다.

위 방향은 기존의 CNN의 마지막 layer의 과정을 그대로 밟은 과정이고, 아래의 경우에는 차원이 4인 subspace로 축소시켜서 x, y, w, h를 학습시킨다. 이 과정에서 2개의 loss가 발생하는데 hyperparameter를 통해 2개의 loss 사이의 가중치를 조정한다. (단, 해당 parameter는 loss에 직접적으로 작용하는 변수이므로 고르기가 힘들다는 문제점은 존재한다.)

 

추가적으로 Semantic segmentation의 경우와 마찬가지로 loss를 구하기 위해서는 주어진 image에 대한 label값, x, y, w, h가 주어져야 한다.

Human pose estimation의 경우도 14개의 joint position의 위치를 통해 loss를 구하고 이를 concat해서 Total loss를 구할 수 있다.

이를 backprop을 시킴으로써 human pose를 예측하는 모델을 훈련할 수 있다.

Object Detection

세번째로는 Object Detection이다.

해당 작업은 fix set of category가 있는 상태에서 이미지가 주어졌을 때, 해당 category에 해당하는 object에 box를 칠하고 classification을 수행하는 것이다.

정의만보면 Classification + Localization이 하는 일과 유사하게 느껴질 수 있으나, 위 작업은 output값이 이미지에 따라서 달라질 수 있고 classification + localization의 경우는 output값은 고정되어있다는 점에서 차이를 가진다.

 

이를 수행하는 방법은 크게 2가지가 존재한다.

Sliding Window

Semantic segmentation때와 비슷하게 small crop을 옮겨가면서 이를 CNN에 넣고 classification을 수행한다. 이 방법의 문제점도 마찬가지로 Computationally expensive하다는 것이다. 따라서 실제로 위 방식을 활용해서 Object detection을 수행하지는 않는다.

Region Proposal

위 방식은 물체가 있을만한 위치를 2000개 정도 proposal해주는 것을 바탕으로 Object detection을 수행하는 것이다. 2000개 정도만 확인해주면 되므로 Sliding window보다 효율적으로 접근할 수 있다. 또한 해당 proposal의 경우 CPU에서 연산되기때문에 상대적으로 매우 빠른 속도로 제공된다는 장점이 존재한다.

 

해당 Proposal을 활용해서 Object detection을 수행하는 기법인 R-CNN을 살펴보도록 하자.

R-CNN

대략적인 과정은 다음과 같다.

Input image를 대상으로 region proposal을 수행한다. 해당 영역을 각각 CNN을 통과시키고 classification을 수행하고 실제값과 비교해서 loss를 계산해주면 된다. 다만, CNN의 경우 input image의 size가 고정되어있으므로 Warped image regions에서 이를 일괄적으로 조정한다. Bounding box의 위치는 Regression을 통해 학습함으로써 조정한다.

 

하지만, 2000여개나 되는 input값이 각각 CNN에 집어넣어야하므로 연산량이 매우 크다는 단점이 존재한다.

이러한 문제점을 해결한 모델이 Fast R-CNN이다.

Fast R-CNN

기본적인 paradigm 자체는 R-CNN와 유사하나, input image에 대해 미리 CNN연산을 수행해서 연산량을 줄이게 된다.

즉, Feature map을 먼저 얻고 이를 바탕으로 region proposal을 수행하는 것이다. 이후 과정은 R-CNN에서 살펴본 것처럼 region proposal을 "Rol pooling" layer를 통해 이미지의 spatial size를 맞추고 이를 FC layer에 통과시킨다. 1개는 classification에 대한 loss를, 나머지 1개는 bounding box에 대한 loss를 계산한 뒤 backprop을 통해 모델을 훈련시킨다.

 

이 모델을 통해 R-CNN에서 CNN 연산을 여러번 처리해야한다는 문제점을 해결할 수 있지만, 실행시간이 "region proposal"에서 결정된다는 문제점이 발생하게 된다.

 

이러한 문제점을 해결한 모델이 Faster R-CNN이다.

Faster R-CNN

이 모델의 경우 Region proposal network 자체를 해당 모델 내에서 처리하므로, region proposal을 GPU 내부에서 수행할 수 있게 된다. 따라서 기존의 CPU에서 처리해서 발생하는 bottleneck을 해결할 수 있게 된다.

위 사진에서 볼 수 있는 것처럼, RPN과 detector 모두 CNN의 결과 나온 feature map을 공유하므로 이를 공유하자는 개념에서 Faster R-CNN이 출발하였다. 이를 통해 연산량을 많이 감소시켰다.

 

loss는 총 4개가 나오는데

2개는 RPN에서 나오는 loss이다. object인지 아닌지 구분하는 binary classification에 의한 loss, box의 x, y, h, w값에 해당하는 값에 대한 loss가 존재한다. 나머지 2개는 detector에서 나오는 loss이다. object classification에 의한 loss, 최종 box 위치에 대한 loss가 존재한다. 

Instance Segmentation

마지막으로는 Instance Segmentation이다.

해당 작업은 이미지가 주어졌을 때, 위치와 특성을 파악하고 싶은 것이다. Object detection과 혼동하기 쉬우나 bounding box를 기준으로 하지 않고, segmentation mask를 기준으로 구분한다. 직관적으로는 Semantic segmentation + Object detection으로 이해하면 된다.

Mask R-CNN

앞에서 다룬 모든 것을 결합한 것이라고 생각해주면 된다. 전체 이미지를 CNN에 통과시키고 이를 기반으로 region proposal network도 학습한다. 이렇게 뽑아낸 region proposal에서 segmentation mask를 예측한다. 즉, 각 proposal region에 semantic segmentation 처리하는 느낌으로 이해해주면 된다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.