본문 바로가기

Machine Learning

[CS231n] 11. Detection and Segmentation

이번 강에서는 Image detection 과 Image Segmentation분야의 여러 문제들과 이에 사용되는 네트워크 구조를 알아볼 것입니다. 엄청나게 방대하고 현재도 활발한 분야이기 때문에 각각에 대해서 간략한 소개 정도만 하게 됩니다.

1. Semantic Segmentation

Semantic Segmentation

Semantic segmentation이란 위 그림처럼 한 그림 안에서 각 영역을 나누는 분야입니다. 

- Approach 1. Sliding Window

Sliding Window for Segmantic Segmentation

우선 가장 먼저 생각할 수 있는 방법 중 하나는, 적당한 크기의 window 를 설정하고 이 window로 이미지를 처음부터 끝까지 훑으며 모든 위치에서 이 window안의 이미지를 classification 을 하는 CNN에 넣어주는 것입니다. 가능은 하겠지만 window를 이동시키다 보면 엄청나게 많은 픽셀이 겹치게 되고, 계산량이 엄청나게 많아지게 되서 사용하지 않는 방법입니다.

- Approach 2. Fully Convolutional

Fully Convolutional Network for Semantic Segmentation

두번재 아이디어는 이미지 전체를 same padding을 통해서 이미지의 크기를 유지하며 계속 Convolution Layer에만 통과시켜서 마지막에는 크기는 이미지와 같고, depth로는 각 class 에 따른 channel 이 존재하는 3차원 배열을 output으로 얻은 뒤 이 값이 max 인 인 class 인 channel 을 선택하는 것입니다. 하지만 이 방법도 이미지 전체를 계속 convolution 해야하기 때문에 이미지가 고화질이 되면 계산량이 너무 많아지게 됩니다.

- Approach 3. Upsampling

Semantic Segmantation with upsampling

앞의 두 방법이 너무 많은 계산량을 요구했기 때문에 생각한 방법이 downsmapling 과 upsampling을 이용하는 것입니다. Downsampling을 통해서 데이터 크기를 줄인뒤에 computational 한 이점을 가진 상태로 여러 단계를 거쳐 계산해 주고, 나중에 다시 upsampling을 통해 필요한 원래 크기의 output을 얻겠다는 것입니다. Classification에서 했던 downsampling을 그대로 하고, 그대신 원래 downsampling 의 효과가 있는 pooling과 stride 가 1보다 큰 convolution 을 역으로 하는 것입니다.

- Unpooling

Unpooling

우선 pooling 을 반대로 해주는것을 unpooling이라고 합니다. 그림에서 보듯이 nearest neighbor 방법은 같은 값으로 unpooling한 만큼 다 채워주는 것이고, bed of nails 는 값을 무조건 좌측 상단 끝에 놓고 나머지를 모두 0으로 채워주는 방법입니다.

Max Unpooling

Max Unpooling이란 앞에서 Max pooling을 하면서 사용되었던 max값의 위치를 기억해 놓았다가 뒤에서 unpooling을 할때 그 위치를 기억해서 그자리만 값을 유지해 주고 나머지는 0으로 채워주는 것을 말합니다. bed of nails보다 좀더 당위성 있어 보이는 방법입니다. 물론 이 방법은 각 unpooling 이 앞에 pooling layer에 대응되는, 대칭적인 구조의 네트워크에서만 사용될 수 있습니다.

소개한 것 말고도 여러 방법이 있겠지만 unpooling 은 pooling 과 마찬가지로 학습을 하는 layer가 아니라 그냥 처리 과정입니다. 이제 학습을 할 수 있는 layer인 transpose convolution 을 봅시다.

- Transpose Convolution

Transpose Convolution

Transpose Convolution 이란 그림과 같이 learnable한 필터에 대해서, Deconvolution 이라고도 부르는데, 엄밀히 따지면 아니기 때문에 transpose convoltuion 이라고 부르는걸 추천합니다. 사실 생각해보면 우리가 알고있는 '합성곱 연산'은 전혀 안쓰이기 때문이죠.

그럼 드는 의문이, 과연 여기에서 겹치는 부분을 합으로 처리해도 될까요? 거기만 더 값이 커지진 않을까요? 일단 굳이 Convolution Layer를 최대한 거꾸로 재현해보고자 한다면 합이 아니라 평균으로 하는게 맞겠지만, 앞에서 나왔다시피 애초에 convolution을 거꾸로 재현하는 작업은 아니기 때문에 sum이 안될 이유는 없습니다. 하지만 실제로 sum으로 할 경우 겹치는 부분만 진해져서 바둑판무늬 비슷하게 나오는 경우가 있기 때문에, 다른 방법도 많이 고안되었다고 합니다. 

2. Classification + Localization

Classification , Localization

Classifciation + Localiazation 은 말 그대로 위의 그림처럼 어떤 이미지에 대해서 어떤 물체인지 Classification을 하고, 그 물체의 Bounding Box를 찾아주는 것입니다. Bounding Box는 일단은 회전 없는 예쁜 직사각형이라고 생각합시다.

Classification + Localiazation

