1. 10강 복습

  저번 강의에서는 정해지지 않은 input, output에 쓰이는 RNN에 대해 배웠다. input과 output의 사이즈가 정해져 있는 케이스를 다루는 CNN보다 더 자유롭게 사용할 수 있다는 이점이 있었다. 물론 fixed size 케이스에 대해서도 CNN보다 더 나은 성능을 내는 경우도 있었다. 이번 강의에서는 이 밖에 Computer Vision에 다루는 주제들에 대해서 알아본다.

2. Semantic Segmentation


위:input , 아래: output

   Semantic Segmentation은 input image를 넣었을 때, 각 pixel에 대해서 카테고리를 지정해준다. 여기서 주의할 부분은 object 단위가 아니라, pixel 단위로 classification을 한다는 것이다. 만약 위의 예시처럼 사진에 소 두 마리가 있다면, Semantic Segmentation은 두 마리의 소를 구별하진 못하고, 두 마리 소의 영역을 모두 그냥 소로 라벨링한다. 이제 어떻게 모델이 작동하는지 알아보자.

1) Sliding Window

   이 방식은 우리가 해볼 수 있는 semantic segmentation 방법 중 가장 원시적인 방법이라고 할 수 있다. 사진(Full Image)에서 patch(혹은 crop이라고도 한다.)를 뽑아 CNN에 태운 뒤 그 patch의 가운데 pixel을 라벨링하는 방식이다. 그러나 이 방식의 문제는 이것이 계산하기 굉장히 복잡하다는 것이다. patch를 뽑고 네트워크를 태워 라벨링 되는 픽셀이 겨우 하나이고, patch들 간에 겹치는 부분을 재사용할 수도 없어 더욱 비효율적이다. 이런 단점 때문에 다음에 나올 방식이 등장하게 되었다.

2) Fully Convolutional

   이는 input 사진을 여러 개의 Conv Layer에 넣어서 score를 얻고, prediction을 진행하는 방식이다. 중요한 것은 이 방법은 patch extraction이 없고, FCL도 없다는 것이다. 1)의 방법보다 조금은 더 나은 성능을 보인다.

   여기서 중요한 것은 convolution layer를 지나는 동안 input의 size는 그대로 보존되어야 한다는 것이다. C는 우리가 관심있는 category 혹은 object의 개수이고, score에서는 각 pixel별로 카테고리에 대한 점수가 모두 존재한다. 예를 들면, cow category의 각 pixel에 대한 score가 H*W 크기로 들어있는 것이다. 이 중에 가장 점수가 높은 카테고리로 라벨링이 진행된다. training은 pixel별로 classification loss의 평균을 내고, backprop은 원래 하던대로 진행한다. loss function으로는 pixelwise cross entropy loss가 쓰인다고 한다. 그러나 모든 training data의 각 픽셀에 대해 라벨링을 일일이 다 하는 것은 계산량이 너무 많고, 각 conv layer에서 input size를 그대로 유지하는 것은 엄청난 파라미터수와 계산량을 요구한다(input의 채널 수가 256,128.. 이렇게 된다고 생각해보면 필요 메모리양과 계산량이 엄청나다는 것을 알 수 있다). 이러한 문제점을 보완하고, 더 효율적인 계산을 위해 downsampling과 upsampling을 도입해보자.

3) Fully Convolutional + downsampling&upsampling

resolution이 high-med-low-med-high의 순서를 거친다.    이 방식은 2번과 비슷하지만, Convolution을 처음에 진행한 후, downsampling을 진행한다. 이런 방법으로 많던 계산량을 줄이는 것이다. 그러나 output은 사진과 똑같은 크기로 나와야 하므로, 마지막에 upsampling을 진행해준다. 중간에 size를 한번 줄여줬기 때문에 계산적으로 이득을 볼 수 있다. downsampling은 max pooling과 strided convolution을 사용한다. 이건 이전에 배웠던 내용이다. upsampling 시에는 unpooling과 transposed convolution이라는 방식을 사용하는데, 먼저 unpooling부터 알아보자.
Unpooling

i) Nearest Neighbor unpooling: pixel의 receptive field를 모두 기준 pixel의 값으로 채우는 방식이다. 아래의 예시의 경우 receptive field가 2x2이다.

ii) Bed of nails : 침대 위에 못(픽셀 값)이 튀어나와 있는 것을 비유한 것으로, 픽셀 값은 모두 왼쪽 위에 채운다. 그리고 나머지 픽셀값들은 0으로 채운다.

