cs231n/내용 정리

cs231n - 11강 - Detection and Segmentation

미미수 2021. 7. 7. 14:45

CS231n 11강 의 주제는 Detection and Segmentation이다.

 

여태까지는 Deep-Learning의 basic과 Image classification task를 중점적으로 다뤘다. 

하지만 Computer Vision field에는 Image Classification 외에도 다양한 task들이 존재한다.

오늘은 그 중에도 Segmantation, Localization, Detection에 대해 다뤄보겠다.

 

 


Semantic Segmentation

: 이미지의 픽셀들이 어떤 클래스에 속하는지 예측하는 과정

 

 

Classification이 어떠한 객체를 단위로 분류했다면,

Semantic Segmentation은 픽셀 단위로 분류한다.

모든 픽셀은 각자가 속해 있는 클래스 값을 가진다.

 

그리고 SS도 Classification과 마찬가지로 미리 클래스의 수와 그 종류를 정해 놓아야 한다.

 

또한 Semantic Segmentation은 객체끼리는 분류하지는 않는다.

왼쪽 그림에서 소가 두마리이지만 소1, 소2를 나누지 않고, 둘다 소라고만 인식한다.

만약 같은 분류에 속하는 객체끼리도 구분하고 싶다면, instance segmentaion이라는 또 다른 task로 들어가야 한다.

 

 

 

 

 

그렇다면 Semantic Segmentaion은 어떻게 하는걸까?

1. Sliding Window  ❌

Classification처럼 이미지에 sliding window 기법을 사용하면,, 될수도 있다.

하지만 이 방법은 아래와 같은 이유로 사용되지 않는다. 

 

 

첫째, Computational Cost가 매우 높다. 

각 pixel 마다 pixel중심으로 crop을 진행한다. → CNN에 crop한 이미지들을 전부 넣는다 ?!

연산이 급격히 많아진다. 

 

둘째, Sharing computation이 고려되지 않았다.

각 pixel마다 crop을 진행했을때, 이웃 pixel들은 crop한 영역이 필연적으로 겹치게 된다. 

하지만 이 중복되는 computation에 대한 처리가 없어 효용이 떨어진다.

 

그 외에도 국소적으로 부분부분 탐색하기 때문에 이미지 전체의 context정보를 간과한다는 단점이 있다.

 

2. Fully Convolutional  

이미지 한장을 CNN에 통째로 통과시키는건 어떨까?

 

spatial resolution을 유지하면서 레이어들을 통과시키다 보면 final output으로 CxHxW vector를 얻을 수 있다.

여기서 C는 클래스의 개수이다. 즉 HxW의 모든 pixel은 class $C_i$에 해당하는 점수를 갖는다.

 

그러나 training data 한장을 만드는데 오래걸리고, high resolution을 끝까지 유지한다는 점에 있어서 computational cost가 너무 부담스러워지는 문제가 발생한다.

 

 

3. Fully Convolutional  with downsampling / upsampling  ⭕️

 

원본 resolution(해상도)에서 시작해 downsample을 몇차례 거치면서 해상도를 낮추다가, 중간부터는 다시 upsampling으로 해상도를 올리는 방식이 효과가 좋다. 이렇게 되면 위에서 말했던 resolution을 계속 크게 유지하는데에서 오는 computation cost문제를 어느정도 해결할수가 있다. 중간 단계에서는 낮은 resolution을 사용하지만 input과 output의 사이즈가 결과적으로 동일하기 때문이다. 

 


Upsampling

Downsampling에는 max-pool, average-pool 등이 있지만 Upsampling은 어떻게 하는걸까?

2x2 → 4x4 Stride:2

 

[Nearest Neighbor]

이웃한 픽셀들에 복사를 한다.

 

 

 

 

 

 

[Bed of Nails]

왼쪽 위 코너에 픽셀값을 복사해 넣고 나머지는 0으로 채운다.

 

 

 

 

 

 

 

[Max Unpooling]

 

Max Unpooling

앞선 Pooling layer에서 선택되었던 자리를 기억해, Unpooling 단계에서 해당 자리에만 픽셀값을 전달하는 방법.

주의해할점은 각 Pooling layer가 짝이 맞아야 한다. Pooling은 앞에서부터 1~n번, Unpooling은 뒤에서부터 1~n까지.

 

Sematic Segmentation에서 Unpooling 기법이 중요한 이유는, 픽셀이 하나하나 분류되기 때문이다.

클래스의 Boundary가 나눠지는 경계 픽셀이 분명히 존재할건데, 그 boundary를 제대로 구별하려면 더 꼼꼼해야 한다. 

더군다나 down sampling과정에서 이미 정보 손실이 일어났기 때문에, 손실을 조금이라도 메꾸기 위해서는 자리라도 기억해 Unpooling을 조금이라도 더 정확하게 해야 한다.

 

 

[Transpose Convolution] : Learnable Upsampling

 

filter 3x3, stride 1, pad 1

Transpose Convolution은 upsampling방식의 일종으로 input이미지의 값을 filter전체에 곱해서 더하는 방법이다,

위 그림을 예시로 들어 설명하자면, input(파랑색)의 각 pixel을 3x3필터에곱한다. 그럼 필터사이즈만큼의 벡터가 나오는데 이를 지정한 stride만큼 움직이면서 sum up 해서 output을 만든다. 이때 겹치는 부분은 서로 더해준다.

 