이 문제는 물체가 하나밖에 없는 경우에 대한 것이기 때문에 그나마 간단합니다. Classification을 할때처럼 CNN을 설계하되, 마지막에 flatten 후에 output을 2개의 fully connected layer에 넣어주면 됩니다. 하나는 classification 을 위한 network이고, 하나는 bounding box의 위치와 가로세로 크기를 나타내는 output을 출력해주는 network 입니다. 여기에서 보이기보다 어려운 점이라면 classification에는 softmax loss (cross entropy loss)가 쓰이고 boudning box에는 L2 loss(L1, smooth L1 도 가능)이 쓰이는데, 이 두 cost function에 weight을 줘서 최종 cost function 을 계산해야 합니다. 그러면 이제 이 weight을 hyper parameter 로서 설정해야 하는데, 다른 hyperparameter들은 보통 조정해가며 cost function이 잘 줄어드는가를 보며 조정하는데, 이 weight들은 cost function의 scale자체에 직접적인 영향을 미치기 때문에 이렇게만 하기가 어려운 것입니다. 따라서 network의 다른 값들을 좀더 보면서 최적화를 해야 합니다.

3. Object detection

Object Detection

Object Detection 은 앞에 봤던 Classification+ Localization인데, 한 이미지 안에 물체가 여러개 있는 경우까지 처리해야 하는 문제입니다.

- Approach 1. Sliding Window

앞에 semantic segmantatino에서처럼, 가장 단순하게 생각할 수 있는 방법은 window를 이동시키며 일일히 classification CNN에 넣어주는 것입니다. 그런데 이번에는 물체의 크기도 정해져 있지 않기 때문에 가능한 모든 크기의 window를 slide 해주어야 합니다. 딱 봐도 어마어마한 양의 계산이 필요하겠죠? 모든 크기의 window를 slide해야하는건 train할때뿐만 아니라 실제로 사용할때도 필요하기 때문에 train도, 실제 사용도 감당할 만한 계산량이 아닙니다. 

- R - CNN 계열

R - CNN

앞의 계산량 문제를 어느정도 해결한 것이 R-CNN입니다. R-CNN 우선 selective search 를 사용하여 computation 할만한 정도의 개수의 bounding box region을 잡아줍니다. selective search는 전혀 딥러닝적이지 않은, 전통적인 알고리즘적 방법입니다. 이 bounding reigion을 이제 같은 CNN으로 처리해줘야 하니까 모두 같은 크기로 warp 해주고, 그 후에는 앞에서 본 classification + localization 을 위한 CNN처럼 해주면 됩니다. 이제는 계산량이 감당 불가능할 정도는 아니지만, 이래도 여전히 꽤 느리다고 합니다.

Fast R-CNN

그래서 R-CNN에서 계산량을 더 줄인것이 Fast-R-CNN입니다. 우선 selective search로 bouding box region 들을 찾지만, 이 region들을 곧바로 classification CNN에 넣는것이 아니라, 이미지 전체를 convolution layer(들) 을 한번 거친 후에 앞에 찾았던 region들을 그대로 축소시켜서 feature map에 가져와서, 이제 여기에서부터 각각의 region을 classification CNN에 넣어주는 것입니다. 여기에서도 같은 CNN에 여러 크기를 넣어주기 위해서 앞에 했던 . 이렇게 하면 맨 앞단계의 Convolution을 R-CNN에서는 각 region별로 일일히 해주면서 겹치는 부분도 많이 생겼지만, fast R-CNN에서는 이미지 전체에 대해서 딱 한번만 하기 때문에 계산량이 많이 줄어들게 됩니다.

Faster R-CNN

하지만 이제 CNN 단계가 엄청나게 빨라져서 앞에서 얼마 안걸리는것 같았던 전통적인 알고리즘적 selective search가 bottleneck이 되어버렸습니다. 그래서 이제는 이것도 네트워크가 학습하도록 했습니다. 이미지 전체를 어느정도 Convolution 을 시키고, 여기에서 나온 feature map을 region 을 예측하기 위한 network 에 넣어주고, 이 결과를 가지고 나머지는 Fast-R-CNN 처럼 해주면 됩니다. 이제는 네트워크 두개에 대해서 classification 과 regression을 해야 하기 때문에 이 loss들에 대한 weight 설정이 아주 중요하고 어렵습니다.

4. Instance Segmantation

Instance Segmentation은 지금까지 나왔던 문제들이 다 합쳐진 것이라고 보면 됩니다. 각 object 를 분리/분류하고 segment를 나눠주면 됩니다.

따라서 네트워크 구조도 앞에서 본 방법들을 결합하면 됩니다. 아주 최근에 나온 Mask R-CNN 의 구조는 Faster R-CNN과 거의 유사하지만, 마지막에 classification+localization을 하는 부분을 mask를 그리는, 즉 semantic segmantation을 하는 네트워크로 바꿔주면 됩니다. 

오늘 살펴본 분야들의 특징 한가지는 데이터셋 생성이 아주 어렵다는 것입니다. 사람이 열심히 박스 그리고 segmentation 그리고 해야 하니까요. 오늘은 데이터셋을 공개해주는 모든 분들께 감사하며 여기서 마치겠습니다.