이번에 읽고 리뷰해볼 논문은 Object Detection 분야에서 큰 성능 개선을 달성한, R-CNN(2013) 논문입니다.
정리된 내용 중 부정확하거나 설명과 다른 부분에 대해선 언제든 피드백 부탁드립니다.
Abstract
R-CNN이 제안되기 이전, Detection 분야에선 PASCAL VOC 데이터를 활용한 여러 연구가 진행되고 있었습니다.
하지만 놀라울만큼 Detection 성능을 개선한 연구는 몇 년간 없었고, Detection 과제에선 정체가 있었습니다.
그 당시 가장 좋은 성능을 도출한 모델 조차, 알고리즘 기반의 Image Feature와 ensemble이 전부였습니다.
이러한 긴 정체기는 R-CNN 논문이 등장하며, 도출해낸 엄청난 성능 개선과 함께 마무리 되었습니다.
기존 30%에 머물던 mAP 성능을 50% 초반으로 30% 가량 개선했으니, 정말 엄청난 결과라 할 수 있습니다.
R-CNN을 제안한 저자는 Convolutional Neural Network 기반의 Architecture, Pre-trained Weights 그리고
Region proposal과 CNN의 결합을 큰 성능 개선을 이끌어 낼 수 있었던 이유라고 설명했습니다.
다음 파트에선 R-CNN의 저자가 제안한 내용들이 무엇이었는지, 다뤄보도록 하겠습니다.
Introduction
과거 Visual Recognition 분야의 발전은 SIFT, HoG 기반의 Image Feature 알고리즘을 기반으로 했습니다.
(본 포스트에선 이를 다루지 않으며, 추후 깊게 리뷰해보고자 준비 중에 있습니다.)
물론 Abstract에서 언급했던 것처럼, 이러한 Image Feature를 기반으로 한 방법은 큰 개선이 없었습니다.
몇 년간 정체가 지속되며, 성능 개선이 미미하자 점차 관심이 시들시들 해졌습니다.
이 시기에 AlexNet 발표가 있었고, 이후 CNN과 Visual Recognition에 대해 많은 관심이 쏠렸습니다.
ImageNet 대회에서 CNN이 큰 성공을 거둔 후, 사람들은 이러한 결과가 Detection에도 유효할 지 그리고
일반화 성능에 있어서 좋은 결과를 도출할 수 있을지 궁금해 했습니다.
R-CNN의 저자들은 Detection 과제에서 CNN의 유효성에 대한 답변으로 이 연구를 제시한다고 설명했습니다.

Object Detection은 Classification 과제와 다르게 1) Localization 과정이 필요합니다.
또한 Classification 과제에 비해, 데이터 구축 난이도가 높기에 2) 작은 데이터 셋에서도 잘 학습되어야 합니다.
R-CNN에선 Localization Problem을 해결하기 위해, Bounding Box Regression을 제시합니다.
> Object Detection은 당연히 Bounding Box Regression을 수행하는거 아닌가요?
R-CNN에서 언급하는 Bounding Box Regression은 CNN을 사용하지 않는 Regression을 의미합니다.
과거 Box Regression을 위해 MLP 기반의 연구가 존재했으며, R-CNN에선 MLP 대신 CNN을 활용합니다.
CNN을 활용하는 경우, 쉽게 Localization Problem을 해결할 것 같지만, 이 또한 쉽지 않습니다.
커다란 Receptive field 내에서, 특정 물체의 위치를 정확하게 추정해야 하기 때문입니다.
그렇기에 R-CNN에선 단순 CNN 뿐만 아니라, Region Proposal 방식을 함께 사용하는 것을 제안합니다.
Region Proposal이란 이미지 내에서, 객체가 있을 법한 후보 영역을 추출하여 제안하는 것을 의미합니다.
R-CNN의 자세한 동작 방식은 추후 다시 다뤄보도록 하겠으며, 아래는 R-CNN의 전체 흐름입니다.