iii) max unpooling : 이 방식은 max pooling 시에 최댓값의 위치를 기억해 놓았다가, upsampling 시에 그 위치에 픽셀값을 다시 넣는 것이다. 마찬가지로, 나머지 픽셀들은 0으로 채운다. downsampling 시에 손실되는 spacial location을 줄일 수 있어 좋은 방법이다.

   위의 사진에서처럼, downsampling 했던 layer와 upsampling layer를 짝지어서 spacial location을 나름 보존한다.

iv) transpose convolution: matrix multiplication을 이용해서 output의 크기를 늘리는 방법을 의미한다. 중요한 것은 앞의 i)~iii)의 방식은 learnable 하지 않은 것에 비해, 이 방식은 learnable하다는 장점이 있다는 것이다. 조금 더 자세히 살펴보자.

원래 우리가 알고 있던 convolution

   원래의 convolution( 3x3 convolution, S=2, P=1)은 위의 그림과 같이 필터가 지나가면서 dot product를 시행하고, 그 output이 출력된다. 이때 stride는 input 몇 칸이 하나의 output과 대응되는지, 즉 input과 output pixel간의 비율을 의미한다고도 볼 수 있다. 이를 upsampling에 이용할 수 있다.

   위의 그림을 살펴보자. input의 하나의 픽셀에 filter를 곱한다. 그리고 그 weighted filter의 값을 output에 그대로 쓰는 것이다. input의 pixel 1개는 스칼라 값이기 때문에 filter에 weight를 제공해준다고도 해석할 수 있다. 그리고 upsampling을 진행하다 보면 겹쳐지는 부분들이 있는데, 이 부분들은 그냥 서로 더해준다고 한다. 이 방법의 다른 이름으로는 Deconvolution, Upconvolution, Fractionally strided convolution, Backward strided convolution이라고도 불린다.

   1D의 예시를 살펴보자. 3x1의 filter를 사용한다. 이를 input의 각 pixel에 곱하면, output vector의 값처럼 계산되게 된다. 겹치는 부분에서는 값들이 더해지는 것을 확인할 수 있다.

Convolution as Matrix Multiplication

   이 부분을 이해하는데 꽤 시간이 걸렸다. Convolution을 matrix multiplication으로도 표현할 수 있다는 내용이다. 위의 예시에서는 input vector로 a=(a,b,c,d), weight vector로 x=(x,y,z) 가 사용된다.

padding=1을 반영해 input vector의 양 끝에 0 추가.

   원래 convolution이 작동하는 방식을 생각하면 위의 내가 그린 선과 같이 연산이 이루어질 것이다. output vector가 이와 같이 나오려면 아래의 왼쪽과 같이 행렬 연산이 이루어져야 한다.

   Convolution Transpose는 여기서 만들어진 martrix의 transpose를 취해 행렬 연산을 진행하는 것이다. stride가 1일 경우에는 그냥 convolution과 그닥 차이가 없는, padding rule이 다른 또 하나의 convolution과 같이 보인다. 그러나 stride 값이 증가할 경우는 조금 다르다.

   stride가 1보다 커질 경우, convolution transpose는 더 이상 일반적인 convolution이 아니라고 한다. 뭔 소린지 하나도 모르겠어서 다른 예시들을 찾아봤다.

convolution

   먼저, 일반 convolution부터 살펴보자. input과 kernel이 각각 4x4, 3x3의 사이즈를 갖고 있다. 이를 matrix로 계산해보는 것이 목적이다. 먼저, input에 곱해줄 convolution matrix C를 만들자. 결론적으로 C는 4x16의 크기를 갖고, output은 CI를 통해 얻을 수 있다. 이때 I는 input matrix를 1차원으로 flatten 한 161 크기의 벡터이다. 우리가 생각하는 convolution을 하면, 2x2의 output을 얻는다. matrix multiplication을 해서는 4x1의 벡터를 얻는데, 이를 2x2로 reshape하면 결과적으로 convolution을 한 것과 동일한 연산이 된다는 것이다. 한 마디로 정리하자면, convolution과 같은 효과의 matrix multiplication 연산이 나오게 C를 만든 것이다. 이제 C가 어떻게 만들어지는지에 대해 알아보자. 사진의 how? 부분을 보면 된다.
  input에 kernel이 겹쳐질 때, input의 연산을 보면 kernel이 움직임에 따라 1~4 step의 연산이 이루어진다. 0으로 채워지는 칸들이 있는 이유는 kernel과 겹쳐지지 않는 경우, output에 영향을 주지 않기 때문이다. 어쨌든 각 step에서 얻은 matrix들을 다 펴서 C의 각 행에 넣어주면 Convolution matrix가 완성되는 것이다.

