본문 바로가기
딥러닝/CV 논문

[Object Detection] R-CNN

by 혜 림 2021. 6. 5.

Rich feature hierarchies for accurate object detection and semantic segmentation

늘 느끼는 거지만... 말로 이해한 걸 표현하는 건 너무 어렵다
말로 느끼는 걸 표현하는 건 쉬운데 이해한 걸 표현하기는 어렵다 특히 전문 용어가 많고 왁왁 그런 경우에는

저번 포스팅을 올린지로 벌써 한 달... 다들 내가 이제 블로그 안 하는 줄 알겠지?? 하지만 이 논문은 정말 갑자기 난이도가 뛴 기분이라 한 달 걸렸대도 이상할 게 없다.... 저번 포스팅한 AlexNet은 그 용도가 image classification에 있다. 즉 주어진 이미지가 있으면 아! 이건 초콜렛(먹고 싶어서 그렇다)아! 이건 우쿨렐레(치고 싶어서 그렇다)를 구분해주는 데 그 역할이 그쳤다. 하지만 오늘 볼 것은 object detection에 그 목적이 있다. 사진에 어떤 개체가 있는지 구분하는 것에서 나아가 구체적으로 어느 위치에 있는지를 찾아준다. 하나의 사진에서 복수의 개체를 읽을 수도 있고, 그런 것이다.


결과 이미지를 보면 어떤 차이인지 알 수 있을 것이다.
(좌: image classification 우: object detection)

그렇다면 좌측 그림의 <cherry>도 object detection 을 이용하면 두 개의 class를 잡아낼 수 있을테니, 더 정확해진다고 해야 하나? 하여튼 그런 느낌이다. object detection 에는 image claasification이 배제되는 것은 아니다. image classification역시 object detection 과정에 포함된다. 거기에 덧붙여서 classify 할 영역을 찾는 localizing 의 과정이 포함되는 것이다.

따라서 object detection 은 bounding-box(우측 사진의 붉은 테두리)를 찾고, 그 영역 내의 이미지를 classify하는 것이 목표다. bounding box를 수행한 후 classify를 할 수도 있고, 동시에 수행할 수 있는데 이는 각각 2-stage, 1-stage detector에 해당한다. R-CNN은 전자다.

본 포스팅에서는 CNN을 적용시켜서 object detection분야의 성능을 끌어올린 R-CNN에 대해서 정리해보고자 한다.

영어가 너무 많으니까 보기 싫어서 한국어로 바꾸겠다 혹시 영어는 이건데 한국어론 처음보는 표현이다? 싶으면 내 마음대로 쓴 거다...

더보기

- image classification 이미지 분류

- object detection 객체 탐지

- localization 로컬리제이션

 

 

** @을 이용해 내용, 흐름을 구분한다.

 

0. Abstract

크게 두 가지 문제를 해결함으로써 그 성능을 크게 올렸다.

(1) apply high capacity convolutional neural networks to bottom-up region proposals in order to localize and sement objects
(2) when labeled training data is scarce, supervised pre-training for an auxiliary task, followed by domain-speficif fine-tuning

CNN을 적용시켰고, 데이터 부족을 fine-tuning을 통해서 해결했다.

따라서 위 알고리즘은 CNN에 Region 탐색을 덧붙였으므로, 두 용어를 혼합해서 R-CNN이라고 부르기로 했다.
Overfeat은 R-CNN과 달리 bounding-box를 찾는 알고리즘으로 sliding window를 이용했다. 그 외에 CNN을 이용한다는 점은 동일하므로, Overfeat와 성과를 비교한다.

1. Introdution

첫 페이지는 object detection에 사용되었던 SIFT와 HOG라는 알고리즘들이 있다~ 정도로 소개하고 있다.

@ AlexNet을 통해서 CNN이, 그러니까 딥러닝이 성공적으로 image classification 에 데뷔를 한 이후로 이 연구팀은 CNN을 object detection 에 도입하고자 한다. 그렇게 해서 CNN이 획기적으로 image classification 성능을 높였던 것처럼 object detection 분야에서도 그 덕을 보고 싶다.
그렇다면 image classification 과 object detection 두 목표의 간극을 어떻게 잘 연결할 bridge 방법이 없을까? 두 목표를 연결할 수 있다면 CNN을 흘려 보낼 수 있을 것이다. (너무 비유적이니까 정정한다) 두 목표가 공유하는 관점이 있다면 CNN을 object detection에 역시 사용할 수 있을 것이다. 그래서 두 간극을 연결하기 위해서 아래의 질문 내용을 수행하기로 한다.

(1) localizing objects with a deep network
(2) training a high-capacity model with only a small quantity of annotated detection data

(1) localizing objects with a deep network

