Perception/Object Detection

[Object Detection] Faster R-CNN

고집호랑이 2023. 7. 1. 16:38

Fast R-CNN은 ROI Pooling Layer을 사용하여 학습 시간과 객체 검출 시간을 이전 모델들보다 월등히 단축시켰습니다. 

 

하지만 2.3초라는 Fast R-CNN의 detect 시간은 실시간으로 사용되기에는 너무 긴 시간입니다. Fast R-CNN의 detect 시간을 늘린 가장 큰 요인은 바로 Region Proposal로 사용된 Selective Search이었습니다.

 

Selective Search는 딥러닝에 포함되지 않고 외부에서, CPU를 사용해야만 수행될 수 있었기에 detect 시간이 길어진 것이었죠.   

 

이번 포스팅에서 알아볼 Faster R-CNN 모델은 이 Selective Search 부분을 Region Proposal Network(RPN)로 바꾸면서 비로소 모든 요소들을 딥러닝만으로 구성한 최초의 end-to-end Object Detection 모델입니다.

 

Faster R-CNN의 간단한 구조

 

RPN이 사용되면서 이제는 RoI를 GPU로 계산할 수 있기 때문에 학습이나 Inference 속도가 빨라지고, 학습도 가능해지면서 정확도도 향상시키게 되었죠.

 

Region Proposal Network(RPN)가 Faster R-CNN의 가장 큰 특징이라 할 수 있으며, 나머지 부분들은 Fast R-CNN과 거의 동일합니다. 즉 Faster R-CNN은 아래 그림과 같이 RPN과 Fast R-CNN이 합쳐진 형태라고 말할 수 있습니다.

 

Faster R-CNN = Fast R-CNN +RPN

 

Fast R-CNN에 대해서는 저번 포스팅에서 충분히 알아봤으니 이번 포스팅에서는 Region Proposal Network를 중점적으로 알아보도록 하겠습니다. 

 

Region Proposal Network를 어떤 방식으로 Selective Search의 역할을 수행하는 것일까요?

 

RPN (Region Proposal Network)

Selective Search가 Segmentation을 이용해 물체가 있을만한 영역을 뽑아냈다면, RPN은 anchor box라는 것을 이용해 물체가 있을만한 영역을 찾습니다.

 

1. anchor box

anchor box란 아래 그림과 같이 중심 좌표를 기준으로 여러 크기와 비율을 가지고 생성된 box입니다.

 

여러 종류의 anchor box들

이렇게 여러 크기와 비율을 가지는 box를 생성하는 이유는 다양한 형태의 object를 빠뜨리지 않고 찾기 위해서라고 생각하시면 됩니다.

 

보통 하나의 중심좌표 당 9개의 anchor box를 생성하는데, 위 그림의 경우에도 <128, 256, 512>의 표준 길이, <1:1, 1:2, 2:1>의 비율을 각각 가지는 9개의 anchor box가 생성된 것을 확인할 수 있습니다.

 

anchor box를 생성할 때는 아래 그림과 같이 입력 이미지가 feature extractor를 통과하여 나온 feature map의 모든 grid point를 중심 좌표로 설정하는데요.

 

Anchor Box는 모든 grid point를 기준으로 각각 9개씩 생성됩니다.

 

즉 만약 feature extractor를 통과하여 나온 feature map의 크기가 25 x 18이라면 anchor box는 25 x 18 x 9로 총 4050개가 생성되는 것이죠. 생성되는 모든 anchor Box를 그림으로 나타내면 다음과 같습니다.

 

생성되는 anchor box들

 

2. RPN 네트워크 구조

RPN 네트워크는 위와 같은 anchor box를 이용해서 아래 과정으로 Selective Search와 같은 Region Proposal 역할을 수행합니다.

 

RPN 네트워크 구조

1. feature extractor로 부터 feature map을 얻습니다.

2. feature map에 3 x 3 convolution 연산을 256 또는 512 채널만큼 수행합니다. 이때 padding은 'same'으로 설정하여 feature map의 가로 세로 크기는 변하지 않도록 합니다.