transpose convolution

   이제 transpose convolution에 대해 알아보자. 위의 C를 transpose 시키고, output을 곱하면, 원래 input의 크기인 4x4를 얻는다. 위의 예시에서는 input의 정확한 값을 얻지는 못하지만,learnable parameter들을 갖기 때문에 정확도는 높일 수 있을 것이다. upsample 시에 사용할 수 있는 좋은 테크닉인 것 같다.
  정리하자면, pooling& strided convolution을 이용해 downsampling을 해서 계산량을 줄이고, unpooling과 transpose convolution을 이용해 upsampling을 진행한다는 것이다.

3. Classification + Localization

   이 방법은 하나의 object에 대해서 그 object 주변에 box를 그리는 것(Localization)과 classification을 같이 진행하는 방법이다.

   classification은 우리가 원래 하던 것이고, localization이 새롭게 등장한 개념이다. localization은 regression problem으로 생각하면 된다. 기존의 CNN에서, classification score와 함께 box의 좌표 또한 얻을 수 있게 네트워크를 조금 수정한 것이다. 이때 box 좌표는 연속적인 data이므로, L2 loss를 이용한다. 그리고, 이렇게 되면 구해야 할 loss가 2개이기 때문에, multitask loss를 구한다. 정확히 말하면 hyperparameter를 하나 둬서 2개의 loss의 weighted sum을 구하는 것이다. loss 값이 2개일때 뿐만 아니라 더 많은 loss를 구할 때도 multitask loss 개념을 적용할 수 있다.
  Classification + Localization을 이용하면 사람의 pose estimation을 할 수도 있다. 사람의 주요 관절 14곳 정도를 포인트로 잡아 그 좌표를 regression loss을 통해 estimation 한다고 한다.

4. Object Detection -Region Based Methods

  하나의 object를 다룬다고 가정했던 Classificaiton+ Localization과는 달리 이 경우는 몇개의 object가 사진에 나타날지 모르는 경우를 다룬다. 그렇기 때문에 이전보다는 복잡한 문제라고 볼 수 있다. object가 보이는 경우, 그 주변에 box를 치고, 어떤 object 인지 classification을 진행해야 한다. Semantic Segmentation의 경우 같은 동물이 두 마리 있어도 구분하지 못했지만, 이 방법은 같은 동물이어도 각 개체를 구분할 수 있다. object detection과 관련된 여러 아이디어들을 살펴보자.

1) Sliding Window

   crop을 많이 뽑아 CNN을 태워 classification을 수행한 뒤, object인지 background인지 판단해 output을 뱉어준다.

   그러나 이 방법은 crop을 굉장히 많이 뽑아야하기 때문에 시간적으로도, 계산적으로도 좋지 않다. 또한 crop을 뽑는 방식을 정하는 것도 문제이다. object의 크기가 모두 다르고, 어디서 나올지도 모르기 때문이다. 이러한 문제 때문에 실전에서도 잘 사용하지 않는다고 한다. 그래서 도입한 방법이 region proposal이다.

2) Region Proposals

   사실 이 방법은 딥러닝과 관련된 기법은 아니다. 굉장히 traditional 한 방식으로, 학습 가능하지 않다. 이미 존재하는 알고리즘에 의해 object가 나타날만한 곳들을 계산해주는 것이다. 무작정 뽑는 것보다는 효율적이다. Selective Search 같은 경우는 1000개의 region 정도를 준다. 이를 이용해 만든 것이 R-CNN이다.

3) R-CNN

   R-CNN은 먼저 input image에서 region proposal을 최대 2000개정도 받는다. 이를 ROI(Region of interest)라고 한다. 그리고 이를 CNN에 넣는다. 그런데, CNN에는 fixed size input을 넣어야 한다. 그렇기 때문에 size를 맞춰주는 warping을 진행하고 CNN에 넣어준다. 그 결과, Classification된 label과 proposal 때 잡은 box의 correction(offset) 값을 출력한다. 이를 반복해 최적화를 진행하는 것이다. R-CNN의 문제는 여전히 계산량이 많고, 실전에서는 훈련 속도와 testing 속도가 느리다는 것, 그리고 learnable하지 않다는 것이다.