이미지 분류와 달리 객체 탐지는 객체의 위치를 찾을 수 있어야 한다. 이를 localization 이라고 하는데, 로컬리제이션이라고 하겠다. 글로벌리제이션 반대어로 쓰이는 로컬리제이션과 혼동하지 말기를!!
이를 위한 기법으로 여러가지가 있지만 실제 트레인 셋에서는 성과가 좋지 않거나, 비효율적이다(특히 sliding window기법). 기존에는 sliding window 기법을 사용하기 위해서 CNN 구조를 사용하더라도 공간적 정보를 유지하기 위해서 합성곱망과 pooling을 2번만 시행했다. sliding window를 수행하면서 5겹짜리의 구조를 수행해낼 만한 high capacity가 아니었기 때문이다. 하지만 본 팀은 Alex 팀이 그랬던 것처럼 5겹의 구조를 사용하고 싶었고,이를 위해 보다 효율적인 로컬리제이션 방법이 필요했다. 그게 바로, recognition using region 이다. 이미 객체 탐지에서 좋은 성과를 낸 바 있다.

그래서 과정은

1. recognition using region 을 이용해 2000개의 카테고리와 독립적인 region proposal 생성
2. CNN을 통해 고정된 길이의 특징 벡터 추출
3. 선형 SVM을 통해 특징 벡터의 분류



로 이루어진다.

Figure1: 전체과정을 나타낸다

(2) training a high-capacity model with only a small quantity of annotated detection data

PASCAL 데이터 셋은 이미지의 바운딩 박스와 class 값이 있어서 객체 탐지에 적절하다! 하지만 안타깝게도 데이터 양이 많지 않다. 그 많은 데이터 class도 적고 바운딩 박스도 칠 생각을 하면 아찔하다.. 그래서 R-CNN에서는 완전히 새로운 CNN을 학습하는 것 대신, 이미 학습된 모델을 이용하기로 한다. 즉 pre-trained 된 CNN 모델을 fine-tuning을 통해 우리의 목적에 맞는 모델로 바꿔 학습하는 것이다.
이때 pre-trained된 CNN 모델은 AlexNet에서 사용했던 ILSVRC 데이터 셋을 이용했고, 그 구조를 이용했다. ILSVRC 데이터 셋은 이미지 분류에 적합한 데이터 셋으로, 바운딩 박스는 없고 각 사진의 class 분류만 있다. 이를 통해서 데이터 부족을 해결했다고 한다.
PASCAL 데이터 셋에 대해서 자세하게 알고 싶다면 아래 블로그 참조
https://deepbaksuvision.github.io/Modu_ObjectDetection/posts/02_01_PASCAL_VOC.html

@ 또, 바운딩 박스를 찾는 과정도 그렇지만, 많은 과정에서 카테고리 특정 계산을 하지 않기 때문에 상대적으로 필요한 행렬 계산이 줄어들어서 효과적이다. CNN 자체 역시 사용하는 parameter가 다층 퍼셉트론에 비해서 작기 때문에, 그걸 사용하는 것만으로도 학습되는 가중치의 수가 적어지기 때문에 효율적이라고 할 수 있다.

@ 이러한 일련의 과정을 통해서 학습한 후 결과를 봤을 때, 어떤 에러가 큰 지 파악하여 본 모델의 문제를 고치고자 하였다. 결과적으로 가장 에러가 많은 것은 객체의 위치를 찾는 것이었고, 이를 해결하기 위해 우리는 bounding box regression 방식을 사용한다.

@ 또 이 모델의 목적은 객체 탐지에도 있었지만, 나아가서 다른 컴퓨터 비전 분야에도 적용해보고 싶었던 이 팀은 이를 semantic segmentation 에도 적용시킨다.
(* 같은 클래스끼리는 구분하지 않고 클래스만 구분하는 걸 의미한다. 즉 사진에서 사람1 사람2 이런 식이 아니고 사람 사람 이런 식으로 같은 클래스 내에서는 객체를 구분하지 않는다.)


2. Object detection with R-CNN


본 모델에서는 크게 3 가지의 모듈을 포함한다.

1. category-independent region proposal
=> 이미지 분류에 넣을 후보 영역을 색출해 냄
2. large convolutional network
=> 영역으로부터 일정한 길이의 특징 벡터를 추출함
3. a set of class-specific linear SVM
=> 이미지 분류

 

2.1 Module design

@ Region proposals:

selective search를 이용해서 후보 영역을 추출함

@ Feature Extraction:

CNN을 통해 도출된 4096차원의 벡터를 추출한다. 이때 사용하는 CNN은 Caffe를 통해서 이미 학습된 Alexnet이다. 227*227 RGB의 이미지에서 이미지 평균[각주:1]을 제하고, 이를 순전파를 통해 5개의 합성곱 신경망과 2개의 FC로 계산한다. 그런데 이때 CNN을 이용하기 위해서는 우리는 모든 input 이 될 후보 영역들을 동일한 사이즈로 만들어줄 필요가 있다.