Localization Problem 다음 문제인 작은 규모의 데이터에서도 잘 학습되어야 하는 문제는 어떻게 해결했을까요?
R-CNN에선 이러한 문제에 대한 해답으로 Large Dataset 기반의 Transfer Learning 방법을 제안했습니다.
ImageNet과 같은 큰 데이터로 먼저 학습한 후, PASCAL VOC같은 작은 데이터로 추가 학습을 진행하는 것입니다.
단순 PASCAL VOC만을 활용해 학습한 결과보다 약 8%의 성능 개선을 확인할 수 있었다고 설명했습니다.
이후 Object Detection의 검출 성능 개선을 위한 NMS 알고리즘 또한 제시했습니다.
> NMS에 대해선 상세하게 정리한 포스트가 존재하기에, 본 포스트에선 설명하지 않도록 하겠습니다.
또한 저자는 Detection 모델의 성능 개선을 위해선 Negative 케이스에 대한 분석도 매우 중요하다 언급합니다.
이후 파트에선 이러한 Error Analysis에 대한 설명도 함께 다루도록 하겠습니다.
Introduction 치고 많은 내용을 다루었습니다. 다음 파트에선 R-CNN에 대해 조금 더 깊게 다뤄보겠습니다.
Object Detection with R-CNN
R-CNN의 전체 Object Detection System은 크게 3가지의 모듈로 구성되며, 아래와 같습니다.
1. Region Proposal module
2. Large CNN 기반의 Feature Extraction
3. Class 별 Classification을 위한 SVM
+ Run-time Analysis
이번 파트에선 R-CNN에서 각각의 모듈이 어떠한 역할을 수행하는지 등에 대해 다뤄보고자 합니다.
1. Region Proposal module
여러 Object Detection 논문들에선 Region Proposal을 위한 여러 방법론 혹은 알고리즘들을 소개합니다.
> Selective Search 등이 이에 해당합니다.
Region Proposal이란 객체가 있을법한 영역을 이용자에게 "제안"하는 방법 혹은 알고리즘을 의미합니다.
아래 대표적인 Region Proposal Algorithm인 Selective Search에 대해 간단하게 설명합니다.

Selective Search Algorithm은 다양한 Region Proposal 방법 중 대표적이고 잘 알려진 방법입니다.
기존 Region Proposal 방법들은 고정된 크기의 window를 사용하는 등의 알고리즘으로 동작했습니다.
하지만 이미지 내의 객체는 다양한 크기와 형태를 갖기에, 기존 방법으로 이를 모두 탐지하기엔 어려웠습니다.
이러한 기존 알고리즘의 부족한 부분을 보완한 방법으로 제안된 것이 Selective Search 방법입니다.
Selective Search 알고리즘은 랜덤하게 만들어진 Segments를 기반으로 유사한 영역끼리 통합합니다.
> 유사한 두 영역이 닿았을 때, 큰 영역이 작은 영역을 병합시키는 원리
그렇기에 객체의 크기나 형태와 상관없이, 객체가 있을 법한 위치를 효과적으로 추정할 수 있게됩니다.
R-CNN에선 이러한 Selective Search를 기반으로 Region Proposal을 수행합니다.> Region Proposal을 사용하는 동일한 조건에서 기존 연구들과의 탐지 성능 비교를 의미합니다.
2. Large CNN 기반의 Feature Extraction
앞선 Selective Search 기반의 Region Proposal 과정을 통해, 한 장의 이미지에서 2,000개의 Region을 제안합니다.
이후 제안된 Proposal 마다, 4096 차원의 Feature Vector(1, 4096) 를 도출합니다.
이 때의 Feature Vector를 도출하기 위한 Extractor로 AlexNet을 사용하게 됩니다. ( 최종 FC Layer Vector )
AlexNet에 입력되기 전, 각각의 이미지(Region)는 Resize + Normalization(sub mean)를 수행하여 준비합니다.
여기서 Selective Search를 통해 제안된 영역에서 Feature를 추출하기 이전에 한 가지 처리를 추가합니다.

