본문 바로가기
CS231

Lecture 11 : Detection and Segmentation

by Keep It Simple, Stupid! 2020. 5. 17.

 

Today


  • Segmentataion
  • Localization
  • Detection

 

지금까지 CNN을 이용해서 Image를 Classification하는 과정은 아래와 같았다.

 

Other Computer Vision Tasks


 이외에 다른 CV로 할수 있는 작업은 크게 4가지로 "Semantic Segmentation", "Classification + Localization", "Object Detection", "Instance Segmenatation"으로 구분된다.

 

Semantic Segmentation


 "Semantic Segmentation"은 사진에 존재하는 객체(물체)를 의미하는게 아닌, Pixcel에 해당되는 Class를 학습시키고, 구분하는 것이다. 아래 Case를 보면 더 이해하기 쉬울 것이다.

  원본 데이터(Image)를 구성하고 있는 모든 Pixel에 Category Labeling을 해준다. 

  • 왼쪽 image : Sky, Trees, Cat, Crass에 해당되는 Pixel을 잘 구분하고 있다.
  • 오른쪽 image : Trees, Sky, Cow, Grass에 해당되는 Pixel을 잘 구분하고 있지만, 원본 image(상단)에 있는 것과 비교해보면 Cow라는 부분이 합쳐져 있는(소 2 마리 이상의 물체를 그냥 소로 표시) 상황처럼, 개별에 대해서는 분류할 수 없다고 합니다. 즉, labeled된 pixcel을 얻으며, 이게 단점이라고 합니다. 이러한 문제점을 해결한 방법이 추후 Instance segmentation가 있다고 한다.

 "semantic segmentation"을 위해서 "sliding window" 방법을 사용할 수 있다. input image를 작은 단위로 잘라서 이 부분이 어떤 Category에 속하는지 Classification을 하는 것이다. 

참고 : sliding window 기법

In the context of computer vision (and as the name suggests), a sliding window is a rectangular region of fixed width and height that “slides” across an image, such as in the following figure:

Example of the sliding a window approach, where we slide a window from left-to-right and top-to-bottom.

 

 하지만, sliding window를 하게 되면 아주 비효율적(게산 비용이 큼)이다. 작게 쪼개어 모든 영역을 forward/backward 하는 과정과 서로 다른 영역이라도 인접해 있으면 그 특징들을 공유할 수 있는데 그것을 못하기 때문이다. 

 sliding window의 비효율적인 부분을 개선하기 위해, sliding window 기법이 아닌 여러개의 Convolution layer로만 이루어져있는 Fully Convolutional 기법을 사용하면 뒷부분의 Scores 부분에서는 C(Category 갯수), H, W인 shape가 나오게 됨으로써, 마지막 부분에는 Score 중 가장 높은 값으로 Category를 예측할 수 있다.  

 하지만, 위 처럼 단순히 여러개의 Conv를 진행하게 되어도,  문제점이 존재한다고 한다. 즉, 초기 Input의 Size (H x W)인 Spatial size를 Output size(H x W)와 같도록 계속 유지시켜하는데, 동일한 CNN을 계속 하게 되는것 자체가 계산량이 너무 크다고 한다. 

 계산 비용을 극복하고자, Downsampling 및 Upsampling을 사용한다. 

  • Downsampling : Pooling, strided convolution (위 네트워크에서 왼쪽 Low-res까지의 Layer에 해당)
  • Upsampling : ??? (위 네트워크에서 오른쪽 Low-res부터 시작해서 High-res까지의 Layer에 해당)

Upsampling 의 여러 방법을 살펴보자.

  •  Nearest Neighboor : input의 숫자를 동일하게 output에도 적용함
  •  Bed of Nails : 첫번째 위치만 동일한 값을 적용하고 이외의 위치는 모두 0으로 적용
  • Max Unpooling : Max Pooling에서 적용되었던 element의 위치를 기억하고 있다가, Unpooling 할때 해당 위치에 값을 넣고, 이외의 위치는 모두 0으로 적용 (Bed of Nails에서 위치 정보를 추가하여야지 가능하므로, pair한 개념)

 Maxpooling만 하게 되면 큰 값만 가져오기 때문에 feature map이 작아지면서 공간 정보를 잃게 되는데, Unpooling을 하면 잃어버린 공간정보를 좀 균형있게 유지할 수 있다고 한다.

 다른 방법으로는 Transpose Convolution이 있다. 여기서부터는 함수가 학습을 하게 되는데, Conv에서 parameter들이 업데이트 하는 과정과 같다. 우선 Upsampling에 대해 알아보기 전에 기존 Downsampling에서의 원리를 잠깐 살펴보자.

예제 1 : Learnable Downsampling (Transpose Convolution의 Upsampling을 이해하기 위함)

4 x 4 input → 3x3 Conv, Stride 1, pad 1 → 4 x 4 output 

예제 2 : Learnable Downsampling (Transpose Convolution의 Upsampling을 이해하기 위함)

