[cs231n-lec12] Detection and Segmentation

10 minute read

최종 수정일 : 2019-11-22

이 포스트는 스탠포드의 cs231n 12강 강의를 보고 공부 및 정리한 포스트입니다.
잘못된 것이 있을 수 있습니다.
댓글로 알려주시면 감사합니다!

Computer Vision Tasks

computer vision tasks

지금까지 Neural Network 를 이용해 이미지 속에 있는 물체가 무엇인지 판별하는 것을 학습했다.

컴퓨터 비전에 있어서 이는 단순한 작업이고, 해야할 것들이 더 남아있는데 위의 예시들이 바로 그것을 짧게 요약한 것이다.

물체를 분류하는 classification.
각 부분이 무엇을 의미하는지 구별하는 semantic segmentation.
이미지 속에 있는 물체를 구별하고 위치까지 표현하는 object detection.
pixel 단위로 object detection 을 수행하는 instance segmentation.

그 중 object detection 과 instance segmentation 은 여러 물체에 대해서 작동해야하는 것을 볼 수 있다.

하나씩 살펴보자.

Semantic Segmentation

semantic segmentation

semantic segmentation 에서는 각 pixel 에 대해 category 를 나누게 된다.
즉, 물체(object)와는 상관이 없이 pixel 단위로 segmentation 이 이뤄진다.

semantic segmentation idea sliding window

segmentation 을 하는 방법에 sliding window 기법이 있는데, 일정한 크기의 patch 를 원본 이미지와 쭉 비교해보면서 해당 부분의 pixel 이 어떤 category 값을 가지는지 확인한다. 즉 매 번 CNN 을 통과시키게 된다.

이는 매우 비효율(computational cost 가 큼)적인 방법인데, 중복되는 patch 들 간의 공유된 feature 를 재사용하지 않는다.

semantic segmentation idea fully convolutional

위에 나타난 sliding windows 기법의 단점을 극복하기 위해 전체 이미지를 convolution 하는 방법을 고안하게 되었다. 3x3 filter 를 이용해 이미지 크기를 유지하면서 convolution 을 수행하여 한 번에 이미지 전체를 CNN 에 넣을 수 있고 이를 이용해 pixel 을 한 번에 전부 예측할 수 있다.

그러나 전체 이미지를 CNN 에 통과시키는 것은 여전히 비효율적인 방법이다.입력 이미지의 spatial size 를 계속 유지해야하기 때문

semantic segmentation idea fully convolutional with downsampling and upsampling

그래서 maxpooling 또는 strided convolution 을 통한 downsampling 을 진행해서 크기를 줄인 후, unpooling 을 통해 upsampling 을 하면서 연산을 효율적이게 만들어 보게 되었다.

이렇게 하는 이유는 줄어든 spatial resolution 을 원본 크기로 맞추기 위함이다. 이 과정이 바로 upsampling 이다.

Unpooling

in network upsampling unpooling

말 그대로 pooling 을 undo 하는 것이다.
unpooling 지역의 receptive field 값을 복사해서 채워넣게 된다.

그러나 오른쪽의 경우와 같이 나머지 값이 0일 경우 매우 좋지 못한 결과(bed of nails)를 얻게 될 것이다.

Max Unpooling

in network upsampling max unpooling

Max Pooling 이 어땠는지 생각해보며 Max Unpooling 에 대해 알아보자.
이는 max 값과 위치(공간 정보)를 기억해 둔 뒤 나중에 upsampling 할 때 해당 값만 복구 시킨 후 나머지는 0의 값을 채워 넣는 것이다.

이 때 fixed function 을 사용하게 된다.

Learnable Unpooling : Transpose Convolution

learnable unpooling transpose convolution

Transpose Convolution 은 학습이 가능한 방법이다.

learnable unpooling transpose convolution

위의 방법이 일반적인 convolution 의 연산이다.
여기서 strided convolution 은 2칸(stride = 2)씩 움직인다. 출력이 한 픽셀 움직일 때 입력은 두 픽셀이 움직이게되는 것이다.

learnable unpooling transpose convolution