앞서 알고리즘을 통해 제안된 영역은 객체에 대해 지나치게 타이트한 상태(왼쪽)로 제안되어 있습니다.
그렇기에 저자들은 Padding 파라미터를 따로 주어, 약간의 배경(Context)을 포함하도록 하였습니다.
추가적으로 Resize를 수행하는 방법에선 정사각형을 맞추는 것보다, 종횡비를 무시하고 Resize(맨 오른쪽)를
수행하는 것이 가장 좋은 성적을 도출했다고 설명합니다.
이는 이미지 내에서 배경을 포함한 다양한 특징을 학습하도록 하여, 일반화 성능을 개선한 것이라 할 수 있습니다.
3. Class 별 Classification을 위한 SVM(Support Vector Machine)
Large CNN에서 도출된 Feature Vector를 기반으로, 모든 Proposal에 대해 Class score를 계산합니다.
이 때, Class 별로 학습된 이진 SVM을 활용하여 score를 도출하게 됩니다.
이후 가장 높은 score를 갖는 Proposal을 기준으로 해당 Proposal과 일정 수준 이상 겹친 Proposal을 제거합니다.
이러한 알고리즘을 NMS(Non-Maximum Suppression) 이라고 합니다.
> NMS에 대해선 이전에 다루었기 때문에 넘어가도록 하겠습니다.
논문에서 언급된 learned threshold에 대해선 아래의 IoU threshold 파트를 봐주시면 됩니다.
요약하자면, SVM을 통해 Classification과 NMS post processing을 수행한 것이라고 할 수 있습니다.
4. Run-time Analysis
R-CNN 이외 다른 Detection 방법인 UVA와의 Run-time을 비교/분석하는 파트입니다.
R-CNN에선 기존 방법 대신 CNN과 SVM을 기반 방식이 얼마나 효율적일 수 있는지에 대해 설명했습니다.
이는 CNN의 Weights Sharing, 그리고 효과적이면서 효율적인 Feature Extractor로 인해 가능하다고 합니다.
R-CNN에서 제안된 CNN 기반의 Feature Extractor는 4096 차원의 Vector를 도출합니다.
기존 360K 크기의 Vector 대신 4K의 Vector만을 사용하는 것만 보아도, 큰 속도 개선을 짐작할 수 있습니다.
그렇기에 R-CNN에선 하나의 이미지에서 Feature Vector를 도출하기 위해 CPU 기준 53초, GPU 기준
13초밖에 소요되지 않는다고 합니다.
> 현재 기준으론 매우 느리지만, R-CNN 이전의 시스템이 얼마나 비효율적이었는지 알 수 있습니다.
또한 도출된 Feature Vector는 2000 x 4096의 형태로, SVM과 행렬곱(병렬)으로 쉽게 계산될 수 있습니다.
> SVM은 4096 x N 형태로, N은 데이터의 클래스 개수를 의미합니다.
이로 인해 UVA 시스템이 134G의 메모리를 사용할 때, R-CNN은 1.5G 밖에 사용하지 않는다고 합니다.
+ 또한 이미지 당 속도가 5분 정도 걸리는 DPM에 비해, R-CNN은 1분 가량밖에 걸리지 않는다고 합니다.
이를 통해 탐지 성능과 속도 측면에서 R-CNN이 얼마나 큰 개선을 이루어 냈는지 알 수 있었습니다.
Training and Results for PASCAL VOC
R-CNN은 위에서 제안한 여러 방법을 기반으로 PASCAL VOC 데이터에 대해 학습과 평가를 수행합니다.
앞서 언급했지만, R-CNN의 학습 과정에서 중요한 것은 적은 수의 데이터에서 효과적일 수 있느냐 입니다.
기존 ImageNet과 같은 Large 데이터에 비해, PASCAL VOC는 굉장히 적은 수의 데이터라 할 수 있습니다.
R-CNN에선 이를 Transfer Learning을 통해 극복했는데, 어떠한 방법을 사용했을까요?
ImageNet을 통해 학습된 AlexNet을 기반으로 최하단 레이어를 제거한 뒤, 새로운 레이어를 붙여줍니다.
새로운 출력 레이어는 데이터의 전체 객체 수 + 1 (background)만큼의 출력을 갖도록 설정합니다.
이후 입력되는 Proposals에 대해 Ground Truth와의 IoU 0.3을 기준으로 Positive/Negative를 설정합니다.
위의 레이블링 과정을 수행한 뒤, Transfer Learning과 Fine Tuning을 수행합니다.
> 일반적으론 0.5의 threshold를 사용하지만 0.5를 사용할 시, mAP가 하락했다고 설명합니다.
학습 과정에선 SGD Optimizer를 기반으로 하며, 0.001의 Learning rate를 사용합니다.
> 또한 Fine-Tuning에서, 앞선 학습에서 보다 작은 Learning rate를 사용하는 것이 중요하다 했습니다.
또한 Mini-Batch로 데이터를 로드하는데 이 때, 한가지 테크닉을 추가하여 데이터를 로드합니다.
무작위로 데이터를 가져오는 대신, 앞서 정의한 Positive와 Negative를 고정된 비율로 로드합니다.
> Positive(Foreground) 32건, Negative(Background) 96건 총 128개의 데이터를 로드합니다.
위의 테크닉은 Proposal 자체가 불균형하게 생성될 수 밖에 없어, 활용되는 방법이라 생각됩니다.
> 불균형 분류 과제에서 주로 사용되는 클래스 가중치, 비율 기반 샘플링과 유사한 것 같습니다.
위의 방법으로 AlexNet을 Fine-Tuning 시켜준 뒤, Proposals에 대한 Feature Vector를 도출해줍니다.
도출된 Vector를 활용하여, 클래스 별 SVM을 학습합니다.
> 클래스 별 SVM이란 특정 클래스 A에 대한 이진 분류를 의미하며, A or Not의 결과를 도출합니다.
결국 학습을 마치고 나면, N개의 클래스 수 만큼의 SVM이 도출된다고 생각할 수 있습니다.
SVM의 학습 과정에서 또한 성공적인 학습을 위해 Hard Negative Mining 테크닉이 사용됩니다.
이는 Negative 데이터를 Positive라고 자주 헷갈리는 데이터들을 다시 모으는 방법을 의미합니다.
> 결국 까다로운 특징으로 인해, 학습하기 어려운 데이터들을 의미합니다.
모델 입장에서 지속적으로 헷갈려하는 데이터를 수집하여, 이를 학습 데이터로 재학습을 수행합니다.
이를 통해 False Positive의 발생이 줄어, 전반적인 탐지 성능이 개선되는 효과가 있다고 합니다.

