이번 포스트는, Object Detection의 초기 Model인 R-CNN에 대해 간단히 정리해보고자 합니다.
우선, R-CNN에 대한 논문은 다음과 같습니다.
R-CNN은 Object Detection 분야에 Deep Learning을 최초로 적용시킨 Model이자 이전의 Object Detection Model들과 비교해 성능을 상당히 향상시키고 이후 여러 수정, 변형 Model들을 파생시킨 Model입니다.
Object Detection이란, 한 물체(Single Object)가 아닌 여러 물체(Multiple Objects)에 대해 어떤 물체인지 Class를 분류하는 Claasification 문제와 그 물체가 어디 있는지 Bounding Box를 통해 위치 정보를 나타내는 Localization 문제를 모두 포함합니다.
Deep Learning을 이용한 Object Detection은 2014년을 기준으로 나타나기 시작했으며 크게 1-stage Detector와 2-stage Detector로 구분할 수 있습니다. 아래 이미지를 참고하면, 가운데 수평 화살표를 기준으로 위쪽은 2-stage Detector Model이고 아래는 1-stage Detector Model입니다.
1-stage Detector는 Classification과 Localization Task를 동시에 행하는 방식이고 2-stage Detector는 Classification과 Localization 문제를 순차적으로 처리하는 방식입니다. 따라서 1-stage Detector가 비교적 빠르지만 정확도가 낮고 2-stage Detector가 비교적 느리지만 정확도가 높습니다.
2-stage Detector에는 R-CNN부터 Fast R-CNN, Faster R-CNN과 같은 R-CNN 계열이 대표적이며, 1-stage Detector에는 YOLO계열과 SSD 계열 등이 포함됩니다.
그럼 이제 본격적으로 R-CNN에 대해 다뤄보겠습니다.
Definition
R-CNN은 "Regions with Convolutional Neuron Networks features"의 약자로, 설정한 Region의 CNN의 feature(= Input Value)로 활용하여 Object Detection을 수행하는 신경망이라는 의미를 담고 있습니다.
앞서 R-CNN의 기본적인 구조는 2-stage Detector라고 언급했듯이, 전체 Task를 두 단계로 나눌 수 있습니다. 물체의 위치를 찾는 Region Proposal, 그리고 물체를 분류하는 Region Classigication으로 구성됩니다. 이 두 가지 Task를 처리하기 위해 수행되는 R-CNN의 구조는 총 4가지로 나눌 수 있습니다.
- Region Proposal
이미지에 있는 Data와 Label을 투입한 후 카테고리에 무관하게 물체의 영역을 찾습니다.
- (Pre-trained) CNN
Proposal된 영역으로부터 고정된 크기의 Feature Vector를 Warping/Crop 하여 CNN의 Input으로 사용하며, 이때 CNN은 이미 ImageNet을 활용한 Pre-train 된 네트워크를 사용합니다.
- SVM
CNN을 통해 나온 Feature Map을 활용하여 선형 지도 학습 모델인 SVM(= Support Vector Machine)을 통한 분류를 진행합니다.
- Bounding Box Regression
Regressor를 통한 Bounding Box Regression을 진행합니다.
Region Proposal
우선, 첫 번째로 Data와 Label을 투입해야 합니다. R-CNN에는 일반적으로 이미지를 데이터로 사용하며 레이블은 정답 Bounding Box를 주게 됩니다.
이미지는 Vertex로 표현하고 그 Vertex들의 연결을 Edge라고 생각하면 됩니다. (그래프 이론에서 G=(V, E)로 표현되는 Vertex(Node)와 Edge)
R-CNN은 이 단계에서 Selective Search라는 알고리즘을 이용해서 ‘임의의’ Bounding Box를 설정합니다. Selective Search 알고리즘은 Segmentation 분야에서 많이 사용되는 알고리즘으로, 주변 간의 색감(Color), 질감(Texture) 차이, 다른 물체에 둘러 쌓여 있는지(= Enclosed) 여부 등을 파악해서 인접하고 유사한 Pixel끼리 묶어 물체의 위치를 파악할 수 있도록 하는 알고리즘입니다.
Selective Search 방식은 다음과 같습니다.
우선, Bounding Box들을 Random하게 작게 많이 생성하고 이것들을 계층적 Grouping 알고리즘을 사용해 조금씩 Merge 해 나갑니다. 이를 바탕으로 ROI(= Regions of Interest)라는 영역을 제안하는 Region Proposal 형식으로 진행됩니다.
작은 영역들을 처음에 설정하는 방법은 다음과 같은 수식으로 표현이 가능합니다.
위 이미지에서 원들을 각각의 Vertex라고 하면, 이 Vertex들이 연결되어 있는 덩어리를 Component, 그리고 여기서 의미있는 영역을 Segment라고 보면 됩니다. 따라서 위 식을 기준으로 설명하면 다음과 같습니다.
Component가 C1, C2 두 덩어리가 있다고 한다면 Dif(C1, C2)는 C1과 C2간의 차이를 나타내는 값이고 MInt(C1, C2)는 C1 내부에서의 어떤 값과 C2 내부에서의 값을 계산한 어떤 값입니다. 이 값을 비교해서 Dif(C1, C2)가 더 크다면 두 Component를 그대로 놔두고 MInt(C1, C2)가 더 크다면 두 Component를 Merge 하게 됩니다. 이러한 수식을 통해 나오는 여러 Segment 된 이미지들을 계층적 병합 알고리즘(= Hierarchical Grouping Algorithm)을 사용해서 Merge하게 되고 여기까지 Region Proposal 된 영역, 즉 ROI를 CNN의 입력 값으로 넣어줍니다.
CNN
우선, R-CNN에서는 AlexNet(= ImageNet) 구조를 재사용하여 Model을 구성하였습니다.
CNN은 Input 값의 크기가 고정되어 있기 때문에 이들을 모두 CNN에 넣기 위해 여러 사이즈로 나온 Bounding Box들을 같은 Size(= 227 x 227)로 통일시키는 작업(= Warping)을 거쳐야 합니다.
다음과 같이 원래 각기 다른 Size로 제안된 Bounding Box들을 모두 같은 정사각형으로 자르고 줄여서 만든 이미지 2000개를 227x227 Pixel Size로 각각 모두 CNN에 Input으로 넣어줍니다.
R-CNN 논문에서 CNN은 사전 학습된 AlexNet의 구조를 거의 그대로 가져다 썼으며 Object Detection용으로 마지막 부분만 조금 수정하였다고 합니다. (→ 마지막 층 1000을 200, 20으로 변경)
SVM (Support Vector Machine)
SVM은 CNN을 거치고 나와 R-CNN의 분류를 수행하는 주요 모듈입니다.
CNN Model로 부터 Feature가 추출이 되고 Training Label이 적용되고 나면 Linear SVM을 이용하여 Classification을 진행합니다.
SVM은 기계 학습 분야에서 Pattern 인식이나 자료 분석을 위해서 사용하는 지도 학습 모델이고 주로 분류나 회귀 분석을 위해 사용하는데, 여기서 R-CNN이 Classifier로 Softmax를 쓰지 않고 연식 있는 전통적인 분류 모델인 SVM을 사용한 이유는 VOC2007 데이터셋 기준으로 Softmax를 사용하였을 때 mAP 값이 54.2%에서 50.9%로 떨어졌기 때문이라고 합니다.
Bounding Box Regression
Bounding Box Regression은 처음에 y로 줬던 레이블과, CNN을 통과해서 나온 Bounding Box, 이 두 가지의 차이를 구해서 차이를 줄이도록 조정하는 선형 회귀 모델 절차입니다. 이렇게 Bounding Box Regression을 통해서 나온 값을 CNN 단계 전으로 전달하게 되고 이것을 이용해 Region Proposal이 더 잘 되도록 하게 해 줍니다.
아래 그래프에서의 P가 처음에 Proposal을 통해서 제안된 Bounding Box이고 G는 Ground Truth Bounding Box입니다.
Bounding Box Regression의 목표는 P를 정답 G에 맞추도록 Transform 하는 것입니다.
Bounding Box의 input 값은 N개의 Training Pairs로 이루어져 있습니다. 아래 식에서 x, y는 각각 Bounding Box의 중심 x, y 좌표, w, h는 Box의 Width, Height를 나타냅니다.
첫 번째 식은 P의 x 값이 업데이트되는 수식으로 P의 x값에 P Width 값과 P의 x에 대한 Transformation 함숫값을 곱한 것을 더해줍니다. $d_x$는 x에 대한 Transformation 함수인데, 아래 빨간색으로 줄 쳐 놓은 부분이 바로 $d_i(d_x, d_y, d_w, d_h)$ 식입니다. y값도 마찬가지로 P의 height 값에 P의 y 값에 대한 함수 값을 곱한 것을 더해주며 업데이트합니다. Width와 Height는 지수 함수를 통해서 업데이트됩니다. 결과 적으로 $t_i$와 $d_i$의 차이를 최소로 줄여 나가는 식인 것이죠.
정리해 보면, R-CNN은 이미지 하나의 임의의 영역들로 잘게 잘라서 Merge 하고 Warping 한 후, CNN의 Input으로 통과하여 Feature vecture를 추출하고, 적용된 label들을 이용해 SVM 분류와 Bounding Box Regression을 수행해서 영역 위치까지 예측을 하게 되는 모델입니다.
이러한 R-CNN은 모델이 3가지 이상 사용되기에 전반적으로 복잡하다는 단점이 있습니다. 또한 Region Proposal에서 사용되는 Selective Search는 CPU를 사용하는 알고리즘인데 이 Selective Search에서 추출한 2000개의 영역 이미지들을 CNN Model에 넣습니다. 즉 GPU에서도 한 장 당 약 13초 정도가 소요되는데 CPU에 넣게 되면 53초, 즉 2000 * 53초가 소요됩니다. 시간이 너무 많이 소요되죠... 게다가 각 모듈이 동시에 동작하지 않기에 Real-Time 분석이 어렵습니다.
이렇게 R-CNN에 대해 알아보았습니다.
초기 모델인 만큼 부족한 부분도 많이 보이고, 지금은 당연스럽게 생각되는 내용들도 꽤 많았습니다.
뭐... 그만큼 필수적으로 알아두어야 한다는 것이겠지요...?
이번 포스트는 여기서 마무리하도록 하겠습니다.
'Programming > Deep Learning Network' 카테고리의 다른 글
[Model] SSD (Single Shot Detector) (0) | 2023.03.02 |
---|---|
[Model] YOLO v1 (0) | 2023.02.23 |
[Model] FPN (0) | 2023.02.22 |
[Model] RetinaNet (0) | 2023.02.22 |
[Model] MobileNet v1 (0) | 2023.02.21 |
댓글