Perception/Object Detection

[Object Detection] R-CNN

고집호랑이 2023. 4. 13. 07:35

본격적으로 딥러닝 기반 Object Detection 방법에 대해서 설명하기 이전에 Object Detection의 역사에 대해서 살펴보도록 하겠습니다.

 

Object Detection의 역사

딥러닝이 등장하기 이전의 object detection은 규칙 기반의 고전적인 컴퓨터 비전을 이용하여 만들어졌습니다. 

 

2012년 AlexNet이 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회에서 우승을 차지한 이후 CNN이 주목을 받게 되는데, 이 CNN을 처음 Object Detection 분야로 끌어와 사용된 R-CNN을 시작으로 딥러닝 기반의 Object Detection 방법이 발전하게 되었습니다.

 

이러한 딥러닝 기반의 Object Detection은 이후 1-stage detector와 2-stage detector로 분류가 됩니다.

 

object detection의 역사

 

2-stage detector

Object Detection은 Localization과 Classification, 2가지가 모두 수행되어야 했었습니다. Localization에는 object가 있을 만한 후보 영역을 미리 찾는 Region Proposal이 사용되었죠. 

 

2-stage detector는 Region Proposal과 Classification이 순차적으로 이루어지는 방법입니다. 

 

대표적으로 R-CNN 계열의 방법들이 이에 해당합니다.

 

2-stage detector

 

1-stage detector

반면에 1-stage detector는 Region Proposal과 Classification이 동시에 이루어지는 방법입니다. 

 

대표적으로 YOLO가 이에 해당되죠.

 

1-stage detector

 

따라서 2-stage detector는 정확도는 높지만 비교적 속도는 떨어지고, 1-stage detector는 속도는 빠르지만 정확도가 비교적 떨어진다는 특징이 있습니다.

 

하지만 최근에 나온 1-stage detector인 YOLOv8을 보면 속도도 굉장히 빠를뿐더러 정확도도 높은 것을 확인할 수 있습니다. 

 

이제 본격적으로 R-CNN을 시작으로 딥러닝 기반의 Object Detection 방법을 하나하나 설명하도록 하겠습니다.

 

R-CNN

R-CNN의 전반적인 과정은 다음과 같습니다.

 

R-CNN의 전반적인 과정

 

1. Region Proposal

이전에 배웠던 Selective Search 알고리즘을 이용하여 입력된 이미지(input image)에서 object가 있을 만한 영역 2000개를 미리 뽑습니다. 

 

2. Image Crop & Warp 

CNN은 입력 이미지가 신경망을 통과하고 Flatten() 함수를 통해 펼쳐진 후 Dense Layer(1D Fully Connected Layer)를 통과합니다.

 

이때 이 Dense Layer가 가지고 있는 가중치의 개수는 정해져 있습니다. 예를 들어 입력 사이즈가 4이고 다음 hidden layer의 노드 수가 5라면 Dense Layer의 가중치 개수는 20(4 x 5)개로 고정되어 있습니다.

 

따라서 만약 입력 사이즈가 5로 바뀐다면 가중치의 개수는 총 25(5x5)개가 필요하지만 Dense layer의 가중치 개수는 20개 밖에 없으므로 문제가 발생하게 됩니다.

 

결국 Dense Layer의 입력인 Feature Map의 크기는 고정되어야 하며 연쇄적으로 CNN에 입력되는 이미지의 사이즈도 고정되어야 합니다. R-CNN 논문에서 사용한 CNN의 경우 입력 이미지의 크기가 227 x 227 이어야만 합니다.  

 

Selective Search로 뽑은 2000개의 영역은 크기와 모양이 다 다를 것이기 때문에 이 2000개의 영역을 모두 자르고(crop) 찌그러트려(warp) 227 x 227 사이즈의 크기로 만들어줍니다.

 

3. Feature Extractor

ImageNet 데이터로 pretrained된 CNN 모델을 가져와 fine tuning 시킨 후 crop & warp 시킨 2000개의 영역을 각각 통과시켜 4096의 크기를 가진 특징 벡터를 추출합니다.

  • fine tuning: 사전에 학습된 모델을 기반으로 자신이 원하는 이미지 셋에 맞게 가중치 값을 조절하는 것

 

4. Classification

4096의 크기를 가진 특징 벡터를 이용해 SVM Classifier을 학습시킵니다. 이미 학습된 CNN Classifier가 있는데 왜 SVM Classifier을 쓰는지 의문이 들 수 있는데 논문의 저자는 단순히 SVM Classifier를 사용했을 때의 성능이 더 좋았기 때문이라고 합니다. 

 