위의 테크닉을 통해 학습된 R-CNN과 다른 Detection 방법들을 비교한 결과는 위의 표에서 확인할 수 있습니다.
기존 방법들에 비해, R-CNN이 mAP 기준 약 30% 가량 더욱 높은 성적을 도출하는 것을 확인할 수 있습니다.
특히 UVA의 경우엔 R-CNN과 유사하게 Selective Search 방법을 적용하였는데도, 큰 성능 차이가 확인됩니다.
결과적으로 R-CNN의 저자는 CNN 기반의 방법이 Object Detection 과제에서도 효과적임을 입증할 수 있었습니다.
Visualization, ablation, architecture and modes of error
1. Visualization
우리는 앞서 학습된 CNN 내부 레이어들이 무엇을 학습했고, 어떠한 정보를 갖는지 알기 어렵습니다.
R-CNN의 저자는 이러한 의문을 해결하기 위해 레이어의 파라미터와 예측 관점에서의 시각화를 제시했습니다.
시각화와 분석 방법으론 AlexNet의 Max Pooling 레이어에서 도출된 결과물을 활용하게 됩니다.
먼저 입력 이미지에 대해 Max Pooling 연산 후 도출된 특징 맵에서 NMS 후처리를 거친 결과물을 확인합니다.
NMS 처리를 위해 많은 수의 Proposals들을 Activation 크기순으로 정렬하여, 처리 후를 진행합니다.

