본문 바로가기
Coursera 강의/Deep Learning

Object Detection(YOLO algorithm)

by 별준 2020. 11. 22.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 네 번째 강의 Convolutional Neural Networks를 듣고 정리한 내용입니다. (Week 3)

Learning Objectives

  • Describe the challenges of Object Localization, Object Detection and Landmark Finding
  • Implement non-max suppression to increase accuracy
  • Implement intersection over union
  • Label a dataset for an object detection application
  • Identify the components used for object detection (landmark, anchor, bounding box, grid, ...) and their purpose

[Object Localization]

Object Detection(객체 탐지)를 위해서는 먼저 Object Localization에 대해서 학습하는 것이 필요하다.

우리는 이미 Image Classification에는 익숙하다.

Classification with localization은 단순히 이 object가 자동차라는 것뿐만 아니라, 이 알고리즘이 object를 대상으로 bounding box를 표시하는 것을 의미한다.(자동차 위치 주변을 따라서 빨간 박스를 그리는 것)

 

강의 후반부에서 Detection Problem에 대해서 알아볼텐데, 사진 속에 object가 여러개인 경우가 발생한다. 이때, 모든 object를 탐지해야될뿐만 아니라 위치 또한 알아내야한다. 특히 자율주행에서 이 작업을 수행할 때, 다른 자동차들 뿐만 아니라 보행자, 오토바이, 다른 주변 물건들까지도 탐지해야할 수 있다. 지금은 하나의 object만 다루도록 한다.

 

우선 Classification with localization에 대해서 자세히 알아보도록 하자.

우리는 이미 이미지를 분류하는 것에 대해서는 익숙할텐데, 여러 layer로 이루어진 ConvNet에 이미지를 입력해서 softmax unit이라는 output vector로 class를 예측할 수 있다.

여기서 예시로 총 4개의 class가 있고, softmax unit은 총 4개가 될 것이다.

여기서 만약 이미지에서 자동차의 위치를 알아내고 싶다면 어떻게 해야될까?

위치를 탐지하기 위해서는 Bounding Box의 위치를 나타내는 output을 갖도록 Neural Network를 변경하면 된다. 즉, output으로 \(b_x, b_y, b_h, b_w\)가 추가될 수 있다. 이 output은 탐지된 object의 bounding box를 파라미터로 나타낸 것이다. bounding box의 중앙 좌표(\(b_x, b_y\))와 폭(\(b_w\)) 그리고 높이(\(b_h\))에 의해서 위치를 탐지하게 된다.

(강의에서는 왼쪽 위 모서리를 (0, 0), 오른쪽 아래 모서리를 (1, 1)로 표시한다.)

 

이제 신경망이 예측하려고자 하는 training set는 object의 label뿐만 아니라 4개의 정보(bounding box)가 추가된다. 

위 이미지에서는 \(b_x = 0.5, b_y = 0.7, b_h = 0.3, b_w = 0.4\)로 나타낼 수 있을 것이다.

 

따라서 target의 label y는 아래와 같이 정의될 수 있다.

여기서 \(p_c\)는 이미지에 object가 존재하는지에 대한 확률이고, \(b_x, b_y, b_h, b_w\)는 bounding box의 위치정보, 나머지 \(c_1, c_2, c_3\)는 각 class일 확률이다. 

그래서 아까전 예시인 이미지는 왼쪽과 같이 y를 나타낼 수 있고, 만약 이미지에 object가 없다면 \(p_c = 0\)이고 나머지 정보는 'don't care'로 표시된다.

 

다음으로는 신경망을 학습시키기 위한 Loss Function(손실 함수)에 대해서 알아보도록 하자.

기본 true label은 \(y\) 그리고 신경망을 통해 나온 pred label은 \(\hat{y}\)이다. 

그리고 MSE(mean squared error)를 사용한다면, Loss function은 다음과 같다.(y는 8개의 unit을 가지고 있다)