R-CNN을 제외하고 SVM Classifier는 더 이상 사용되지 않기 때문에 자세한 설명은 생략하도록 하겠습니다. 

 

이제 Selective Search로 뽑힌 각 2000개의 영역들은 CNN 모델과 학습된 SVM Classifier를 통과함으로써 각 class에 해당할 확률 값을 가지게 됩니다.

 

5. Bounding Box Regression

처음에 Selective Search로 2000개나 되는 영역들을 뽑았기 때문에 하나의 object 위치를 표현하는 여러 개의 Bounding box들이 존재할 것입니다.  

 

먼저 SVM Classifier로 나온 각 class에 해당할 확률(confidence score)과 IoU를 이용해 이전에 배웠던 NMS을 적용하여 겹치는 Bounding box들을 제거해 줍니다. 

 

남은 Bounding box들은 하나의 object를 가르키는 가장 적합한 Bounding box이지만 Ground Truth(실제 Bounding Box)와 완전히 같을 가능성은 낮습니다. 

 

따라서 성능을 높이기 위해서 이 box의 위치를 조정해줘야하는데 이를 Bounding Box Regression이라고 합니다.

 

아래와 같이 object를 가르키는 초기 Bounding Box의 위치를 P로, Ground Truth의 위치는 G로 표시된다고 가정해 봅시다. ($x, y, w, h$는 각각 $x$좌표, $y$좌표, 넓이, 높이를 뜻합니다.)

 

Groung Truth 좌표와 예측 좌표

 

이제 우리는 P를 G로 최대한 가깝게 만들어주기 위해서 임의로 만든 $d_{*}(P)$함수를 사용해줄 것입니다.

 

d(P) 함수

 

$x, y$ 좌표는 점으로 위치만 바꿔주면 되지만, $w, h$는 길이이기 때문에 비율을 조절해주어야 합니다. $d_{*}(P)$함수를 이용해 예측한 Groung Truth 위치를 $\widehat{G}_*(P)$라고 하면 $\widehat{G}_*(P)$은 다음과 같습니다.

 

예측 Ground Truth 좌표
예측 Ground Truth

 

그리고 실제로 위치 P를 위치 G로 만들기 위해 필요한 $x, y, w, h$의 이동량을 $t_*$라고 하면, $t_*$는 다음과 같습니다. 

 

실제 필요한 이동량

 

이제 우리는 임의로 만든 $d_{*}(P)$함수를 $t_*$와 최대한 같게 만들어준다면 위치 P를 위치 G에 가깝게 만들어줄 수 있습니다.

 

 $d_{*}(P)$함수를 $t_*$와 최대한 같게 학습시키기 위해서 논문의 저자는 Loss 함수로 일반적인 MSE 에러 함수에 L2 normalization을 추가한 형태를 사용해 줍니다. 

  • MSE 에러 함수: 오차 = $($정답 - 예측$)^2$

 

그리고 $d_{*}(P)$ 함수로는 경험적 연구에 따라서 가장 mAP 성능이 좋게 나왔던 pool5 layer에서 얻어낸 특징 벡터를 사용하여 구하게 됩니다. 

 

bounding box의 Loss 함수
d 함수 근사

 

R-CNN의 한계점

R-CNN의 mAP

 

R-CNN은 위의 그림을 보면 알 수 있듯이 동시대의 다른 detection 알고리즘들에 비해 높은 정확도를 보여주게 됩니다. 

 

하지만 R-CNN의 경우 개별 이미지 당 2000개의 영역 모두에 대해서 각각 CNN feacture extract을 수행하기 때문에 속도 측면에서는 성능이 떨어질 수밖에 없습니다. 

 

 

테스트 시 R-CNN은 이미지 하나당 GPU에서는 13초, CPU에서 54초가 걸린다고 합니다.

 

또한 Region Proposal로 뽑은 2000개의 영역을 crop과 warp시키는 과정에서 data의 손실도 일어날 수 있겠죠.

 

마지막으로 R-CNN은 end-to-end 딥러닝이 아닙니다.하나의 모델이 아닌 Selective Search, CNN, SVM, Bounding Box Regression 총 네 가지의 모델이 결합된 형태로 이루어져 있어 한 번에 학습이 불가능하다는 단점이 있죠.

 

이후 이와 같은 단점들을 보완하는 Fast R-CNN, Faster R-CNN이 나오게 됩니다. 

 

다음 포스팅에서는 R-CNN의 단점을 보완할 수 있는 SPPNet에 대해서 설명하도록 하겠습니다.

 

Reference

 https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의

 

1905.05055.pdf (arxiv.org) 

 

https://airsbigdata.tistory.com/211

 

https://yeomko.tistory.com/13

 

https://89douner.tistory.com/88