4) Fast R-CNN

   Fast R-CNN은 기존 R-CNN의 단점을 고친 버전이다. R-CNN에서는 input image에 ROI를 뽑았었다. 그러나 Fast R-CNN의 경우 일단 input image를 ConvNet에 태워서 feature map을 얻은 다음, 이 feature map에서 ROI를 뽑는다. 그리고 똑같이 warping을 해주고, FCL에 넣어주기 위해 ROI pooling layer를 태워준다. 그리고 FCL에 넣은 후 classification loss와 regression loss(box coordinates)를 weighted sum한 multitask loss를 통해 training 시켜주는 것이다. 그러나, Fast R-CNN은 region proposal을 하는 것에 런타임의 대부분을 사용한다. 만약 proposal을 learnable하게 만들 수 있다면, 시간을 더 줄일 수 있을 것이다.

5) Faster R-CNN

   위의 문제점을 해결한 방식으로, CNN이 region proposal을 담당한다.

   CNN이 proposal을 하도록 하기 위해 RPN(Region Proposal Network)이라는 것을 도입해준다. 그래서 총 4개의 loss를 얻게 되는데, 그 중 2개는 RPN에서 나오는 classification loss와 Bounding-box regression loss이다. 여기에 최종적으로 네트워크를 다 타고 나와서 최종 classification loss, bounding box loss를 얻는다. 이전에는 traditional region proposal을 통해 나온 region들이 내가 가진 input image와 잘 맞지 않아도 고칠 수 없었다. 그러나 이제는 learnable한 CNN을 통해 region들을 정하다 보니, 내 image에 맞는 region들을 제안할 수 있게 모델을 설계할 수 있게 된 것이다.

5. Object Detection- Detection Without Proposals

   지금까지 한 1)~4)는 Region based method들이다. 반면에 region proposal 없이 detection을 진행하는 방법도 있다. 대표적인 모델로는 YOLO(You Only Look Once)와 SSD(Single Shot Detection)가 있다.

   이 방법의 대표적인 intuition은 아주 큰 CNN을 사용하고, regression 관점으로 문제를 바라본다는 것이다. 그렇기 때문에, 일단 input image를 받으면 여러 개의 grid들로 나누고, 각각의 grid에 대해서 base box를 통해 output 을 얻는다. 이때 base box의 수는 위 사진의 B를 얘기하는 것인데, object가 어떤 형태로 있을지 모르기 때문에 가로가 긴 사각형, 세로가 긴 사각형, 정사각형 등을 만들어 object를 탐색하는 것이다. B=3일수도 있지만, 실전에서는 훨씬 많은 base box를 사용한다고 한다. 이렇게 base box를 만들고 나면, 하나의 grid에서는 5개의 숫자가 출력된다. object 크기에 관한 숫자 4개와 confidence라는 숫자이다. confidence는 모델이 이 grid 안에 object가 있는 것이 얼마나 확실한지에 대한 정보를 담고 있다.

   여기서 기억해야 할 점은 Faster R-CNN과 SSD가 어떻게 다른지이다. Faster R-CNN의 경우 속도가 느린 대신 정확도가 높고, SSD는 속도가 빠른 대신 정확도가 낮다.

   이 밖에 Dense Captioning이라는 방법도 있는데, Object Detection에 앞에서 배운 RNN을 같이 적용하는 것이다.

6. Instance Segmentation

   Instance Segmentation은 input이 주어졌을 때 bounding box는 찾지 않고 label과 location만 찾는 것이다. 대신 segmentation mask를 찾는다. 맨 앞에서 봤던 Semantic Segmentation과 비슷한 면이 있는 것이다. 그러나 원래의 segmentation과는 다르게, 강아지 2마리가 있을 때 두 강아지의 구분은 가능하다. 여기에 쓰이는 Mask R-CNN에 대해 알아보자.

   Mask R-CNN은 faster R-CNN처럼 CNN을 통해 얻은 feature map에 ROI를 적용해 Classification과 box coordinate들을 얻는 것 이외에, pixel들이 object인지 아닌지 구분해주는 기능이 추가된 것이라고 보면 된다. mask라는 표현이 그것을 의미한다. Segmentation mask를 씌워 object인지 아닌지를 구분하는 것이다.
Mask R-CNN은 좋은 결과를 내주고, pose estimation에도 이용할 수 있다고 한다.

profile
AI/ Computer Vision

0개의 댓글