Transpose Convolution은 Conv 과정에서 upsampling을 동시에 진행하기 때문에, upsampling에 parameter(weight)가 관여하게 되고, 이는 upsampling을 learnable 하게 해준다.

1D Vector Transpose Conv

 


Classification + Localization

 

 

Classification task를 수행할때는 왼쪽 이미지를 'Cat'이라고 분류한다.

여기에 Localization task를 추가하면 'Cat'이 어디에 위치해있는지

를 Bounding box를 그려 파악한다.

 

한마지로 Localization은 oject가 어디에 있는지를 파악한다.

 

 

 

 

방법은 Classification 과정과 비슷하다.

위의 예시를보면 input은 우선 AlexNet을 거쳐 FC layer를 마지막에 만나게 된다.

이때 Box coordinates는 4개의 값이 필요하니, Fully connected Layer는 4096 to 4로 vector를 바꾼다.

 

그럼 두개의 Loss가 생기는데 이런 경우를 Multitask Loss라고 한다.

 

Multitask Loss

대개의 경우, Loss에 따라 경사하강을 얼만큼 할지가 정해지는데, 기준이 되는 Loss가 두개일때는 어떻게 해야될까?

 

그럴땐 따로 Hyperparameter를 두어서 각각의 loss를 반영할 비율을 정해줘야 한다.

하지만 이 hyperparameter를 정하는게 쉽지 않다. 보통 hyperparameter를 정할땐 실험적으로 다양한 조합으로 test를 하면서 Loss가 어떻게 변하는지 관찰을 한다. 하지만 weighting hyperparemeter의 경우, loss의 절대값에 곱해지는 값으로 Loss의 scale에 직접적으로 관여하기 때문에 Loss끼리의 비교가 불가능하다.

 

이런 경우에는 보통 model을 평가할수 있는 다른 metric을 두어서, 그 Metric을 기준으로 hyperparameter를 고르는 방법을 택한다.


 

 

Object Detection

 

 

Object Detection은 한 이미지 내에서 object를 탐지하고 그게 어떤 Class에 속하는지까지 정한다.

그냥 Classification과 마찬가지로 Class의 종류를 미리 정의해야 한다는 공통점이 있지만,

여태까지 하나의 이미지에 하나의 object만 있던것과는 달리 Object Detection은 감별해야할 Object가 몇개인지 정해져 있지 않다

 

1. Regression ❌

Output의 개수가 정해져 있지 않기 때문에 문제는 더 어려워 진다.

더군다나 각 물체의 좌표를 Regression으로 예측하는것도 까다롭다.

 

2. Sliding Window 

Sliding Window를 사용해서 각 crop 마다 어떤 Class에 속하는지 하나하나 분류할수도 있다. 하지만 어떤 좌표에서 어떤 크기로 crop을 할지 정하는게 매우 어려우며 모든 경우의 수를 다 해보는건 불가능에 가깝기 때문에 Sliding window방식은 사용하지 않는다.

 

3. Region Proposal (Not DeepLearning) ❌

Region Proposal은 DL은 아니지만 network에서 많이 활용되는 방법이다.

이미지에서 뭔가 Blobby한 뭉탱이(?)가 있는 부분을 감지해서 여기에 물체가 있는거같다! 라고 예측이 되는 region을 1000~2000개 정도 뱉어낸다. 그럼 높은 확률로 2000개의 region중에 물체가 있다고 한다.

 

 

4. R - CNN 🔺

1. 위에서 본 Region Proposal 방식을 사용해 ROI. Reason of Interest를 추출한다.

☞ crop된 region의 사이즈는 다 제각각이다. 따라서 region들을 동일한 사이즈로 warp, 일반화 시켜주는 과정이 필요하다.

 

2. 각각의 warped된 region은 이유 Conv Net을 거쳐 classifiy 된다.

 

3. Region이 detect를 가능하게 도와줄진 몰라도 해당 region이 object Boundary를 정확하게 커버하고 있지 않을 수 있다. 

따라서 마지막에 Bounding Box를 수정해서 완벽하게 하는 과정이 필요하다.

 

하지만 Training이 느리고 testing시에도 하나의 input에 30초씩 걸리는둥 단점들이 조금 치명적이다..

그래서 등장한게 Fast R-CNN!

 

5. Fast R - CNN ⭕️

얘는 이미지를 통째로 COnv Net에 넣어 추출한 feature map에서 ROI를 추출한다. 나머지 과정은 R-CNN과 동일하다.

하지만 역시나 문제점은 있었고,,

 

 

보다시피 Fast R-CNN이 일반 R-CNN보다 훨씬 빠른걸 알 수있다, 그림에는 없지만 Training도 대략 10배정도 빠르다. 이는 바로 ConvNet이 shared components를 효율적으로 처리하기 때문이다. 근데 이렇게 되다보니 Region Proposal(파란색)에 걸리는 시간이 나머지 시간보다 몇배는 오래걸리게 되었다.

 

 

 

 

 

6. Faster R - CNN ⭕️⭕️⭕️

그래서 또한번 등장한게 Faster R-CNN이다. 얘는 Region Proposal을 Network로 따로 만들어 전체 Network내부에서 처리하기 때문에 Fast R-CNN처럼 Region Proposal에 걸리는 시간때문에 bottleneck(병목현상)되는 현상이 발생하지 않는다. 

 


Instance Segmentation

Semantic Segmentation 과 Object Detection의 hybrid task.

각각의 object가 어떤 class에 속하는지 + 각 pixel이 어떤 class에 속하는지로 객체의 종류와 위치를 파악한다.