Transpose Convolution 은 위에서 진행된 과정의 반대이다. 입력과 출력의 크기가 반대가 된 것을 확인하자.

위에서는 내적(dot product)을 수행하였지만 여기서는 feature map 에서 값을 선택하고 선택한 scalar 값과 필터(3x3)를 곱해준다. 그리고 출력의 3x3 공간에 넣게된다.
filter 의 크기와 stride 의 크기에 의해 overlap 되는 부분이 생기게 되는데, 이 부분에 대해서는 summation 을 진행한다.

Transpose Convolution 을 어떤 논문들에서는 Deconvolution 이라고도 칭하는데, 이는 잘못된 것이다.
이 부분에 대해서는 나중에 다시 정리하자!

learnable unpooling 1d example

이것은 1차원에서 learnable upsampling 의 예제를 보여주는 것이다.

겹치는 부분인 az 와 bx 를 더해준다. az + bx

convolution as matrix multiplication 1d example

조금 더 자세한 예제를 살펴보자. 왜 이름에 convolution 이 붙는가?

convolution 연산은 행렬 곱 연산으로 나타날 수 있는데 위와 같이 계산이 될 수 있다.
위 슬라이드에서 x,y,x 가 아니라 x,y,z 가 맞다.

오른쪽은 왼쪽의 transpose conv 이다. 같은 행렬을 사용해서 행렬곱 연산을 수행했지만 transpose 를 취한 형태이다.

이렇게 되면 왼쪽은 stride 1 convolution 이고 오른쪽은 stride 1 transpose convolution 이 된다.

a vector($\vec{a}$)를 보면 4 개의 값으로 이루어져있는 것을 볼 수 있는데 이는 transpose 로 인한 것이다.

convolution as matrix multiplication 1d example

stride 1 transpose convolution 의 모양을 보면 일반적인 convolution 과 비슷하다.
padding 을 고려하게 된다면 달라질 수 있긴 한데, stride 2 일 경우는 어떨까?

왼쪽이 바로 stride 2 convolution 의 행렬곱 연산이다.stride 2 를 알 수 있는 이유는 x,y,z의 움직임이 한 칸이 아닌 두 칸인 것을 보면 알 수 있다.
만약 stride 가 1 보다 커지게 될 경우 transpose convolution 은 convolution 이 아니게 된다. 그 표현이 어떻게 되는지 생각해보면 알 수 있다.
따라서, stride 2 가 되었을 경우 normal convolution 과는 다른 연산이 되게 되었다. 그래서 이름을 transpose convolution 이라 칭하게 되었다.
여기서 a vector($\vec{a}$) 를 볼 때 transpose 만큼 값이 2개 뿐이다. 이것 때문인듯 싶다.

이에 대한 보충자료는 여기에서 더 확인할 수 있다.

Object Detection

object detection impact of deep learning

Object DetectionClassification + Localization 이라고 볼 수 있다.
이미지 안에 있는 객체를 분류하고 그 위치까지 판별해야하는 문제이고 그 위치를 범위로써 나타내야한다.

이 때, localization 은 이미지 안에 물체가 하나만 있는 경우를 상정한다.

object detection single object

FC layer 가 하나 더 있는 것을 볼 수 있는데 이는 x, y, w, h 로 bounding box 의 위치를 의미한다.
이로써 두 개의 값을 출력하게 되는데 하나는 class score 가 되고 나머지는 위의 bounding box 의 정보가 된다.

학습을 진행할 때는 두 loss 를 학습하게 되고 이것이 Multitask Loss 가 된다.

이 때 CNN 구조를 통과시키게 되는데 처음부터 학습하는 것은 쉽지 않고 효율적이지도 않으므로 보통 ImageNet 의 pre-trained 모델을 사용한다.앞서 배웠던 transfer learning 을 상기하고 가자.

obejct detection multiple objects

Object Detection 은 Computer Vision 에서 핵심적인 task 이다.
특히 우리는 이미지에 하나의 물체만 담지는 않으므로 보통의 이미지에는 다양한 물체들이 있을 수 있다.

앞서 보았던 Localization 과의 차이점은 Object Detection 에서는 Multiple Object 에 대해 작업을 수행한다는 것이다.