3. 두 번의 1 x 1 convolution 연산을 수행하면서 classification과 bounding box regression 예측 값을 각각 계산해줍니다. 이때 CNN처럼 Fully Connected Layer가 아닌 Fully Convolution Layer를 사용해주는 이유는 입력 이미지의 크기에 상관없이 동작할 수 있도록 하기 위해서라고 합니다.

4. Classification의 경우, 각 anchor box가 object인지 아닌지에 대해서만 예측(어떤 물체인가에 대해서는 Fast R-CNN의 Classification에서 수행한다.)하기 때문에 1 x 1 convolution 연산을 2(object 인지 아닌지) x 9(anchor box의 개수) 채널만큼 수행해줍니다. 수행 결과, 각 grid cell을 중심좌표로 생성된 anchor box가 object인지 아닌지에 대한 정보가 모두 담겨있게 됩니다.  

5. Bounding Box Regression의 경우, 각 anchor box로 예측한 물체의 Bounding Box의 4개 좌표(중심 x 좌표, 중심 y 좌표, 높이, 너비)를 계산하기 때문에  1 x 1 convolution 연산을 4(중심 x 좌표, 중심 y 좌표, 높이, 너비의 Bounding Box 4개 좌표) x 9(anchor box의 개수) 채널만큼 수행해줍니다.

6. Classification 결과를 이용해 anchor box들 중 object일 확률이 높은 순으로 정렬한 뒤, 상위 N개에 해당하는 anchor box를 Bounding Box Regression과 NMS(Non Max Suppression)을 이용해 최종 RoI 영역을 뽑아냅니다.  

 

위와 같은 과정으로 RPN은 Region Proposal의 역할을 수행하고, 이후 최종적으로 뽑힌 RoI 영역에 Fast R-CNN과 동일하게 RoI Pooling Layer와 Classification, Bounding Box Regression이 수행됩니다.

 

3. Training

RPN도 딥러닝이므로 당연히 학습 과정이 있습니다. 그치만 만약 만들어진 모든 anchor box에 대해서 학습을 진행한다면 학습이 제대로 이루어지지 않을 뿐더러 비효율적일 것입니다.

 

때문에 Faster R-CNN은 anchor box의 종류를 나눠 positive, negeative anchor box에 대해서만 학습을 진행합니다. 

 

anchor box의 종류

위의 그림을 보면 알 수 있듯이 positive anchor box란 실제 bounding box와의 IoU가 0.7 이상인 anchor box와 IoU가 가장 높은 anchor box를 말하고 negative anchor box란 실제 bounding box와의 IoU가 0.3 이하인 anchor box를 말합니다. 

 

Faster R-CNN은 positive anchor box를 객체가 존재하는 positive sample로써 학습에 사용하고 negative anchor box에 대해서는 background로써 학습에 사용합니다.

 

그리고 IoU가 0.3 이상 0.7 이하에 해당되는 애매한 anchor box는 학습에 포함시키지 않는 것이죠.

 

이는 아래 RPN Loss 함수를 통해서도 확인할 수 있습니다.

 

RPN Loss 함수

 

$p_i^*$가 positive anchor box일 경우 1, negative anchor box일 경우 0의 값을 가지며, Regression Loss에서는 negative anchor box의 경우 background로 간주돼 0이 곱해짐으로써 학습에 사용되지 않는 것을 확인할 수 있습니다. (즉 negative anchor box는 classification 학습에만 사용됨)  

 

함수로는 Classification의 경우 Cross-Entrophy 라고도 불리는 Log Loss 함수($L_{cls}$)가, Regression의 경우 Smooth L1 loss 함수($L_1^{smooth}$) 사용되었습니다. 

 

해당 anchor box가 Object 인지 아닌지만을 판단하는 이진 분류였기 때문에 Log Loss 함수는 아래와 같은 형태이며,

 

Log Loss 함수

 

Fast R-CNN에서 이미 나왔던 Smooth L1 loss 함수는, 아래 빨간색 그래프처럼 <-1에서 1 사이의 구간>에서는 2차 함수이고 <그 밖의 구간>에서는 1차 함수인 오류함수입니다.

 

smooth L1 함수
Smooth L1 함수

 