위의 이미지에서 볼 수 있듯이, 후보 영역들인 바운딩 박스는 각각 크기가 다르다. CNN은 동일한 input size를 요구하기 때문에, 이 경우 학습이 불가능하다. 따라서 우리는 바운딩 박스를 동일하게 wrap할 필요가 있다. 추출된 영역에서 원래 이미지의 16pixel 만큼 더한 후에 정해준 규격(227*227)으로 팽창시킨다. (영어로 wrap이라서 그런건가 블로그에서는 찌그러뜨린다라고 많이 표현하던데 나는 그 이유를 잘 모르겠다 팽창이 맞는 것 아닌가?) 왜 이런 방식을 채택해서 wrap했는지는 appendix A에서 다룬다.

*227*227은 AlexNet에서 사용한 input 사이즈다.

 ** Appendix A Object proposal transformations

 (A) 행에 있는 사진들은 추출된 후보 영역들이다. 보시다시피 다 사이즈가 다르다. 이러면 안된다. 왜냐? 학습을 못하니까! 그래서 우리는 이걸 일정한 사이즈로 고쳐준다. 
 (B) 행은 후보 영역에 원래의 원본(tightest square with context)을 덧댄다. 
 (C) 행은 후보 영역에 원래의 원본을 덧대지 않는다.
 (D) 행은 후보 영역을 정해진 규격만큼 확장시킨다.


(D) 행의 2번째 열 의 방식을 설명해 보았다 저기서 16pixel이 패딩이다&nbsp;


 각 이미지 셋에 대해서 1번째 열은 padding = 0 인 경우, 2번째 열은 padding = 16인 경우에 해당한다.
 패딩이란 context padding을 의미한다.

 그리고 (B)와 (C) 같은 경우에는 정해진 규격만큼 확장시키는 것이 아니라 남는 부분이 생긴다. 위의 회색 부분!
 그럼 이것을 어떻게 채우느냐? missing data is replaced with the image mean 
 이미지 평균으로 대체된다고 한다. 
 하지만 대관절, 앞에서 말했듯이 이 이미지 평균이 무엇인지 모르겠다ㅜㅜ 

 앞에서 순전파를 통해서 특징 벡터를 추출할 때 227 * 227 RGB데이터에서 이미지 평균을 뺀다고 했다. 따라서 이때 앞에서 채워진 missing data(회색 부분)은 다시 빼진다. 이래서 앞에서 이게 필요했던 것! 

 경험적으로 패딩이 있는 채로 확장시키는 것이 더 좋은 성과를 냈다고 한다. 경험적 결과로써, (D) 행의 2번째 열의 방식을 채택한다. 

2.2 Test - time detection


테스트 이미지에서 약 2000개의 후보 영역을 추출한다. 그리고 영역 내의 이미지를 일정한 사이즈로 wrap해주고, 그 후에 CNN 모델에서 순전파를 통해 특징 벡터를 추출한다. 그러고 난 후, SVM을 이용해서 각 클래스일 확률을 예측한다.
이때 모든 클래스에 대해서 점수가 매겨진 후보 영역에 greedy non - maximum suprresion 을 시행한다.

greedy non - maximum suprresion 이란

Reject regions if it has an intersection-over-union(IoU) overlap with a higher scoring selected region larger than a learned threshold.

 

뮤지컬 보러 가서 찍은 사진이다.&nbsp; 팬텀 노래 쩔어..


예를 들어서 보라색 빨간색이 우리들의 후보 영역이라고 생각하자.
2000개나 되는 후보 영역이 안 겹친다면 그것도 웃긴 일일 것이다. 얼마나 작게 나눴길래! 적당히 영역들이 잘 분리됐고, 2000개나 뽑아냈으면 당연히 겹치는 부분이 있기 마련이다. 그렇다면 이 겹치는 것들을 어떻게 할 것인가? 라는 질문에 대한 답이다.
빨간색 영역은 촛불일 확률이 78%라고 예측했다고 치고 보라색 영역은 촛불일 확률이 60%라고 예측했다고 치자.
IoU란 무엇인가? 겹치는 영역의 비율이라고 생각하면 된다.

$IoU = \frac{A영역 \cup B영역}{ A영역 \cap B영역}$

그래서 더 높은 확률로 예측된(78%) 영역과 후보 영역이 학습된 임계치를 넘어서면, 해당 영역을 제한다. 즉 보라색 영역은 제거되는 것이다. 따라서 우리는 최종적으로 하나의 객체에 대해서 하나의 값만 얻을 수 있다. 물론 이게 임계치에 따라서 정확히 원하는 결과가 아닐 수도 있다.

아래 그림을 보면 어떤 결과를 얻을지 좀 더 쉽게 다가올 것이다.

@ Run-time analysis

두 가지 속성이 본 모델을 효율적으로 만드는데 각각
(1) CNN 파라미터는 모든 카테고리에서 공유되고
(2) CNN을 통해서 계산되는 특징 벡터들은 다른 접근법에 비해서 저차원이기 때문이다.

예전에 포스팅한 CNN 글을 캡쳐했다. 자가표절. 다시 쓰기 매우 귀찮아. 아마도 이 대목에서 말하는 부분에 대한 내용일 것이다.

 