첫 이미지에서 보듯 고양이가 한 마리만 있는 이미지라면 bounding box 는 4개의 숫자로 이루어진 하나만 나오면 되겠지만,
두 번째 이미지에서 보듯 두 마리의 강아지와 한 마리의 고양이가 있다면 이는 세 배가 되게 될테고,
마지막 오리 사진을 본다면 정말 많이 필요하게 될 것이다.

object detection multiple objects with sliding windows

다른 모양의 crop 을 이용해 object 인지 background 인지 sliding window 기법을 통해 훑어서 판별을 해 볼 수 있다.

obejct detection multiple objects

그러나 앞에서 본 애니메이션의 경우는 아주 최적화된 순서라고 볼 수 있는데 실제 이미지에는 어느 위치에 어느 정도의 크기로 물체가 존재하게 될지 모르고, 이는 아주 많은 경우의 수를 시도해보아야 원하는 물체의 위치를 판별할 수 있게 되는 것이다.

마치 위의 파란색 영역 같이 생각해 볼 수 있다.

region proposals selective search

이를 해결하기 위해 deep learning 이전에서 사용했던 방법 중 하나인 Selective Search 라는 기법이 있다.
물체가 있을 만한 ‘후보 영역’을 ~2000개 가량 생성해서 해당 위치만 물체인지 아닌지 판별하는 방식이다.

위의 아주 많은 경우의 수에 비해 연산량을 많이 줄이긴 했으나 여전히 2000개도 많은 영역이긴 하다.

R-CNN

고전적인 방법으로 Object Detection 을 수행했을 때 성능은 그리 좋지 않았다. 그러다가 CNN 기법을 이용한 Object Detection 이 등장하게 되었는데, 차례로 살펴보자.

rcnn

R-CNNCNN 기법을 Object Detection 에 최초로 접목시킨 모델이다.
Selective Search 를 이용해 ~2k 개의 region proposal(bouding box) 을 생성한다.

rcnn

이 영역들의 크기는 각기 다르므로 모두 동일한 size 를 갖게 crop & warp 를 진행한다.

$224 \times 224$ 의 크기로 만들게 된다.

rcnn

이제 이 이미지들을 ConvNet 에 통과시키게 된다.

그 후 나온 결과를 SVM 을 통해 분류하게 된다.

rcnn

이렇게 나온 결과는 bounding box 가 정확하지 않기 때문에 regression 을 통해 조정을 하여 정확한 영역을 계산하도록 한다.

rcnn

이는 굉장히 느린데(K40 으로 training 에 84시간) 이는 각각의 이미지가 ConvNet 을 통과하는데 엄청난 연산이 필요하기 때문이다.

다행히 이 느린 R-CNN 의 문제를 해결하기 위한 방법이 있다.
각각의 이미지를 ConvNet 에 넣는 것 말고 convolution 과 $224 \times 224$ 의 이미지를 얻는 순서를 바꾸는 것이다.

Fast R-CNN

fast rcnn

Fast R-CNN 에서는 backbone network 로 AlexNet, VGG, ResNet 등을 사용하였으며 input image 를 한번에 ConvNet 에 넣게 된다. 이를 통해 feature map 을 먼저 얻을 수 있고 여기서 region proposal 을 진행하게 되는데, Fast R-CNN 에서는 RoI Pool 이라는 개념을 도입했다.

필기가 되어있네..?

fast rcnn

이렇게 얻은 후보 영역들에 대해 crop + resize 를 진행하게 되고,

fast rcnn

CNN 구조에 후보 영역들을 통과시켜서 물체의 분류는 linear + softmax 로, box offset 은 linear 로 처리하여 계산한다.

RoI Pool

cropping features roi pool

Fast R-CNN 에서 region proposal 을 수행하기 위해 도입한 RoI Pool 에 대해서 알아보자.

먼저 이미지를 CNN 에 통과시켜 격자화된 feature map 을 얻는다.

그리고 여기서 해당 물체가 있는 박스를 grid 상에 위치시킨다.

cropping features roi pool

grid 는 현재 격자화된 상태이기 때문에 박스를 snap 하여 grid 의 격자에 맞춰 위치시킨다.