\[\mathscr{L}(\hat{y}, y) = \left\{\begin{matrix} (\hat{y}_1 - y_1)^2 + (\hat{y}_2 - y_2)^2 + \cdots + (\hat{y}_8, y_8)^2 && \text{if } y_1 = 1 \\ (\hat{y}_1 - y_1)^2 && \text{if } y_1 = 0 \end{matrix}\right.\]

(\(p_c = 0\)이라면 나머지 값은 모두 don't care이기 때문에 두번째줄처럼 계산된다)

 

설명을 단순하게 하기 위해서 MSE를 예시로 설명했지만, \(c_1, c_2, c_3\)에는 log-likelihood loss와 softmax를 사용하고, bounding box 정보에는 MSE를, 그리고 \(p_c\)에는 Logistic Regression Loss를 사용할 수도 있다.

 

[Landmark Detection]

우리는 신경망이 탐지할 object의 bounding box를 위치시키기 위해서 \(b_x, b_y, b_h, b_w\) 정보를 신경망의 output으로 내보내는 방법을 살펴보았다. 더 일반적인 경우에서는 신경망에서 이미지의 주요 포인트(landmark)를 X와 Y의 좌표로 나타낼 수 있다.

얼굴 인식에서 우리가 사람 눈의 코너부분이 어디에 있는지 인식하기 위해서 눈의 코너 부분의 X, Y 좌표를 가질 수 있을 것이다. 따라서 신경망의 output이 눈의 코너 부분의 좌표가 되도록 할 수 있다. 

만약 두 눈의 네 개의 코너를 전부 알고 싶다면, \(l_{1x}, l_{1y}, l_{2x}, l_{2y}, l_{3x}, l_{3y}, l_{4x}, l_{4y}\)로 output을 출력하도록 수정할 수 있다. 물론 4개 지점 이상의 output도 가능하다.

만약 입을 따라서 주요 landmark를 표시하면, 우리는 입 모양을 찾아내서 이 사람이 웃고 있는지 인상을 쓰고 있는지 말할 수 있을 것이다. 

 

얼굴에 64개의 랜드마크가 있다고 가정해보자. 우리는 이 모든 랜드마크를 포함하는 training set의 label을 생성해서 신경망이 얼굴의 주요 랜드마크가 어디에 있는지 학습시킬 수 있다.

따라서 output으로는 이 이미지가 얼굴인지 아닌지에 대한 정보 1개와 각 랜드마크의 위치 정보 128개, 총 129개의 output을 가질 수 있다. 이것은 얼굴의 감정을 인식하기 위한 기본 구성이 된다. (스냅챗, AR 필터 등에 사용)

 

만약 포즈를 감지하는 알고리즘을 학습한다면, 위와 같이 어깨, 팔꿈치, 팔목 등의 몇 가지 랜드마크의 위치들을 정의할 수 있다.

 

주의해야 할 점은 각 랜드마크가 일관성이 있어야 한다는 것이다. 만약 landmark 1은 언제나 왼쪽 눈의 코너부분이고, landmark 4는 항상 오른쪽 눈의 코너부분을 가리켜야한다는 것이다.

 

[Object Detection]

앞서 object localization과 landmark detection에 대해서 알아봤고, 이번에는 다른 object detection 알고리즘을 구성해보도록 하자. 바로, Sliding Windows Detection 알고리즘을 사용해서 Object Detection을 위해 ConvNet을 사용하는 방법이다. 

 

만약 자동차를 감지하는 알고리즘을 만든다고 가정해보자. 우선 우리는 input x와 output y로 label된 training set를 만들 수 있다. 

그래서 이 ConvNet은 ouput y를 출력한다.(input image가 자동차인지 아닌지)

 

그리고 다음으로는 특정 사이즈의 window를 하나 골라서, 탐색을 시작한다. 

그리고 직사각형 영역에 포함되는 이미지를 ConvNet의 입력으로 사용해서 직사각형 영역에 자동차가 있는지 없는지 확인하는 것이다. 위 이미지 위치에서는 자동차가 없다고 output을 나타낼 것이다. 그런 다음에 직사각형 box를 약간 옆쪽으로 옮기고 다시 ConvNet의 입력으로 사용해서 자동차가 있는지 확인한다. 

이런 방법으로 Sliding Window 알고리즘은 빨간 사각형이 포함하는 이미지 영역을 가져와서 ConvNet으로 수행하는 작업을 반복한다. window가 위치할 수 있는 모든 위치에서 확인할 수 있도록 계속 반복한다. 만약 조금 더 빠르게 진행하고 싶다면 strides를 더 크게 지정해서 sliding window 알고리즘을 수행할 수도 있다.(정확도는 떨어지겠지만)

그리고 더 큰 box를 사용해서 위 작업을 반복한다.

 

sliding window 알고리즘에 큰 단점은 바로 Computaion Cost이다. 이미지에서 많은 box 영역들을 추출해서 Convnet으로 각각 독립적으로 확인하기 때문이다. 만약 아주 큰 stride를 사용한다면, 확인할 box 영역들은 줄어들어서 더 빨라지겠지만, 성능에 안좋은 영향을 끼칠 수 있다. 그리 나쁜 방법은 아니지만, sliding window는 매우 느리고, 또한 매우 작은 stride를 사용하지 않는 한, object의 정확한 위치를 감지하는 것도 불가능하다.

 

다행히 Computation Cost에 대한 좋은 방법이 있다.

 

[Convoluional Implementation of Sliding Windows]

위에서 보았듯이 ConvNet을 사용한 Sliding Window 알고리즘을 알아봤는데, 이 방법이 매우 느리다는 것을 보았다.

이번에는 이 알고리즘을 어떻게 Convolutional하고 실행할 수 있도록 FC(Full connected) layer를 Convolutional Layer로 튜닝하는 것을 알아볼 것이다.

 

Object Detection 알고리즘이 14x14x3의 input을 가진다고 가정하고, 5x5 filter 16개를 사용한다고 하자.

위 구조는 기본적으로 object를 분류하기 위한 모델이다. 

 

object detection을 위해서 우리는 위 모델에서 FC를 400개의 5x5 filter로 튜닝해서 아래와 같이 convolve 시킬 것이다.

이렇게 튜닝한 모델이 어떻게 object detection(sliding window)에 사용이 될까? (OverFeat 논문에 근거)

우리는 14x14x3의 input image를 ConvNet에 통과시켜서 1x1x4의 결과를 얻었다.

만약 16x16x3의 input을 입력으로 사용한다면 어떻게 되는지 살펴보자.

기존 sliding window 알고리즘이라면, 14x14 box를 사용해서 한 칸씩 이동하면서 각각의 14x14x3 이미지가 ConvNet에 독립적으로 수행하게 된다.(stride가 2라면 16x16x3의 이미지에서 총 4번의 ConvNet 연산이 수행된다)

즉, 16x16x3 이미지를 입력으로 사용하면, 총 4개의 14x14x3의 입력을 각각 ConvNet을 수행하게 되고 겹치는 부분은 연산이 중복된다. 

하지만, 위에서 튜닝한 방법을 사용하면 4개의 이미지에서 중복되는 연산이 공유가 가능하게 된다.

16x16x3을 튜닝한 ConvNet에 통과시키면 2x2x4의 output이 나오게 되고, 1x1x4의 output이 총 4개가 나오게 되는 것이다. 따라서, 튜닝을 통해서 독립적인 input으로 계산하는 것이 아닌, 4개의 input을 하나의 계산으로 결합해서 공통되는 부분을 공유하게 되는 것이다.

 

28x28x3의 이미지로 다시 한번 어떻게 결과가 나오는지 살펴보자.

기준이 되는 box의 크기가 14x14이기 때문에, 28x28x3의 이미지에서 sliding window를 적용하면 총 8x8개의 독립적인 input이 생기게 된다. 하지만 튜닝한 ConvNet을 사용하면 공통되는 연산 부분을 공유하게 되고, output으로 8x8x4의 결과를 얻을 수 있다. 이렇게 Sliding Window의 연산 비용 문제가 해결이 된다.

(여기서 이미지가 8x8개의 구역으로 나뉘어지는 것은 MaxPool의 stride의 영향이다)

 

하지만, 여기에는 bounding box의 위치가 그리 정확하지 않다는 단점이 있는데, 이 문제는 어떻게 해결할 수 있는지 살펴보도록 하자.

 

[Bounding Box Predictions]

Slinding Window 알고리즘에 Convolutional 구현을 적용해서 계산 비용 문제를 해결했지만, 정확한 bounding box를 찾을 수가 없다는 문제가 발생했다. 즉, Slinding Window의 box를 사용해서 탐색하다보면, object가 정확하게 그 box에 위치하지 않고 object의 일부만 걸치는 문제가 발생할 수 있다는 것이다.

또한, object가 정사각형의 bounding box를 가지지 않을 수도 있다.

 

결론을 먼저 이야기하면, 정확한 bounding box를 가져오는 방법은 YOLO(You Only Look Once) 알고리즘을 사용하는 것이다.

 

input 이미지가 100x100인 경우를 예시로 살펴보자. 

우선 이미지의 3x3 grid를 설정한다. (설명을 위해서 3x3으로 설정했지만, 보통 19x19 grid를 사용)

YOLO 알고리즘의 기본 아이디어는 위에서 학습했던 Image Classification과 Image Localization을 9개의 grid에 각각 적용하는 것이다. 

그리고 training set에서 사용하는 label을 정의해주어야 하는데, 9개의 grid셀에 대해서 label y를 설정한다. 여기서 y는 위에서 본 것처럼 8차원 vector이다.(\(p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3\))

YOLO 알고리즘은 Object의 중간점(Mid Point)를 취해서, 이 중간점을 포함하는 grid 셀에 object를 할당한다.

그래서, 왼쪽 위 보라색 셀은 object가 존재하지 않기 때문에 \(p_c = 0\)이 되고 나머지 요소들은 'don't care'가 된다. 초록색으로 표시된 셀은 차량이 존재하고, 그 차량의 중간점이 포함되기 때문에 [\(1, b_x, b_y, b_h, b_w, 0, 1, 0\)] 으로 labeling되고, 노란색으로 표시된 셀도 마찬가지이다.

 

3x3 grid로 구역이 나누었고, 각 grid 셀에서 8차원 vector y를 가지고 있기 때문에, 목표로하는 output의 3x3x8의 형태를 가지게 되며, output은 각각의 구역과 매칭이 된다.

즉, input 100x100x3을 Conv와 MaxPool을 거쳐서 3x3x8의 output이 나오게 된다. 여기서는 3x3 grid를 사용했지만, 보통 19x19 grid를 사용하고, 19x19 grid를 사용한다면 output은 19x19x8의 형태를 띄게 된다.

(19x19 grid를 사용한다면, 더욱 세밀하게 구역을 나누는 것이고, 하나의 셀에 여러개의 object가 할당될 가능성을 감소시켜준다. -> 하나의 셀에 object의 Mid Point가 두 개가 될 확률을 줄여준다.)

 

결국 YOLO 알고리즘은 Object Classification/Localization과 Sliding Window Convoluional Implementation을 합친 것이라고 볼 수 있다.

 

추가로 bounding box의 \(b_x, b_y, b_h, b_w\)는 어떻게 인코딩을 해야할까 ?

YOLO 알고리즘에서 각 cell에서 왼쪽 위의 점은 (0, 0)이고, 오른쪽 아래의 점은 (1, 1)이다. 그리고 너비와 높이는 cell의 전체 너비와 높이의 비율로 지정된다. 따라서 노란색 셀에 있는 차량의 bounding box 정보는 \(b_x = 0.4, b_y = 0.3, b_h = 0.9, b_w = 0.5\)로 나타낼 수 있다. 

그리고 bounding box의 mid point는 (0, 0)과 (1, 1) 사이의 좌표값을 가지기 때문에 항상 0에서 1사이의 값을 가지게 되지만, bounding box의 너비와 높이는 각 cell의 크기를 벗어날 수 있기 때문에 1보다 커질 수 있음에 유의한다.

 

Bounding box를 설정하는 방법은 여러가지가 있지만, 위 방법도 합리적인 방법 중의 하나이며, YOLO 논문을 살펴보면 훨씬 더 잘 동작할 수 있도록 파라미터화된 것들이 있다.

 

[Intersection over union]

Intersection over union(IoU)은 Object Detection이 잘 동작하는지 판단하기 위한 함수이다. 이 함수는 Object Detection 알고리즘을 평가할 때나 더 잘 동작되도록 하기 위해서 사용된다.

만약 Object Detection 알고리즘을 통해서 보라색의 bounding box를 얻었다면, 이것은 좋은 결과일까?

좋은 결과인지 판단하기 위해서 IoU 함수를 사용하고, 이 함수는 두 개의 bounding box의 Intersection over Union을 계산한다.(여기서는 보라색 박스와 빨간색 박스의 IoU 계산)

즉, 두 개의 bounding box의 전체 넓이와 겹치는 부분의 넓이의 비율을 계산하는데, 보통 IoU 값이 0.5보다 크다면 예측한 bounding box의 결과가 옳다고 판단한다. 

예측된 bounding box가 실제 측정한 bounding box와 완벽하게 일치하면 IoU는 1이 되며, 일반적으로 0.5보다 크거나 같다면 그 bounding box는 합리적이라고 판단한다. 보다 엄격하게 체크하고 싶다면, 기준을 0.6 등으로 높이면 된다.

 

IoU는 Object Localization Detection의 정확성 여부를 평가하는 방법이고, 일반적으로는 두 bounding box 사이의 겹치는 정도의 척도라고 할 수 있다. 또한, 두 bounding box가 얼마나 비슷한지 측정하는 방법이 될 수도 있다.

 

IoU는 non-max suppression에서 사용된다.

 

[Non-max Suppression]

지금까지 알아보았던 Object Detection의 문제점 중 하나는 알고리즘이 동일한 object를 여러번 탐지할 수 있다는 것이다.

즉, 위와 같이 19x19 grid를 사용했을 때, object의 Mid Point가 다양한 cell에서 포함된다고 판단될 수 있다는 것이다. 

이 경우에 Non-max suppression을 사용하면 알고리즘이 하나의 object를 하나의 cell에서 한번만 탐지할 수 있도록 한다.

 

19x19 grid, 361개의 grid cell에서 image classification/localization을 수행하고 있기 때문에, 위와 같이 각 cell에서 object가 여기에 있다고 판단할 수 있다. (박스 옆에 숫자는 \(p_c\)를 의미한다.) 따라서, 알고리즘을 실행할 때, 각 object에 대해서 여러 번의 탐지가 이루어 질 수 있다. 

 

여기서 non-max suppress가 하는 일은 하나의 object에 대한 여러 탐지를 정리하는 것이다. 

우선 각각의 detection과 관련된 확률을 조사한다. 즉, \(p_c\)를 체크하는 것인데, 실제 알고리즘에서는 \(c_1, c_2, c_3\)와 곱한 확률을 의미하지만, 여기서는 자동차 class만 판단한다고 가정하고(class가 하나만 존재) 단순히 \(p_c\)만을 가지고 설명하도록 하겠다.

\(p_c\)를 조사하고 가장 큰 것만 취한다. 위 이미지의 오른쪽 차량의 경우에는 0.9의 \(p_c\)만을 취하는 것이다. 

 

그리고 나서, non-max suppress는 남은 box들을 가지고, 0.9의 box와의 IoU를 조사한다.

그리고, 계산된 IoU가 많이 겹쳐있어서 높다면, 그 box는 suppress(제거)한다. (class가 여러개인 경우) 만약 낮은 IoU라면, 다른 object를 탐지했을 가능성이 높고, 제거하지 않는다. 위 경우에서는 차량만 탐지하는 예시였고, IoU 또한 높은 값으로 겹쳐있으므로 나머지 0.6, 0.7의 box는 제거된다.

이미지 왼쪽의 차량도 마찬가지이다.

 

따라서, non-max suppress 과정을 거치면 다음과 같이 정리가 된다.

위 예시를 통해 non-max suppression 알고리즘을 정리하면 다음과 같다. (class는 차량판단만 한다고 가정)

1. 각 cell의 output에서 \(p_c\)를 조사해서 0.6 이하라면 제거

2. 남은 box 중에서 가장 높은 \(p_c\)를 갖는 박스를 예측된 bounding box로 선택

3. 남은 box들의 IoU(2에서 선택한 박스와의 IoU)를 계산해서 0.5보다 크다면, 같은 object일 확률이 높으므로 제거

 

여기서 class가 자동차 하나뿐이었지만, 만약 자동차/보행자/오토바이로 3개의 object를 탐지한다면, non-max suppress를 독립적으로 각각 3회 수행한다.(output class당 수행해야함)

[Anchor box]

지금까지 보았듯이 Object Detection의 문제점 중의 하나는 각 grid cell이 오직 하나의 object만 감지할 수 있다는 것이다. 여기에서 우리는 anchor box라는 아이디어를 가지고 이 문제를 해결할 수 있다.

 

다음과 같은 예시를 살펴보자.

위 이미지에서 자동차와 사람은 거의 동일한 Mid Point를 가지고 있다. 즉, 이전의 알고리즘을 사용한다면, output y가 탐지할 object 중의 하나를 선택해야 한다.

 

하지만 anchor box를 사용하면 이 문제를 해결할 수 있는데, 우선 anchor box의 모양을 미리 정의한다.

그리고 두 개의 anchor box를 output과 연관시킨다. (일반적으로 5개 or 그 이상의 anchor box를 사용함)

따라서 두개의 anchor box로 인해서 output y는 각 anchor box에 대한 8차원의 unit을 가지게 된다.

위 이미지에서 보행자는 Anchor Box 1에 더 유사하고, 자동차는 Anchor Box 2에 더 유사하기 때문에, Anchor Box 1에 대한 output은 보행자 정보로, Anchor Box 2는 자동차 정보로 인코딩 할 수 있다.

 

Anchor Box 알고리즘을 정리하면 다음과 같다.

이전에는 학습 이미지에서 각 object는 object의 Midpoint를 포함하는 하나의 grid cell에 할당이 되었다면,

두 개의 Anchor Box를 사용함으로, 각 object는 object의 Midpoint를 포함하는 grid cell에 할당됨과 동시에 IoU가 가장 높은 Anchor Box에 할당된다.

즉, object는 (grid cell, anchor box)의 쌍으로 할당이 되는 것이다.

 

따라서, 위 이미지 예시에서 output y는 다음과 같다.

만약 이 이미지에서 사람이 없다면, Anchor Box 1에 대한 정보에서 \(p_c\)는 0이되고, 나머지는 'don't care'가 된다. 그리고 Anchor Box 2의 정보는 그대로 차량의 정보를 가지게 될 것이다.

 

여기서 2개의 Anchor Box를 사용했는데, 만약 3개의 object의 Midpoint가 같은 grid cell에 있다면 어떻게 될까?

이런 경우에는 알고리즘이 잘 처리하지 못하게 될 것이다. 이런 경우에 default tiebreaker(3개 이상의 object가 탐지될 경우의 예외)를 설정해두어야 한다. 실제 19x19 grid에서 두 object가 같은 midpoint를 가지는 확률이 그리 크지는 않다.

 

Anchor Box의 선택은 manual로 선택을 할 수도 있고, K-mean 알고리즘을 통해서 얻고자하는 유형의 object 모양끼리 그룹화할 수도 있다.

 

[YOLO Algorithm]

이번에는 위에서 알아봤던 내용들을 결합해서 YOLO Object Detection Algorithm을 정리해보자.

 

먼저 training set를 구성하는 방법이다.

여기서 anchor box를 두 개 사용할 것이고, class는 총 3개이기 때문에 output y의 shape는 3x3x2x8 or 3x3x16이다.(보통 anchor box별로 나누지 않고, vector 꼴로 나타내는 것으로 보임)

여기서 대부분의 grid cell은 object가 존재하지 않기 때문에, 각 anchor box의 \(p_c\)는 0이고, 초록색으로 표시된 cell에만 object가 존재한다. 또한, 차량의 bounding box가 anchor box 2의 모습과 유사하기 때문에(더 높은 IoU를 가지기 때문) anchor box 2에 해당하는 정보를 구체화한다. 

 

만약 19x19 grid cell을 사용하고, anchor box 또한 5개를 사용한다면, output y는 19x19x5x8 or 19x19x40의 shape를 갖게 된다.

 

그리고 예측을 하게 되면, 다음과 같다.

object가 없는 cell은 파란색과 같은 결과를 나타낼 것이고, 초록색 cell은 anchor box 2에 bounding box의 정보를 담아서 output으로 예측할 것이다.

 

마지막으로 non-max suppression을 수행하는데, 다른 이미지를 가지고 살펴보자.

anchor box가 두개이기 때문에, 각 grid cell은 최대 2개의 bounding box를 가질 수 있다. 여기서 낮은 확률을 가지는 예측 결과는 제거하고, 각 class에 non-max suppression을 적용해서 최종 예측결과를 얻는다.

YOLO 알고리즘은 실제로 가장 효과적인 Object Detection 알고리즘 중의 하나이다.

 

[Region Proposals]

 

Sliding Window 알고리즘을 떠올려보면, window들을 슬라이딩하면서 object를 탐지하는 방법이지만, 많은 구역들을 살펴보는 단점이 있다.

R-CNN은 이렇게 탐지하는 것이 아닌, 이미지로부터 Region 후보군을 뽑아내서 object를 탐지하는 방법이다.

즉, 오른쪽 이미지처럼 segmentation algorithm을 통해서 여러개의 집합(?)으로 나누어서 유사한 픽셀들을 뽑아내서 object를 탐지한다.

물론 R-CNN 알고리즘은 느리지만, 이 알고리즘의 속도를 높이기 위한 연구들이 있었다.

(자세한 것은 더 알아봐야겠지만.. 결국에는 Segmentation 알고리즘에 Convolutional network를 적용해서 각각 독립적으로 수행하는 것이 아닌, 한 번의 연산으로 탐지를 하는 것으로 생각된다.)

 

댓글