2.3 Training

 

@ Supervised pre-training


ILSVRC2012를 통해서 이미지 분류만 미리 학습한다(pre-trained). 이때 성능은 알렉스 넷과 유사하다.

 

@ Domain-specific fine-tuning


CNN에게 이미지 분류말고, 새로운 과제(객체 탐지)와 새로운 영역?(wrap 시킨 후보 영역들)에 적용시키기 위해서 계속해서 CNN 파라미터에 wrap한 후보 영역들만 이용해서 SGD를 수행한다.
미리 학습한 데이터 셋(ILSVRC2012)의 경우 최종적으로 분류하는 클래스가 1000개이기에, 이 역시 우리가 객체 탐지에 사용할 데이터 셋인 PASCAL의 클래스에 맞게 바꾸어줘야 한다. 다만 특징적인 것은 단순히 클래스의 갯수 N으로 output node의 수를 정하는 대신, N+ 1로 정한다. 이때의 1은 background image 때문이다. 즉, 객체를 포함하지 않는 순수 배경사진이 있을 수 있기 때문이다. (사실 내가 생각했을 땐 순수하게 background인 것도 애매하다)

background에 해당하는 이미지

한편, 분류의 클래스 갯수를 수정해서 pre trained AlexNet을 만든 후에는 이제 우리의 task인 객체 탐지에 맞추어 fine-tuning해야 한다.
그러기 위해선 이미지를 positive image와 negative 이미지로 나눈다.
이때 positive image란 객체를 포함한 영역을 의미하고, negative 은 객체를 포함하지 않는 배경을 의미한다. 이를 나누는 기준은 정답인 ground truth box와 wraped proposed bounding box사이의 IoU이다. 0.5를 넘으면 positive, 그렇지 않으면 negative로 판단한다.
그 후에 positive을 32개, negative를 96개를 묶어 하나의 미니 배치를 만든 후 SGD를 수행한다. 수행 전에는 앞에서 열심히 살펴봤던 image wrapping을 하게 된다. 깜빡 잊고 그림에서 빼먹었다. 배치 사이즈는 128이 되는 셈이다. 그런데 이때, 이렇게 negative가 미니 배치 하나에 많이 분포하는 이유는 객체가 포함된 영역이 작기 때문이다: becuase they are extremely rare compared to background

@ Object category classifiers


후.. 그럼 지금까지 CNN을 우리가 이용할 목적과 데이터 셋에 맞게 fine tuning하는 걸 했다. 그렇다면?!
이제는 이 모델을 이용하는 과정을 겪어야겠지..

 

 

** 6/21일 미처 까먹은 부분이 있어서 수정합니다 **
이 단계에서는 앞에서 fine tuning한 모델을 이용해서 linear SVM을 통해 클래스를 분류한다.
다만 linear SVM, 그러니까 선형 서포트 벡터 머신은 하나의 클래스 만을 구분할 수 있다.

(서포트 벡터 머신은 서로 다른 두 클래스의 경계선을 찾는 알고리즘이라고 할 수 있다.)

 

하지만 지금 우리가 분류해야 하는 Class는? 무진장 많을 것이다.

그래서 class specific한 svm을 만드는 것이다. 

그러면 이미지가 들어오면 car이다(1), 아니다(0)을 판단하는 svm, 사람이다(1), 아니다(0)을 판단하는 svm등 클래스의 수 만큼 svm이 만들어 질 것이다. 

** 하이라이트 사이의 내용이 첨가되었습니다**

image wrapping이 학습 전에 들어간다는 사실을 잊지 말자!

다만 이때는 fine tuning과는 달리 0.3의 임계점을 준다. fine tuning때와 다르게 임계점을 0.3을 이용하는 이유는 Appendix B에서 다룬다.

** Appendix B Positive vs. negative examples and softmax

이게 다른 이유는 처음에 fine tuning을 할 때는 선형 서포트벡터머신(SVM)을 고려하지 않았다고 한다. 그래서 나중에 SVM을 사용할 때 똑같이 임계점을 0.5로 설정했더니 그 결과가 안 좋았다 라는 것이다. 역시 경험적으로, fine tuning과 SVM 학습할 때의 임계점을 다르게 설정했다. 이는 근본적으로 중요한 문제라기보다는 fine tuing 데이터 수가 제한됐다는 점에서 기인한것이라고 판단된다.
한편 왜 fine tuning을 한 후에 SVM을 사용하는 지에 대한 대답도 본 부록에 나와있다. 이 또한 역시 경험적으로 성능이 줄었기 때문이다. (54.2% => 50.9% mAP)

두번째 문단에 대한 자세한 설명을 적자면 다음과 같다:
1) the definition of positive examples used in fine-tuning does not emphasize precise localization
임계치를 0.5로 잡는게 객체의 위치를 잡아내는 데 장땡이 아니라는 거다.
2) the softmax classifier was trained on randomly sampled negative examples rather than on the subset of "hard negatives" used for SVM training.