cropping features roi pool

이를 적당히 4등분(roughly equal subregion)하여 max-pool 을 진행하면 2 by 2 region 이 새롭게 나오게 된다.

여기서는 예시를 2 by 2 로 했으나 실제 논문에서는 7 by 7 을 하였다.

RoI Align

RoI Align 에 대해서도 알아보자.
RoI Pool 에서는 격자화된 grid 에 이미지 박스를 맞추느라 약간의 오차가 생긴다는 것을 눈치챌 수 있다.
이러한 오차를 줄이기 위해 고안한 방법이 바로 RoI Align 이다.
이는 RoI Pool 처럼 이미지 박스를 맞추는 과정 없이 해당 위치 그대로 사용하게 된다.

cropping features roi align

우선 이미지를 CNN 에 통과시켜 feature map 을 얻는다.
이번에는 snapping 과정을 거치지 않고 그대로 둔 상태에서 subregion 을 나눈다.

이 때, 각 subregion 에 대해 다시 subregion 을 나누게 되는데 위의 이미지에서 보다시피 각 subregion 에 4개의 점이 있는 것을 볼 수 있다.
이 점이 나타내는 값을 구하게 될 것인데, 이를 구하는 방법으로 bilinear interpolation(쌍선형보간) 을 사용한다.

cropping features roi align

하나의 초록색 점은 다음과 같이 bilinear interpolation 으로 계산된다.
해당 점의 인접한 네 개의 grid cell 의 점수로부터 결과값이 나타나게 되는데,

cropping features roi align

\[f_{xy} = \sum_{i,j=1}^2f_{i,j}\max(0,1-|x-x_i|)\max(0,1-|y-y_j|)\]

위와 같은 수식을 이용해 계산할 수 있다.

cropping features roi align

이렇게 각 값을 계산한 후 max-pool 을 통해 값을 추출한다.
마찬가지로 예시에서는 2 by 2 로 나왔지만 실제로는 7 by 7 로 진행되었다.

조금 더 정리한 것은 여기에서 확인할 수 있다.

rcnn vs fast rcnn

RoI Pool 을 이용한 Fast R-CNN 은 다음과 같이 20배 가량의 성능 향상을 이루어냈지만 region proposal 을 포함했을 경우가 포함하지 않았을 때보다 확실하게 느리다는 것을 확인할 수가 있다.

이 문제를 해결하기 위한 방법 역시 존재하는데, Region Proposal Network(RPN) 을 사용한 Faster R-CNN 이 바로 그 모델이다.

Faster R-CNN

fatser rcnn

Faster R-CNN 에서는 region proposal 을 위해 RPN 을 사용하는데 이는 feature 들로부터 proposal 을 예측하는 네트워크 이다.

그 외 나머지 구성은 Fast R-CNN 과 동일하다.

Region Proposal Network

Region Proposal Network 에서는 anchor box 라는 개념을 사용한다.

region proposal network

anchor box 는 sliding window 의 각 위치에서 bounding box 의 후보로 사용되는 크기가 미리 정의된 상자이다.

그림에서 보다시피 3 by 3 anchor 를 사용할 수 있는데, 좀 더 자세히 언급하자면 3개의 종횡비과 3개의 크기를 가지는 anchor 를 사용했고 이는 총 9개의 anchor box 임을 알 수 있다.
이들 anchor box 는 같은 중심을 같는 것을 알고 넘어가자.

region proposal network

이러한 anchor 박스를 이용해 물체인지 아닌지는

  1. 가장 높은 IoU(Intersection over Unit)를 가지는 anchor
  2. IoU > 0.7 을 만족하는 anchor

로 positive labeling 처리를 해줄 수 있다.

region proposal network

positive box 에 대해서는 regression 을 통해 좀 더 정확한 위치를 찾을 수 있도록 해준다.

region proposal network

실제로 논문에서는 $k$ 개의 anchor box 를 이용해 물체/배경을 판단하는 $2k$ 개의 classification 출력과 $4k$ 개의 박스의 위치를 조정하는 regression 출력을 얻게 된다.
이 때 $k=9$ 이다.위에서 언급한 3개의 종횡비(2:1, 1:1, 1:2), 3개의 크기(128, 256, 512)

