[CNN] 7. CNN Applications


Computer Vision Applications

  • CNN 은 Image Classification 뿐만 아니라 Semantic Segmentation 이나 Detection 에도 사용된다.
  • 여기서는 각 task 가 어떤 작업을 수행하는지 감을 잡고, Image Classification, Detection, Segmentation 모두 따로 카테고리를 만들어서 주요 모델과 주요 방법론들을 다룰 것이다.

Detection

  • 이미지 안에서 어느 물체가 어디에 있는지를 찾는 task 이다. 단 per pixel 이 아닌 bounding box 를 찾는다.
  1. R-CNN
    • 가장 간단한 방법은 R-CNN 을 이용하는 것이다.
    • R-CNN 은 object 를 detection 하기 위해서 selective search 라는 알고리즘을 이용하여 이미지 안에서 patch 를 뽑는다.

      Untitled

    • 이미지 안에서 크기가 다른 몇 개의 region 을 뽑는다. 뽑을 때는 그 안에 object 가 있는지 없는지 모르고 뽑는다.
    • 이 region 에 object 가 있을 것 같다는 생각으로 뽑고, region 들을 똑같은 크기로 맞춘다. 이는 CNN 에 들어가려면 똑같은 크기로 맞춰야 하기 때문이다.
    • CNN 을 돌린 후에는 SVM 으로 분류한다. R-CNN 에서는 region 에 대한 conv feature 를 뽑을 때 AlexNet 을 사용했다.
    • 그러나 region 마다 conv feature map 을 뽑기 위해서 AlexNet 을 각각 따로 돌려야 해서 시간이 오래 걸린다. 게다가 각각 분류도 해야한다.
    • bounding regression 라는 bounding box 를 어떻게 옮겨줘야 더 좋은지도 계산한다.
    • 이렇게 되면 이미지 안에서 어느 위치에 어느 물체가 있는지 나오게 된다. 정확하지는 않지만 이런 식으로 detection 문제를 풀고자 했다.
    • R-CNN 의 가장 큰 문제는 이미지 안에서 bounding box 를 2000($2k$)개 뽑으면, 2000개의 이미지 혹은 패치를 CNN 을 다 통과시켜야 한다는 점에 있다. 그래서 하나의 이미지에 CNN 이 2000번 돌아가게 되는 것이다.
  2. SPPNet
    • 이후 SPPNet 은 이미지 안에서 CNN 을 1번만 돌리도록 개선된 모델이다.

      UntitledR-CNN(위) 과 달리, SPPNet(아래)은 conv layer 를 한번만 수행한다.

    • 여기서 SPP 란 spatial pyramid pooling 을 뜻한다.
    • spatial pyramid pooling 은 conv feature map 을 잘 활용해서 하나의 벡터로 바꿔준다.
    • 이미지 안에서 region 을 뽑고, 이미지 전체에 대해서 CNN 을 통과시킨 다음 이미지에서 뽑힌 region 위치에 해당하는 conv feature map 의 텐서만 들고 오자는 것이다.
    • 따라서 CNN 은 한 번 돌지만 conv feature map 에서 region 별로 해당 위치의 sub-텐서를 뜯어오기 때문에 R-CNN 에 비해 속도가 빠르다.
    • SPPNet 이 가지는 가장 큰 컨셉은 CNN 을 한 번 돌려서 얻어지는 conv feature map 위에서 얻어진 bounding box(region) 의 패치를 뜯어오는 것이다.
  3. Fast R-CNN
    • SPPNet 은 CNN 을 한 번만 통과시키지만, bounding box(region)에 해당하는 텐서를 여러 개 뜯어와서 SPP 로 하나의 벡터로 만들고 분류를 해줘야 하기 때문에 그래도 느리다.
    • Fast R-CNN 도 SPPNet 과 동일한 컨셉을 가져왔다.

      Untitled

    • 그러나 Fast R-CNN 은 R-CNN, SPPNet 의 컨셉을 다 이용했다.
    • 마지막에 뉴럴 네트워크를 이용한 bounding box regressor 을 둔다. 이는 얻어지는 bounding box 를 어떻게 움직여야 object 를 포착할 수 있는지를 계산한다. 그리고 그 bounding box 에 대한 label 을 찾는데 softmax 를 이용한다.
    • 이처럼 기본 컨셉은 SPPNet 과 비슷하지만, 뒷단에 ROI(Region of Interest) feature vector 를 가지고 뉴럴 네트워크를 통해서 bbox regressorclassification 을 했다는 것이 큰 의미를 가진다.
  4. Faster R-CNN
    • R-CNN 시리즈의 마지막 모델이다.
    • Faster R-CNN 은 이미지를 통해서 bounding box 를 뽑아내는 Region Proposal 도 학습을 시키고자 했다.
    • 기존의 bounding box 를 뽑아내는 selective search 는 알고리즘일 뿐, detection 에 맞지 않았기 때문이다.
    • 따라서 Faster R-CNN 은 내가 bounding box(candidate, region)를 뽑는 것도 네트워크로 학습하고자 했고, 여기에 RPN(region proposal network) 을 추가했다.
    • 즉 Fast R-CNN 에 RPN 이 더해진 것과 같다.

      Untitled

    • RPN 은 이미지에서 특정 영역(패치)이 bounding box 로서 의미가 있을지 없을지를 판단한다. 즉 이 영역 안에 물체가 있는지 아닌지를 찾아주는 것이다.
    • 이 물체가 무엇인지는 뒷단의 네트워크(classification)가 판단하는 것이고, RPN 은 이 안에 물체가 있을 것 같다는 region proposal 을 해주는 것이다.
    • 이를 위해 anchor box 가 필요하다.
    • anchor box 는 user 가 미리 정해놓은 bounding box 다. 즉 user 는 이 이미지 안에 어떤 크기의 물체들이 있을지 알고 있고, k 개의 템플릿(anchor box)들을 만들어 놓는다.

      Untitled

    • 이 템플릿들(anchor box)이 얼마나 바뀔지에 대한 offset 을 찾고 궁극적으로 이 템플릿을 미리 고정해 두는 것이 RPN 의 가장 큰 특징이다.
    • 여기에는 Fully ConvNet(FCN) 이 활용된다. 정확히는 1x1 convolution 을 활용하는데, conv feature map 의 모든 영역을 돌아가면서 해당하는 영역에 어떤 물체가 들어있을지를 판단하게 된다.

      Untitled

    • Faster R-CNN 의 RPN 은 anchor box 가 9개다. 이는 predefined region size 3개와 ratio 3개를 combination 한 것이다.
    • 각각의 anchor box 는 region size 마다 bounding box 를 얼마나 키울지 줄일지 4개의 파라미터가 필요하다. (x, y, w, h)
    • 또한 해당 bounding box 가 쓸모 있는지 없는지 box classification 을 한다. 이는 상대적으로 적은 숫자의 bbox proposal 을 만들어 줘야 하기 때문이고 class 가 use it or not 으로 2개 이다.
    • 따라서 Fully Conv 의 채널 숫자가 9(anchor box type) * (4+2) 로 총 54개의 채널을 가진 conv feature map 이 된다. 여기서 (4+2) 는 bounding box 에 귀속된 것이다. (x, y, w, h, use it, use not)
    • 이 54개의 값을 뜯어보면 해당 영역에서 confidence 를 기준으로 어떤 bbox 를 사용할지 말지를 정하게 된다.
    • 이후 RPN 뒷단에 이 region 이 어떤 클래스에 속하는지를 맞추는 식으로 detection 한다.
  5. YOLO
    • YOLO V1 은 Faster R-CNN 보다 훨씬 빠르다.
    • 그 이유는 RPN 을 통해서 나온 conv feature map 의 sub-tensor 를 가지고 분류하는 것이 아니라, YOLO 는 이미지 한 장에서 바로 찍어서 output 이 나올 수 있기 때문이다.
    • 제일 중요한 컨셉은, Faster R-CNN 은 bounding box 를 찾는 RPN 이 있었고 거기서 나오는 bounding box 를 따로 분류했었지만, YOLO 에서는 한번에 분류하는 것이다.
    • 즉, bounding box 를 따로 뽑는 RPN 스텝이 없고 한 번에 하기 때문에 속도가 빠른 것이다.

      Untitled

    • YOLO 에서는 이미지가 들어오면 이미지를 S x S grid 로 나눈다.
    • 이미지 안에 내가 찾고 싶은 물체의 중앙이 해당 그리드 안에 들어가면, 그 그리드 셀에서 해당 물체에 대한 bounding box해당 물체가 무엇인지를 같이 예측 한다.
    • 먼저 bounding box 를 찾을 때, 각각의 셀은 B 개의 bounding box 를 예측한다. RPN 처럼 predefined 된 anchor box 가 있지는 않다. 여기서는 B 개의 bounding box 의 x, y, w, h 를 찾고 그 bounding box 가 쓸모 있는지 없는지를 판단한다.
    • 그와 동시에 각각의 그리드가 이 그리드 셀의 중점에 있는 어떤 오브젝트가 어떤 클래스 인지를 예측하게 된다. 원래라면 bounding box 를 찾고 거기서 나온 것을 따로 네트워크에 돌려서 클래스를 찾았지만 YOLO 에서는 두 개가 동시에 진행되는 것이다.
    • 이 두 개의 정보를 취합하게 되면 bounding box 와 그 박스가 어떤 클래스에 해당하는지가 나온다.
    • 이것을 아래와 같이 텐서로 표현할 수 있다.

      Untitled

    • 채널 (B*5+C) 에 주의하자. 각각의 채널에 맞는 정보가 끼워 들어갈 수 있도록 네트워크가 학습을 시킨다.
    • Faster R-CNN 에 비해서 bounding box 를 찾아내는 것과 동시에 class 를 찾아내는 것을 같이 하기 때문에 엄청 빠른 속도를 얻었다는 것이 중요하다.