한편 standard hard negative mining method를 이용했다고 한다.

2.4 Results on PASCAL VOC 2010-12

다른 알고리즘들과 비교한 성능이다. BB는 bounding box regression 을 사용했음을 의미한다.
BB에 대해서는 추후 섹션에서 자세히 다룬다.

 

2.5 Results on ILSVRC2-13 detection

 

마찬가지로 성능에 대한 이야기니까 읽어보길 바란다.

3. Visualization, ablation, and modes of error

3.1 Visualizing learned features

 

Imae classificatino with deep convolution network 중 figure 3


위 사진은 AlexNet의 첫번째 커널이다. 보시다시피 직관적으로 이해할 수 있다. 3열과 4열을 기준으로, color-agnostic인지 color-specif인지 갈린다. 즉 edge 테두리 선과 색을 추출한다. 하지만 점점 망이 깊어지면서 각각의 커널을 해석하는 건 어려워진다.

그래서 non-paramatic 한 방법을 이용해서 신경들이 어떻게 학습했는지 살펴본다. (정확하게 비모수랑 이거랑 무슨 관련인진 모르겠다)

Compute the unit's activations on a large set of held-out region proposals, sort the proposals from highest to lowest actiation, perform non-maxium suppression, and then display the top-scoring regions.


후보 영역들을 scoring이 높은 것부터 차례대로 정렬한 다음, non-maximum suppression 을 실시하고 그 다음에 가장 높은 점수의 영역을 살펴보겠다는 것이다.