4 x 4 input → 3x3 Conv, Stride 2, pad 1 → 2 x 2 output 

Upsampling : Transpose Convolution 

2 x 2 input → 3x3 Filter, Stride 2, pad 1 → 4 x 4 output 

  • overlaps 되는 부분은 그냥 더 해준다고 함

구체적인 원리를 위해 간단한 1D Example을 확인해보자.

 

Matrix를 사용하여 Conv 연산을 표현할 수 있는데, 오른쪽 Matrix는 Conv 연산과 Matrix 곱을 위해 Kernel Matrix를 재배치한 것이다.

Convolution transpose : matrix를 transpose 및 재배치하여 계산

4 x 1 input → 6 x 4(3 x 3 Filter 재배치), Stride 1, pad 1 6 x 1 output 

  • 기존 Kernel Matrix :  3 x 3
  • 재배치 된 Kernel Matrix : 6 x 4

오타 : 첫번째 Matrix에서 x, y, z (kernel size : 3) 순서대로 표기

2 x 1 input → 6 x 2(3 x 3 Filter 재배치), Stride 2, pad 1  6 x 1 output 

 드디어 DownSampling 과 Upsampling을 활용하여 보다 효율적인 연산하는 방법이 일반적인 Semantic Segmentation의 구조라고 한다. Upsampling은 앞서 배운 다양한것들 사용할 수 있음. 그리고 모든 Fixel에 cross-entrophy를 계산하면 전체를 학습이 가능하다.

Classification + Localization


 Image가 어떤 Category에 속하는지 그리고 실제 Object가 위치하는 곳을 Box로 치는 것(Localization)이다. (참고 : Object Detetction은 Multilple Object에 해당)

 

  • Classification : Class Label을 맞추기 위해 Class Score를 출력하며, 이어서 Softmax 활용
  • Localization : Box coordinates의 값은 좌표(숫자)이기 때문에, regression 중에서 L2 Loss 활용

Classification은 기존 방법 CNN Layer를 활용하여 얻어진 Vector에 Fully Connected 기법을 사용하여 각 Category 별 Socre를 출력하여 Class를 구분하는 과정은 동일하다. Localization은 동일한 CNN Layer를 활용하여 얻어진 Vector를 사용하지만 Object의 위치(Box)를 그리기 위해 Box coordinates(x, y, x, h) 출력하기 위한 Fully Connected 기법을 사용한다.  

  종종 속도를 위해 Conv Layer는 미리 학습된 ImageNet을 활용한다. (목적에 따라서 Transfer Learning을 활용하여 커스터마이징 할 수 있음)

대표적인 예제 (Case)

 

Object Detection


 고정된 Category 내에서 task가 주어지면 이미지의 나타나는 Object들이 Bbox에 해당하는 Category를 예측하는 것이다. Localization과 다름. 사람은 쉽지만, 컴퓨터가 이러한 작업을 하려면 물리적으로 쉬운일이 아니다.

 HW가 발전함에 따라서 Deep Learning을 구현하는게 가능해졌고, 이에 따라 정확도가 향상되는것을 보여주고 있다.

 Localization에서 다뤘던 내용인, BBox를 그리기 위해 Regression을 활용한다고 하여도, Image마다 Object output이 다르기 때문에 필요한 연산이 너무 많다. 새로운 방법을 찾아야 한다.

 다른 방법으로는 Sliding Window기법을 생각할 수 있다. image에서 순차적으로 이동하면서 "Dog", "Cat", "Background" 중에 속하는지 계속 물어보면서 연산하는것이다. 하지만, 이 방법도 문제점이 존재한다.

  • 어떻게 영역을 Predict해야하는지 알 수 없음
  • Object가 몇 개인지 알 수 없음
  • Object가 어디에 존재하는지 알 수 없음
  • Object 크기가 얼마나 되는지 알 수 없음

위의 방법은 굉장히 컴퓨팅 계산량이 많이 들기 때문에 사용하지 않는다.

그래서, sliding window 대신에 region proposal을 사용한다. (이 부분은 Deep Learning을 사용하지 않음, CPU를 사용함) 

 Object가있을 만한 후보(region proposal)을 찾아내는 것. Selective Search 방법으로 물체가 있을만한 Region을 1000~2000개 생성하는 것이다.

R - CNN

  1. RPN (Region Proposal Network 수행) : region proposal(region proposal of interest, ROI)을 얻기 위함
  2. Selective Search 수행 : ~ 2k개의 ROI를 얻어냄 (학습 X)
  3. Wraped image regions 수행 : ROI의 size가 다 다르기 때문에, 추출된 ROI로 CNN을 하려면 동일한 size로 통일시켜야 한다.
  4. Forward each region through ConvNet : Conv 통과
  5. SVM : Category 분류
  6. BBox reg (학습 O): 처음에 Selective Search의 region proposal은 정확하지 않기 때문에 보정이 필요하여, BBox의 Category도 예측하지만 BBox를 보정해줄 수 있는 Offset 값 4개도 예측. 이를 multi-task loss로 두고 한번에 학습 O