Semantic Segmentation

  • Semantic Segmentation 은 어떤 문제일지 기본적인 세팅을 보자.

    Untitled

  • Segmentation 은 어떤 이미지가 있을 때 각 이미지의 픽셀마다 분류하는 것이다. Image Classification 은 이미지 한 장이 있을 때 그 한 장을 분류하지만, Segmentation 은 그 이미지의 모든 픽셀이 각각 어떤 라벨에 속하는지를 보고싶은 것이다. 따라서 Semantic Segmentation 은 dense(per pixel) classification 이라 불리기도 한다.
  • 즉 이미지 분류는 전체 이미지에 대한 한 가지 레이블을 할당하는 반면, Semantic Segmentation은 각 픽셀에 레이블을 할당한다.
  • 이를 어디에 활용할 수 있을까? 자율주행이나 운전보조장치 등에 활용된다.
  • 지금까지 배운 기본적인 CNN 구조는 마지막에 flatten 으로 벡터를 만든 다음 Dense layer(fully connected layer)에 통과시켜서 label 수(내가 원하는 output 수) 만큼 output 을 만드는 게 목적이었다.

    Untitled

  • Semantic Segmentation 에서 제일 기본이 되는 테크닉은 “Fully Convolutional Network(FCN)” 다.

    Untitled

  • FCN 은 dense layer 를 없애고 conv layer 로 바꾼다. dense layer 를 없애는 과정을 convolutionalization이라고 한다.
  • dense layer 가 conv layer 로 바뀌었지만 궁극적으로 input 과 output 으로만 봤을 때는 똑같다.
  • 위 그림처럼 이미지에 conv layer 를 2층 거치고 flatten(reshape) 후 dense layer 를 거치는 것이나, conv 을 거치는 것은 파라미터가 정확히 일치한다. 왜냐하면 아무것도 바꾼 것 없이 단지 fc layer 를 conv 로 바꿔준 것이기 때문이다.
  • 즉, 20 x 20 x 100 을 flatten 하여 4만 짜리 벡터로 바꿔서 dense layer 를 통과시키는 것이 아니라, 20 x 20 x 100 짜리 filter 를 만들어서 그 커널(필터)로 1 x 1 x class 수 짜리 conv feature map 으로 만드는 것이다. 그러면 여기 필요한 파라미터 숫자는 역시나 dense 와 똑같다.

    Untitledleft(dense layer) 와 right(conv layer) 는 똑같다.

  • 각각의 filter 의 channel, 즉 depth-wise dimension 은 내가 conv 연산을 하는 conv feature map(input) 의 channel 과 동일하다.
  • fc layer 나 conv layer 나 똑같은 연산이라는 것이다. 이런 것을 convolutionalization 이라 한다.
  • 그러면 파라미터 수 똑같고 네트워크 똑같고, output 도 똑같은데 semantic segmentation 관점에서 왜 이렇게 바꿨을까?
  • FCN 이 가지는 가장 큰 특징인 input 의 spatial dimension 에 independent 하다는 것 때문이다.
  • transforming fully connected layers(fc-layer) into convolution layers enables a classification net to output a heat map
  • 어떤 CNN 에서 output 이 하나의 classification label 이라 해보자. 이 때 마지막에 fully connected layer 를 가진 네트워크라면 reshape(flatten) 을 해줘야 하기 때문에 feature map 의 spatial dimension 이 달라지면 input vector 의 길이가 달라져야 한다.
  • 그러나 fully conv net 은 input 의 spatial dimension 에 상관없이 네트워크가 돌아간다. 왜 그럴 수 있냐면 convolution 이 가지는 shared parameter 성질 때문이다.
  • convolution 은 input 이 spatial 하게 즉 width, height 가 커지는 것에 상관없이 동일한 filter 가 동일하게 찍히기 때문에 그게 찍어져서 나오는 result spatial dimension 만 같이 커지지 여전히 동작 시킬 수 있는 것이다.
  • 그리고 그 동작이 마치 heat map 처럼 효과가 있게 된다. 해당 이미지에 물체가 어디에 있는지 히트맵이 나오게 되는 것이다.

    Untitled

  • 주의할 점은 네트워크가 진행되면서 기존의 input image 에 비해 spatial dimension 이 많이 줄어들었지만, 얻을 수 있는 것은 단순히 분류만 했던 네트워크가 히트맵(러프, corase하지만)이 나올 수 있는 가능성이 생긴 것이다.
  • 또 주의할 점은 FCN 은 고정된 크기의 출력이 나오지만, 픽셀 수준의 분류를 제공한다는 점이다.
  • 따라서 FCN(fully convolutional network) 은 어떠한 input size(spatial dim)도 돌아갈 수 있지만, output spatial dimension 이 줄어든다.
  • 그래서 이런 coarse output 혹은 spatial resolution(해상도)이 떨어져 있는 output 을 원래의 dense pixel 로 바꿔준다. 즉 spatial dimension 을 늘리는 역할이 필요하다.
  • 이를 위한 방법으로 deconvolution, unpooling 이런 논문들이 나왔다.
  • Deconvolution(conv transpose) 는 conv 역연산 을 뜻한다.

    Untitled

  • convolution 을 통과할 때 stride 2 를 주면 spatial dim 이 대략 반 정도 줄게 된다.
  • deconvolution 은 stride 2 를 주면 2배 정도 늘리게 된다. 이처럼 deconvolution 은 spatial dim 을 키워주는 역할을 한다.
  • 사실 엄밀하게 convolution 의 역연산은 존재할 수 없다. 왜냐하면 conv 연산은 3x3 의 정보를 합쳐서 하나의 픽셀로 만들기 때문에 이것을 온전하게 역으로 복원하는 것은 불가능하기 때문이다. 3x3 의 값들을 더해서 하나의 값이 나오는데 이 구성 요소를 맞추기는 어렵다.
  • deconvolution 은 실제로 이미지 복원에 사용되는 전통적인 방법은 아니고, 컴퓨터 비전 및 딥러닝 컨텍스트에서의 deconvolution 은 주로 upsampling 및 해상도 복구에 사용되는 연산을 의미한다.
  • 엄밀히 말하면 deconvolution 이 완전한 convolution 의 역은 아니다 라는 것이다. 그러나 줄이고 늘리는 개념으로 이해하면 좋은 이유는, 네트워크를 만들 때 파라미터의 숫자와 네트워크 아키텍쳐의 크기를 계산할 때 편해지기 때문이다.

    Untitled

  • deconvolution 연산은 다른 포스트에서 다루겠지만, padding 을 줘서 우리가 원하는 결과를 나오게 만드는 것이다.
  • 정리하면, input image 가 들어가고 FCN 을 통과해서 픽셀 별로 classification 하는 구조가 바로 Segmentation 이다.

    Untitled

맨 위로 이동 ↑

댓글 남기기