NMS 처리를 거친 특징 맵에서 높은 score를 갖는 Proposals에 대해 시각화를 수행한 결과는 위와 같습니다.
입력 이미지의 객체를 식별하기 위한 핵심 정보를 Proposals 영역들이 나타내고 있음을 알 수 있습니다.
시각화된 결과를 요약했을 때, 네트워크는 객체의 모양, 색상, 질감 등의 작은 정보들을 결합해가며, 구체적이고
고도화된 정보들을 도출해내는 방향으로 학습된다고 이해할 수 있습니다.
2. Ablation studies
앞서 진행한 Visualization을 통한 네트워크의 이해에 이어서, "Ablation study" 라는 것을 진행합니다.
이는 의학 또는 심리학에서 사용되는 용어로, 유기체의 어떤 부분을 제거한 뒤, 행동을 관찰하는 것을 의미합니다.
이를 본 연구에 적용하여, 특정 Layer 혹은 Block을 제거했을 때의 네트워크의 성능 변화를 관찰합니다.
R-CNN에선 어떠한 Layer가 Object Detection 과제에서 핵심적인지 이해하고자 연구를 진행했습니다.
R-CNN의 AlexNet에서의 마지막 3개의 Layer에 대한 Study를 진행합니다.
R-CNN에서의 마지막 3개의 Layer는 모두, 우리에게 잘 알려진 Fully Connected Layer를 의미합니다.
각 Layer는 9216 x 4096, 4096 x 4096, 4096 x num class의 가중치로 이루어져 있습니다.

R-CNN에서 마지막 3개의 FC Layer에 대해 진행한 Study 방법은 간단합니다.
FC Layer를 거치지 않거나, 첫번째 혹은 두번째까지 거친 뒤의 출력들을 통해, SVM을 학습시켜 성능을 비교합니다.
Fine tuning을 진행하지 않은 Network로 테스트를 진행했을 때, FC Layer는 별다른 효과가 없는 것을 알 수 있습니다.
이러한 결과와 반대로 Fine tuning을 진행한 후의 FC Layer는 큰 성능 개선이 있는 것을 확인할 수 있습니다.
> 전체적인 성능에서 매우 큰 비중을 차지하는 것은 아니지만, 이전 결과에 비해 큰 개선이 있음
이러한 간단한 실험을 통해 우리는 2가지 중요한 사실을 알 수 있습니다.
1. Fully Connected Layer는 Fine tuning 여부에 따라 성능이 크게 차이난다.
2. Convolutional Neural Network는 Convolution Layer의 성능에 크게 의존한다.
> Convolution Layer의 파라미터 수가, 전체 파라미터의 6% 뿐인데도 전체 성능을 대표한다.
간단한 실험이었지만, CNN에서 도출되는 성능이 어떠한 방식으로 학습되는지 약간 이해해볼 수 있었습니다.
3. Network architecture
다음으론 R-CNN에서 사용된 AlexNet과 Classification 과제에서 훌륭한 성능을 도출한 VGG를 비교합니다.
동일한 R-CNN architecture를 기준으로, backbone에 해당하는 부분만 변경하여, 비교를 진행합니다.

AlexNet과 VGG를 각각 backbone으로 비교한 결과, VGG backbone이 더욱 좋은 성능을 도출한 것을 알 수 있습니다.
이는 동일한 Object Detection architecture라고 하여도, backbone에 크게 영향 받음을 나타내고 있습니다.
Backbone 또한 classification 과제에서 좋은 성적을 도출한 모델을 활용하는 것이 좋음을 짐작할 수 있습니다.
물론 VGG를 사용한 경우 AlexNet 대비, 약 7배 가량의 inference time이 소요되는 문제가 존재합니다.
Trade-off 관계로써, 어떠한 부분에 초점을 맞출지는 문제를 해결하고자 하는 방향에 따라 달라질 것으로 보여집니다.
4. Error analysis
이번 파트의 마지막으로, R-CNN에서 도출된 추론 결과에 대한 분석을 진행합니다.