fatser rcnn test time speed

이렇게 만든 Faster R-CNNFast R-CNN 의 문제점인 region proposal 에서 효율적인 모습을 보이며 위와 같은 성능의 향상을 가지고 오게 되었다.

fatser rcnn

Faster R-CNN 의 구조를 다시 한 번 봐보자.
이는 Two-stage object detector 인데,

  • first stage : 이미지당 한 번 작동
  • second stage : 영역(region)당 한 번 작동

하게 된다.

여기서 우리가 정말 second stage 가 필요한 것일까?

Single-Stage Object Detectors

한 번에 Object Detection 을 수행하게 하면 어떨까?

그런 관점에서 문제를 푸는 것이 바로 Single-Stage Object Detection 이다.

single stage object detectors

대표적으로 YOLOSSD 가 있는데, 이들은 input image 한 번에 탐색하여 결과값을 출력하게 된다.
그림에서 보듯 7 by 7 grid 로 만든 후 base box 를 이용해 결과를 낸다.

이 때 R-CNN 계열과는 다르게 5개의 출력값이 나오는데, x, y, w, h 에 confidence 값이 추가되었기 때문이다.

도식이 RPN 과 비슷하게 나타났지만 single-stage 기법은 category-specific 하게 처리하는 것이 차이가 있다.

object detection

Object Detection 은 다양하게 변화가 가능한데 구조에 있어서 각기 변경할 부분들이 많이 있기 때문이다.

일반적으로 bigger/deeper backbone network 를 활용할 경우 성능이 좋게 나타난다.

그러나 항상 speed / accuracy 간의 trade-off 는 존재한다.

Instance Segmentation: Mask R-CNN

이제 Instance Segmentation 에 대해서 알아보자.

mask rcnn

여기서 사용한 모델은 Mask R-CNN 인데 mask network 를 각 RoI 에 추가해서 $28 \times 28$ 의 크기를 갖는 binary mask 를 생성하게 된다.

mask rcnn

그 구조는 다음과 같다.

이미지를 CNN + RPN 에 통과시켜 region proposed 된 feature map 을 얻는다. 그 후 roi align 을 통해 $256 \times 14 \times 14$ 의 feature map 으로 만든 후 각각의 Class C 에 대한 mask 를 얻는다.

mask rcnn

예시를 보자.
각 물체에 대한 마스크는 다음과 같이 의자, 사람, 침대 등으로 나타날 수 있다.

mask rcnn

이렇게 구현된 Mask R-CNN 의 성능은 상당히 놀라운데, 위의 결과를 보면 다양한 물체들에 대해 아주 잘 segmentation 한 것을 볼 수 있으며, 첫 번째 사진에서 멀리 뒤에 서있는 많은 사람들에 대해서도 segmentation 을 해낸 것을 볼 수 있다.

mask rcnn

또한 포즈에 대해서도 제대로 동작하는 것을 볼 수 있다.

Aside

그 외에도 다양하게 발전해나가고 있다.

dense captioning

object detection 과 captioning 을 결합해 dense captioning 이라고 하는 여러 물체에 대한 caption 을 나타낼 수도 있다.

dense captioning

이는 dense captioning 의 동작 과정이다.

scene graphs

장면에 대한 graph 연결을 실시하여 mapping 을 하는 노력도 있다.

3d object detection

이렇게 mapping 된 정보를 활용해 여러 caption 을 동시에 진행할 수도 있다.

3d object detection

3차원 물체에 대한 탐지도 가능한데, 2차원 물체에 대해서는 (x,y,w,h) 의 정보를 이용했다면, 3차원에 대해서는 (x,y,z,w,h,l,r,p,y) 로 더 많은 정보를 사용해 bounding box 를 구성하게 된다.

3d object detection

3d object prediction

Faster R-CNN 과 같은 원리지만 3차원 공간에서 proposal 을 진행하게 된다.

3d shape prediction

참고 : https://blog.lunit.io/2017/06/01/r-cnns-tutorial/

Leave a comment