Selective Search 수행 방법

Bounding-Box regression 

$P^{i}=\left(P_{x}^{i}, P_{y}^{i}, P_{w}^{i}, P_{h}^{i}\right)$ : Specifies the pixel coodrdinates of the center of proposal $P^{i.}$s bounding box together with $P^{i.}$s width and height in pixels.

$G=\left(G_{x}, G_{y}, G_{w}, G_{h}\right)$ : means the ground-truth bounding box

$$\begin{aligned}
\hat{G}_{x} &=P_{w} d_{x}(P)+P_{x} \\
\hat{G}_{y} &=P_{h} d_{y}(P)+P_{y} \\
\hat{G}_{w} &=P_{w} \exp \left(d_{w}(P)\right) \\
\hat{G}_{h} &=P_{h} \exp \left(d_{h}(P)\right)
\end{aligned}$$

 

  • 느리다.
  • SVM 과 BBox regression 결과가 train의 CNN에 update가 불가능함
  • train-step 이 너무 많음 : Fine-tune(CNN), svm 학습, BBox 학습

 이러한 R-CNN의 문제점을 해결하고자 Fast R-CNN이 등장하게 된다.

Fast R-CNN

 Fast R-CNN은 R-CNN과 달리 input image가 있으면, 전체 image에 CNN을 수행을한다. CNN의 마지막에 얻어진 전체 이미지에 대한 고해상도 Feature map을 얻게 되는데, 이 feature map에서 ROI를 얻기 위해 selective search 방법으로 region proposal을 계산을 한다. 이러한 이유로 하나의 ConvNet에서 나온 feature를 여러 ROI가 공유할 수 있게 된다. 

 FC-Layer에 들어가기전에 "ROI pooling" layer가 있는데, 이는 여러 ROI를 동일한 FC-Layer에 input으로 들어가려면 size가 같아야하는데, size가 같도록 조절해주는 layer이다.

 이후에 FC-Layer를 지나고 나면, classification score와 linear regression의 값을 얻을 수 있다.

 

최종적으로 LOSS는 두 개를 합쳐 계산하게 된다.

 Fast R-CNN의 핵심은 ROI Pooling

 R-CNN보다 훨씬 빨라졌음을 보여주고 있다. 그럼에도 불구하고, Region Proposal을 포함하여 계산하는데 소모하는 시간이 2.3초(2000개의 Region Proposal을 Selective Search. CPU애서 2.0초 소모함)나 있다.

 위의 그래프에서 R-CNN보다 train 및 test 세션에서 Fast R-CNN이 훨씬 빠르다는 것을 알 수 있습니다. region proposal을 포함하여 test 시간 동안 Fast R-CNN의 성능을 볼 때 region proposal을 사용하지 않을 때와 비교할 때 알고리즘 속도가 크게 느려집니다. 따라서 region proposal은 성능에 영향을 미치는 Fast R-CNN 알고리즘에서 병목 현상이 발생합니다.

 위의 문제점을 bottleneck 해결하고자, Faster R-CNN이 나온다.

Faster R-CNN

 R-CNN 및 Fast R-CNN은 selective search를 사용하여 region proposal을 찾습니다. selective serach은 네트워크 성능에 영향을 주는 느리고 시간이 많이 걸리는 프로세스입니다. 그러므로 Shaoqing Ren et al. selective search 알고리즘을 제거하고 네트워크가 region proposal을 학습 할 수 있도록 하는 object-detection 알고리즘을 개발되었다. 

 Fast R-CNN과 유사하게, 이미지는 컨벌루션 피쳐 맵을 제공하는 컨볼 루션 네트워크에 대한 입력으로 제공됩니다. region proposal을 식별하기 위해 기능 맵에서 selective search 알고리즘을 사용하는 대신 region proposal 예측하기 위해 별도의 네트워크가 사용됩니다. 예측 된 영역 제안은 제안 된 영역 내에서 이미지를 분류하고 바운딩 박스에 대한 오프셋 값을 예측하는 데 사용되는 RoI 풀링 계층을 사용하여 재구성된다.

 0.2초로 Test 시간이 획기적으로 줄어들었음을 알 수 있다.

 또 다른 방법으로 Proposals 과정 없이 Object detection할 수 있는 YOLO 와 SSD 기법이 있다.

 

 

 

Instance Segmentation


'CS231' 카테고리의 다른 글

Lecture 10 : Recurrent Neural Networks  (0) 2020.05.09
Lecture 9 : CNN Architectures  (0) 2020.05.02
Lecture 8 : Deep Learning Software  (0) 2020.05.02
Lecture 7 : Training Neural Networks II  (2) 2020.04.16
Lecture 6 : Training Neural Networks I  (2) 2020.04.12

댓글