위 이미지는 R-CNN에서 도출된 False case들에 대해, 4가지 타입으로 구분하여 시각화한 결과입니다.
4가지 False case들은 아래와 같은 정의를 갖고 있습니다.
1. Loc : Positive 클래스에 대한 IoU가 0.1 ~ 0.5 사이인 경우 ( False Positive )
2. Sim : 비슷한 유형의 다른 클래스로 혼동한 경우 ( False Negative )
3. Oth : 전혀 다른 유형의 클래스로 혼동한 경우 ( False Negative )
4. Bg : 배경 이미지를 Positive 클래스로 탐지한 경우 ( False Negative )
R-CNN의 False case에 대한 분석을 진행했을 때, 다른 유형보다 Loc 유형의 오류가 많은 것을 알 수 있습니다.
저자는 어떠한 이유로 인해, R-CNN에서 Loc 유형이 두드러지게 나타난건지에 대한 분석을 진행했습니다.
이는 CNN이 갖는 Translation Invariance 특성으로 인해, 발생될 수 있다는 것이 저자의 주장입니다.

Translation Invariance란 이미지 내에서 객체의 위치가 다르게 나타나더라도, 결과가 같은 것을 의미합니다.
설명만 듣기엔 좋은 특성인 것 같은데, R-CNN에선 왜 이러한 특성이 문제라고 언급했을까요?
Object Detect 과제의 특성 상, 객체의 위치를 정확하게 추정하는 것이 매우 중요합니다.
그런데 Translation Invariance 특성을 갖는 CNN은? 객체의 위치와 관계 없이 결과를 도출하게됩니다.
객체가 어디에 존재하든, 또한 일부 가리거나 잘려있어도 약간의 패턴을 인식할수만 있다면 탐지합니다.
이러한 방식으로 탐지된 객체는? 객체의 클래스는 맞추더라도 IoU 자체가 낮을 수 밖에 없습니다.
앞서 Region Proposal 방식으로 영역을 제안한다고 했기에, 사람이 온전하게 등장하지 않는 이미지여도,
얼굴 혹은 몸의 일부분이 있는 상태에선 어느 정도 예측이 가능하게 되어버립니다.
Classification에서 강점으로 작용하던 부분이 Object Detection에선 오히려 문제가 되어버렸습니다.
R-CNN에선 Translation Invariance 문제를 보완하기 위해 Bounding Box Regression을 수행합니다.
어떠한 방법을 활용하여, Box Regression을 수행해주었을까요?
Bounding Box Regression
Box Regression의 개념은 R-CNN에서 소개된 DPM 논문에서 소개된 방법을 의미합니다.
Selective Search를 기반으로 제안된 불안정한 초기 Box를 잘 보정하는 Translation을 찾는 것을 의미합니다.

Box 좌표의 보정을 위한 Translation 파라미터 탐색은 MSE를 기반으로 하는 선형 회귀를 활용해주었습니다.
선형 회귀의 입력은 AlexNet의 Pooling에서 도출된 특징맵이며, 출력은 GT에 맞춰진 Translation 값이 됩니다.
R-CNN에선 이러한 Box Regression 과정을 통해, 약 3~4%의 mAP를 끌어올릴 수 있게되었습니다.
머신러닝 혹은 딥러닝을 조금 접했다면, 어렵지 않게 개념을 이해할 수 있을 것이라 생각됩니다.
이 외 데이터나 Segmentation에 대한 내용들은 본 포스트에선 다루지 않습니다.
Conclusion
R-CNN의 등장과 함께 몇 년간 정체되어있던 Detection 과제에서의 Performance가 크게 개선되었습니다.
단순 Detection Performance 개선을 위한 방법뿐 아니라, 적은 수의 데이터에서의 보완법 등도 함께 다루었습니다.
물론 End-to-End 동작의 어려움, Inference time 등 여러 보완도 필요하지만 간단하고도 확장 및 변경이
유리한 형태로 구성되어있기 때문에, 앞으로의 개선 가능성 또한 많다고 할 수 있습니다.
이상 R-CNN에 대한 리뷰를 마칩니다.
이번 포스트에선 Object Detection 과제의 조상격인 R-CNN에 대해 다뤄보았습니다.
다양한 개념이 복합적으로 등장하기에, R-CNN을 이해하기 위한 지식이 여럿 필요하여, 조금 어려울 수 있습니다.
틀린 내용, 부적절한 설명 혹은 궁금한 부분들에 대해선 언제든 피드백 혹은 질문 부탁드립니다.
긴 글 읽어주셔서 감사합니다.