이 smooth L1 함수에는 Bounding Box Regression을 학습하기 위해서 $t_i$ 와 $t_i^*$의 차가 입력값으로 사용되는데, $t_i$는 원래 anchor box 네 좌표에서 네트워크를 통과해서 나온 Predicted Bounding Box 네 좌표까지의 이동량을 의미하고  $t_i^*$는 원래 anchor box 네 좌표에서 Ground Truth Box 네 좌표까지의 이동량을 의미합니다.

 

Bounding Box Regression

 

위 그림에서 살펴보면 파란색 anchor box에서 빨간색 예측 Bounding Box까지의 이동량($Δx, Δy, Δw, Δh$)이 $t_i$이고, 파란색 anchor box에서 노란색 Ground Truth Box까지의 이동량($Δx, Δy, Δw,Δh$)이 $t_i^*$인 것이죠.

 

이 두 값의 차이($t_i - t_i^*$)가 최대한 0이 되도록 만들어 예측 Bouding Box가 Ground Truth Box를 가능한 일치시키기 위해서 ($t_i -t_i^*$)를 Bounding Box Regression 학습에 사용하는 것입니다. 

 

$t_i$, $t_i^*$ 각각의 식은 다음과 같습니다. 

 

t_i와 t_i^*

 

사실 이 부분은 R-CNN의 Bouding Box Regression과 거의 동일하기 때문에 해당 파트(R-CNN)를 읽고오시면 이해가 더 잘되실 겁니다.

 

다음으로 넘어가 $N_{cls}$에는 미니배치의 사이즈가 들어가고(논문에서는 256), $N_{box}$에는 anchor box의 개수(논문의 경우 2400)가 들어가게 됩니다. 

 

λ는 Classification Loss와 Regression Loss 사이의 가중치를 조절해주는 변수로 논문에서는 10으로 설정해 사실상 둘의 가중치를 거의 동일하게 설정하였습니다. ($\frac{1}{256} ≒  \frac{10}{2400}$)

 

Alternating Training

Faster R-CNN은 모든 요소들이 딥러닝으로 구성되어 있긴 하지만 전체 모델을 한번에 학습시키면 성능에 문제가 발생합니다.

 

학습되지 않은 RPN으로 RoI 영역이 제대로 추출되지도 못하는데, Fast R-CNN 파트의 Classification이나 Bounding Box Regression을 학습시킨다면 당연히 문제가 발생할 수 밖에 없습니다. (아마 학습이 아예 안되던가 학습 시간이 엄청 오래걸리겠죠?)

 

이를 위해서 Faster R-CNN은 Alternating Training 기법을 사용합니다. 과정은 다음과 같습니다.

 

1. Pretrained된 Feature extractor을 활용해 RPN을 먼저 학습시킵니다.

2. 학습된 RPN으로 추출한 RoI를 이용해 Fast R-CNN을 학습시킵니다.

3. 학습시킨 RPN과 Fast R-CNN 중 RPN에 해당하는 부분을 Fine Tuning 시켜 줍니다.

4. 마지막으로 Fast R-CNN 부분을 Fine Tuning 시켜 줍니다.

 

성능 비교

Faster R-CNN은 모든 요소들을 딥러닝으로 구성함으로써, GPU 사용으로 detect 속도를 높이고 정확도도 향상시킬 수 있습니다.

 

 

위 그림과 같이 Coco 데이터 세트에서, 이전 모델인 Fast R-CNN보다 mAP 성능이 더 높아진 것을 확인할 수 있으며,

 

 

detect 속도도 10배 정도 빨라진 것을 확인할 수 있습니다. (0.5fps => 5fps) 이미지당 2초 정도의 Fast R-CNN detect 시간이 0.2초로 단축된 것이죠.

 

거기다 더 좋은 Backbone 모델(Feature Extractor)을 사용했을 경우에는 17fps로 이미지당 detect 시간이 0.06초 정도까지 줄어들게 되는 것을 확인할 수 있습니다.

 

R-CNN 계열의 Object Detection

 

지금까지는 R-CNN 계열의 2-stage detector에 대해서 알아봤다면, 다음 포스팅부터는 1-stage detector에 해당하는 YOLO나 SSD에 대해서 알아보도록 하겠습니다.

 

Reference

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

 

https://yeomko.tistory.com/17

 

https://lcyking.tistory.com/92

 

https://nuggy875.tistory.com/33