위의 사진은 마지막 pooling을 거친 layer의 결과다. (which is the max pooled output of the network's fifth and final convolutional layer) 이때 특성맵은 6 * 6 *256으로 9216 차원이다.

근데 위에서 보면 개랑 점들을 같은 클래스로분류했는데 이게 너무 웃기지 않은가? 개들이 점으로 분리된게 웃음 포인트다. 웃기니까 한 번 웃고가자. 이제 반왔다는 사실은 잊고 웃자

위 사진을 통해서 알 수 있는 것은:
The network appears to learn a representation that combines a small number of class-tuned features together with a distributed representatino of shape, texture, color and material properties.

따라서 위 맥스 풀링을 거친 레이어들을 살펴봤을 때 우리의 모델은 객체의 형태와 질감(texture가 뭐지? 질감인가..) 그리고 색에 대한 정보를 이용해서 객체를 분류한다는 것을 알 수 있다. 자, 그렇다면 이제는 분류를 살펴볼 차례다.
아직 이미지 분류는 살펴보지 않았다는 것을 잊지 말자. 이 항목은 우리의 fine tuned된 CNN 모델이 어떻게 학습하는지 살펴본 것이다.

3.2 Ablation studies

 

@ Performance layer-by-layer, without fine-tuning


위에서는 CNN 모델이 어떻게 특징 벡터를 추출하는지 학습 과정을 살펴보았다면 이제는 이미지 분류를 어떻게 하는지 살펴볼 차례다. 이미지 분류는 FC(Fully Connected) layer을 거치고 최종적으로 linear SVM을 거쳐서 output을 산출한다. 그러기에 먼저, fine tuning이 없을 때의 결과는 FC6, FC7을 동시에 제거했을 때가 오히려 더 낫다는 것이다. 즉, using only the convolutional layers of the CNN 일 때 성적이 더 높다는 것이다.
중간에 fc6은 component-wise half-wave rectified, fc7은 half-wave recitification 이라고 하는데 활성화함수로서 렐루 함수를 썼다는 맥락인 것 같다. fc6과 fc7의 정확한 차이는 잘 모르겠다.
위 테이블의 1-3열이 fine tuning이 없는 결과다. 보면 fc7을 사용하면 오히려 fc6을 이용했을 때보다 mAP가 준다. 이게 중요한 이유는 무엇이냐면 CNN 모델에서 사용하는 파라미터의 수를 줄일 수 있기 때문이다! 따라서 좀 더 gpu 메모리에 영향에서 자유로워진다. 또한 fc6과 fc7을 사용했을 때 성능은 크게 뒤쳐지지 않지만 전체 CNN 모델에서 사용한 파라미터의 6%만 사용할 뿐이다. 따라서 가성비 측면에서 보면 fine tuning하지 않고 ILSVRC2012를 통해서 미리 학습한 모델로 학습을 할 때는 두 레이어 모두 제거하는 것에 긍정적일 수 밖에 없다.

@ Performance layer-by-layer, with fine-tuning

fine tuning을 하면 결과가 어떻게 변하는가?? ILSVRC를 통해서 미리 학습한 후 PASCAL VOC을 통해서 fine tuning한 모델에 다시 PASCAL 데이터 셋을 이용해서 학습하면 어떻게 되는가??
성능은 4-7 열에서 볼 수 있다. 기존에 40 중반 대였던 mAP 성적이 50초반대로 크게 증가했다. (논문에서 striking한 결과라고 한다. 물론 그렇게 크게 증가한 것인지 모르겠는 사람들이 있을 수도 있지만, 그렇다면 시험 삼아서 아무거나 해보길 바란다. 1% 올리는 것도 생각보다 고역이다.)
한편 fine tuning 할 때는 모든 fc layer를 사용할 때 mAP가 가장 높다는 사실을 알 수 있다.

which suggests that the pool5 features learned form ImageNet are general and that most of the improvement is gained from learning domain-specific non-linear classifiers on top of them.

fine tuning의 결과가 대단하고 다시 말하고 있다.

@ Comparison to recent feature learning methods

위 테이블 아래에서 3열은 다른 접근법을 사용한 결관데, 이에 비해 R-CNN은 outperform 한다.

** BB는 bounding box를 의미하는데, 이는 추후에 나온다.

3.3 Network architectures

또한 R-CNN은 CNN의 구조에도 영향을 많이 받는다. 만약 합성곱 망이 16개 가량 되는 구조를 이용한 것을 "O-net"이라고 한다면, 그 성능이 또다시 개선된 것을 알 수 있다. (R-CNN:AlexNet을 이용, 5개의 layer => "T-net"이라고 하자)
어? 그럼 당연히 layer많이 늘리면 좋은 거 아닐까? 할 수도 있겠지만 중요한 건 과연 그렇게 계산할 수 있는가? 하는 문제다. 7배는 더 걸렸다고 한다. 7배의 시간을 더 소비해서 저 정도의 성과 차이는 효율적이지 못한 것 같다.

3.4 Detection error analysis


본 모델을 더 개선하기 위해서, 가장 흔한 에러가 무엇인지 살펴보았다.

위의 Figure 5를 보면 Loc, Sim, Oth, BG의 레이블이 붙여져 있다. 각각이 에러의 종류다.
Loc 로컬리제이션의 문제
Sim은 유사한 카테고리 혼동
Oth 는 유사하지도 않은 카테고리 사이에서의 혼동
BG는 배경 사진을 분류한 경우 에 해당한다.

1, 2번째 행에서 알 수 있듯이 가장 큰 문제는 로컬리제이션이다. 객체의 영역을 잡는데 생기는 에러다. 한편 3번째 행을 보면 LoC의 비율이 줄었는데 보면 BB를 사용했다고 한다. 이제 슬슬 BB에 대해서 알게 될 때가 온다!

Figure 6도 있지만 이는 fine tuning에 대한 또다른 좋은 점이므로 직접 보길 바란다. 생략해도 무방할 것 같다.

3.4 Detection error analysis

Loc의 문제가 가장 컸던 R-CNN은 이 문제를 해결하기 위해서 boudning box regression 을 고안해냈다.

** 6/ 21 첨가 ** 이때 bounding box의 경우 linear SVM과 마찬가지로 class specific이다. ** 첨가 **

 **Appendix C Bounding-box regression

stage to imporve localization performance 
    => predict a new bounding box for the detection using a class-specific bounding-box regressor after SVM

selective search를 통해 계산된 후보 영역들을 보다 ground truth box에 가깝게 수정해주는 것 

 이 학습의 input은 N개의 $\mathrm{{P}^{i}}, \mathrm{{G}^{i}}$ 페어다. 
 이때 i는 class 라고 생각한다. (왜냐하면 N 개라고 하고:앞에서 class를 N+1로 나눈다고 함으로, 그리고 class specific이니까) 
 이때 ${P}^{i} = (({P}^{i}_{x}, {P}^{i}_{y}, {P}^{i}_{w}, {P}^{i}_{h})$ 으로 각각 후보 영역proposal boudning-box의 중점의 x, y 좌표 그리고 폭과 넓이를 의미한다. (이후로 i 첨자는 생략한다. )
 한편 G 역시도 같은 방식으로 정의한다. $G = ( {G}_{x}, {G}_{y}, {G}_{w}, {G}_{h} )$ 정답 영역ground-truth bounding-box 의 중점 x, y 좌표 그리고 폭과 넓이다. 

 이때 우리의 목표는 to learn a transformation that maps a proposed box P to ground truth box G
 변형은 총 네 개의 함수를 통해서 표현한다 : ${d}_{x}(P), {d}_{y}(P), {d}_{w}(P), {d}_{h}(P)$
 처음 두 함수는 scale-invariant 크기에 영향을 받지 않지만, 나머지 둘은 specify log-space 한다. 처음 두 함수는 영역 중점의 좌표이기에 크기와 상관없지만, 나머지 둘은 크기에 영향을 받으므로 다른 계산을 한다는 것이다. 
 따라서 아래와 같은 계산을 통해서 예측된 $\hat{G}$을 얻는다. 

즉 P를 이용해서 정답에 가까운 예측치 $\hat{G}$를 위의 식을 통해 도출하는 것이다. 

그렇다면 저 함수 d 들은 어떻게 구할 것인가? 

 이렇게 생긴 식을 통해서 계산한다. 이때 앞에있는 w는 가중치 벡터고, 뒤에있는 세타함수는 pool5를 거친 특성 맵의 벡터다. 따라서 두개의 곱을 통해서 계산된다. 이때 가중치는 학습되는데, 우리가 전에 회귀를 학습할 때와 동일하다. 
 전체 코스트에 대해서 가중치를 미분하고, 이를 러닝네이트만큼 곱한 후, 원래 가중치에서 뺀  값으로 업데이트 해준다. 자세한 설명은 앞선 포스트에서 보도록 하자. 한 문장에 다 설명하면 이해가 안되는게 당연하다. 

  첫번째 항이 바로 그 내용이다. 그렇다면 두번쨰 항은 무엇인가? 두번째 항은 가중치가 남발하는 것을 막기 위한 라그랑지 함수다. 가중치의 갯수가 많아지는 것을 막는다. 가중치가 많아진다는 것은 그만큼 모델이 복잡해지는 것을 의미하며, 이는 나아가 과적합의 문제로 이어지기 때문이다. 하나의 텀으로 정의하면 regularized least squares objective(ridge regression)

그런데 실은 잘 보면 어떤 새로운 변수가 또 있는 걸 알 수 있다. 대관절 뭐이렇게 변수가 많은건지ㅠㅠ

이렇게 생긴 녀석이다. t들은 P가 G가 되기 위해서 얼마나 움직여야하는지 나타내며, 동시에 우리가 찾고자 하는 정답인 d다. 따라서 학습 과정에서는 t값과 예측된 값인 d 값의 차이를 계산해서 전체 코스트를 계산한다. 

 이때 중요한 것인 regularization 이다. 즉 $\lambda$가 중요한데, 본 모델에서는 1000으로 설정했다. 
 또한, 어떤 트레이닝 페어를 사용할지 역시 중요하다. 만약에 P가 정답이랑 먼 녀석인데 그 녀석을 ground truth bounding box에 맞게 조정한답시고 bounding box regressor를 학습한다면 전혀 도움이 되지 않을 것이다. 따라서 이때도 IoU를 기준으로 regressor를 학습할지 말지 정했다고 한다. (이때의 기준치는 IoU가 0.6) 

bounding box regressor는 한 번 시행했다고 한다. 
인풋 => 예측 으로 끝났다는 것이다. 
인풋 => 예측 => 예측 값을 다시 인풋 => 예측  이런식으로 iterate 하지 않았다는 것이다. 
그렇게 시행하는 것도 가능하지만 그렇게 하지 않은 이유는 어떤 성능의 개선이 없었기 때문이다. 

기뻐하라 이제는 얼마 안 남았따!!! 제일 기뻐하는 건 아이러니하게도 이 글을 쓰는 나 자신..

 

3.6 Qualitative results


바운딩 박스와 분류가 어떻게 됐는지 그 결과가 정확하게 궁금하다면 논문에서 Figure 8,9 그리고 10,11을 보길 바란다.

4. The ILSVRC2013 detection dataset

이 모델을 다른 데이터 셋에도 이용해보았다. 다만 ILSVRC2013 데이터 셋의 특징으로 인해서 어떻게 데이터 셋을 이용할지 에 대한 내용을 다룬다.

4.1 Dataset overview


validation 과 test 셋의 경우 정확하게 바운딩 박스와 200개의 클래스가 명시되어 있지만, train 셋의 경우 이미지의 클래스만 명시되어 있다. 즉 바운딩 박스의 좌표가 없는 것이다!! 또한 train 셋의 이미지는 하나의 객체만 존재하며 이가 이미지의 중심에 있는게 대다수라고 한다. 한편 배경뿐인 이미지(negative image sets)는 수작업으로 제거했다고 한다.
train, val, test 셋이 이렇게 상이하기 때문에 다음과 같은 질문과 우리는 마주한다.
(1) where should negative examples come from?
이해를 못했다. 직접 지웠다면서 negative 샘플이 없다고 그러다니.. 내가 이 질문은 이해를 못했다.
(2) Should the train images be used at all, and if so, to what extent?
train 셋에 바운딩 박스가 없는데 그럼 이걸 사용해야 하는지, 그렇다면 어디에 사용해야 하는지

그래서 사용한 전략은 val 셋만 train 할때 사용하기로 한 것이다. traing과 validation 두 과정 모두에 validation 데이터 셋을 사용하기 위해서, validation 데이터 셋을 두가지로 나눴다. 동일한 사이즈의 val1과 val2로. 어떤 클래스들은 validaition 데이터 셋이 없는 경우가 있으므로 이 불균형에 주의해서 나눴다고 한다.
각각의 클래스에 동일한 이미지가 있도록 최대한 나누었으며, 그중에서도 가장 imbalance가 작은 콤비네이션을 이용했다.

4.2 Region proposals


앞에서 이용했던 것처럼 후보 영역을 뽑기 위해서는 selective search를 이용했다.
PASCAL에 비해서 이 데이터 셋에서는 정확도가 떨어졌는데 이는 아마 region proposal 단계에서 추가적인 스텝이 필요한 것으로 보인다.

selective search는 이미지 크기에 영향을 받지 않기 때문에 이미지 해상도에 영향을 받았을 확률이 크다. 왜냐하면 이 데이터 셋의 이미지 자체의 픽셀 수가 달랐기 때문이다. 그래서 동일한 사이즈로 만들기 위해서 폭을 500픽셀로 고정해야 했다. (CNN에 넣기 위해서 동일한 이미지로 wrap했던 것과는 다르다.)

4.3 Training data ~ 4.5 Ablation study


트레이닝 셋과 벨리데이션 셋 그리고 결과에 대해서 말하고 있다.
비교적으로 PASCAL 데이터 셋을 이용했을 때와는 결과가 다르다.
그다지 중요하진 않지만, 혹시 궁금한 사람들을 위해서 공부했던 흔적을 남긴다.
하나하나 보고 싶은 사람도 있기 마련이니까.

4.6 Relathionship to OverFeat

이 내용도 마찬가지.
OverFeat와 비교한 내용이지만, 실상 본 모델보다는 모델의 성과에 대한 내용이므로 공부한 흔적을 남겨둔다.

 

5. Semantic segmentation


이걸 한국어로는 뭐라고 하는지 모르겠지만.. 여하튼 컴퓨터 비전의 한 분야다.
객체 탐지는 바운딩 박스를 통해서 객체를 로컬리제이션하고 이미지 분류를 시행했다면,
semantic segmentation 는 바운딩 박스가 아니라 엣지를 통해서 객체를 로컬리제이션한다.
예를 들면 아이폰 인물 사진을 찍으면 주위가 흐릿해지는 것과 관계있다. 딱 사람의 인영 테두리 만큼 객체를 인식하는 것이다.
semantic segmentation의 다른 특징은 객체끼리는 구분을 안 한다는 것이다.

예를 들어 사진에 사람 여러명과 개 여러 마리가 나온다면
사람, 사람, 사람 ... 개, 개, 개... 이런식으로 엣지를 찾는다.

관련해서 만약 instance segmentation 이라면 위와 동일한 상황에서
사람1, 사람2, 사람3 ... 개1, 개2, 개3 ... 이런식으로 엣지를 찾는다.
그러니까 더 복잡하겠지?

이 분야는 잘 모른다.

하여튼 R-CNN은 이미지 분류와 객체 탐지의 간극을 잘 연결해서 객체 탐지에서 CNN을 사용한 것이니, 다른 컴퓨터 비전 분야에서도 적용하고 싶었던 모양이다. 그래서 semantic segmentation 분야에도 적용을 해본다.

이에 관해서는 직접 글을 읽어보길 바란다.

6. Conclusion


드디어 끝이 왔다. 결론이다.

여타 알고리즘에 비해서 30%나 그 성능을 끌여올렸다는 점에서 R-CNN은 컴퓨터 비전 분야에서 가히 놀라운 성장을 이끌었다. 이러한 결과는 (1) high capacity cnn works to bottom up region proposal (2) 라벨된 데이터 셋이 적을 때 CNN을 어떻게 학습시킬지 , 이 두 개의 문제를 해결함으로써 얻었다.

 

7. 사족


구현은 얼마나 어려울까. 시작도 안했는데 환멸난다. 코랩으로 gpu써도 오래 걸릴 거 생각하면 어지럽다.
직접 돌릴 수 있기는 할까?

누가 보면 이 논문 리뷰 누가 시켜서 하는 것 같지만 이렇게 툴툴대도 잘 합니다...
다만 어려워서 오래 걸릴뿐.. 구현은 언제 찾아올지 모르겠다........................................ ㅠㅠ

나도 선생님이 필요해

많은 분들께 도움이 됐길 바라며 길었던 한달간의 리뷰 포스팅은 끝을 내립니다!!
(정확하게 한 달은 아니지만 프린트한지 한달됐네유)

8. 참고 자료


논문
Time travler 님의 RCNN 리뷰: 줄곧 잘 보고 있는 블로그 쉽게 흐름을 설명하면서 디테일도 놓치지 않는다
herbwood 님의 RCNN 리뷰: 이 분의 그림이 정말 저를 살렸읍니다
차밍 님의 RCNN 리뷰: 논문 흐름대로 리뷰해주셔서 많은 도움이 되었다!


나 만세~~!

  1. 이미지 평균이 구체적으로 뭘 말하는지 모르겠다. 혹시 아는 사람은 아래 댓글로 알려주시길 간곡히 바랍니다. [본문으로]

'딥러닝 > CV 논문' 카테고리의 다른 글

[Classification] ViT: Vision Transformer  (0) 2021.07.29
[NLP] Tansformer  (0) 2021.07.28
[Classification] GoogleNet  (0) 2021.07.19
[Object Detection] Fast R-CNN  (0) 2021.07.07
[Classification] Alexnet  (1) 2021.05.06

댓글