Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[ Computer Vision ] Object Detection - RCNN, Fast RCNN, Faster RCNN 본문

ML & DL & RL

[ Computer Vision ] Object Detection - RCNN, Fast RCNN, Faster RCNN

yesungcho 2022. 6. 23. 20:01

본 포스팅은 개인 학습용으로 작성되었고 권철민 님의 '딥러닝 컴퓨터 비전 완벽 가이드' 강의 내용을 참고하였습니다.

 

금일 포스팅에서는 Object Detection task의 기본이 되는 RCNN 계열의 알고리즘들을 간단하게 정리하고자 합니다. 우선 가장 기본이 되는 RCNN ( Region CNN ) 부터 살펴보겠습니다. 

 

RCNN

RCNN은 크게 2가지 stage로 나누어 동작하게 됩니다. 

Girshick, R., Donahue, J., Darrell, T., & Malik, J. (2014). Rich feature hierarchies for accurate object detection and semantic segmentation. In  Proceedings of the IEEE conference on computer vision and pattern recognition  (pp. 580-587).

1. Region Proposal

 

2. CNN Detection

 

Region proposal은 말 그대로 '영역 추정'인데요. object가 있을 만한 곳을 'Selective Search' 알고리즘을 통해 2000개의 영역을 추리는 단계로 구성됩니다. 그 다음 뽑힌 영역에 대해서 CNN ( Alexnet 등 ) 네트워크에 입력으로 넣어줍니다. 이 때는 size를 맞추는 과정 ( wrap, crop 등 )을 거쳐줍니다. 예를 들어 227x227을 입력으로 받게 되면 227x227로 무조건 2000개의 영역을 저 사이즈로 맞추는 것입니다. 그 이유는, CNN을 통해 줄여진 저 feature map에서 1d flatten 형태로 만들게 되면, 바로 이 데이터가 FC Layer의 입력으로 들어가기 때문입니다. 물론 이 과정에서 어느 정도의 정보의 손실은 발생하게 됩니다. 그 다음, 바로 저 마지막 layer에서 뽑힌 output을 SVM classifier의 입력으로 넣어 classification을 수행합니다. 특이한 점은 이 때 일반적인 뉴럴넷처럼 끝단에 softmax를 붙여 classification을 수행하지 않는 점이 특징입니다. 그저 feature map을 extract하는 과정에서만 사용했다는 점이 특징입니다. 그리고 마찬가지로 bounding box regression도 저 네트워크 안에 위치하지 않고 바깥에 위치하게 됩니다. Bounding box regression의 경우는 말 그대로 Bbox의 위치를 찾아주는 것을 말합니다. 다음 사진을 보시죠. 

저 자동차를 detect하기 위해 가장 좋은 노란색 박스는 우측의 것과 같을 것입니다. 물론 정답지는 annotation되어 있는 xmin, xmax, ymin, ymax를 기준으로 찾게 됩니다. 이러한 regression 모형도 별도로 수행되게 됩니다. 이 Bounding Box Regression은 정답지와 CNN을 통과해서 나온 Bounding Box와의 차이를 바탕으로 학습이 수행됩니다. 

 

조금 더 쉽게 RCNN 아키텍처를 정리하면 아래 그림과 같이 됩니다.

 

그렇다면 구체적으로 어떻게 학습을 수행할까요? 

우선 classification부터 살펴보겠습니다. 

위 그림에서 Selective Search를 통해 뽑힌 2000개의 영역을 input으로 넣을 때, CNN으로 사용하는 backbone 모형은 pretrain이 수행이 된 모형을 사용합니다. Backbone은 ImageNet으로 pretrain이 되어 있으며 1000개의 class로 pretrain이 수행됩니다. 그 다음 우리가 갖는 ground truth와 selective search의 결과를 fine tuning을 해주어야 하는데, 여기서 중요한 점이 ground truth (이하 GT)와 selective search (이하 SS) 의 IOU가 0.5 이상의 경우에만 해당 클래스로 분류하고 그렇지 않은 경우는 background로 지정해서 tuning을 시켜주는 특징이 있습니다

 

다음으로는 Regression을 봐봅시다. 

 

위 figure는 이 개념을 매우 잘 설명해주는 도식도입니다. 위 그림에서 회색 박스는 SS로 예측된 region이고 빨간 색이 GT입니다. 여기서 우리는 저 SS region을 GT로 근사시키려고 하기 때문에 GT와 SS의 중심 간 사이의 거리를 줄이려고 할 것입니다.  ( 자세한 수식은 생략하겠습니다 )

 

이러한 구조로 우선 동작하는 것이 RCNN입니다. 하지만 이런 RCNN은 하나의 이미지마다 SS를 수행해서 2000개의 region 영역의 이미지들을 도출해야 합니다. 그리고 그들의 CNN feature map을 도출해야 하고 classification과 regression은 또 따로 구성이 되어 있어서 결국 시간이 오래 걸리게 됩니다. 1장의 이미지를 objective detection을 수행하는 데 약 50초 정도 소요되었다고 합니다. 그래도 딥러닝 기반의 Object Detection ( 이하 OD )를 수행한 첫 논문으로서 그 의의가 큽니다. 

 

다음으로 이를 개선한 Fast RCNN에 대해 살펴보겠습니다. 

 

Fast RCNN

결국 RCNN에서 가장 문제가 되는 것은 2000개의 영역을 의무적으로 찾아야 했다는 것입니다. 그래서 원본 이미지 그대로 넣고, feature map에서 selective search로 뽑은 애들과 서로 mapping을 하면 어떨까하는 아이디어가 나왔지만, 

size가 다르게 feature map이 나오게 되면 이를 classification을 수행해주기 위해 1d flatten vector로 만들 수가 없게 됩니다. 즉 mapping한 녀석을 쓸 수가 없는 것이죠. 그래서 이 문제를 해결하기 위해 여러 시도들이 있어왔죠. ( i.e. SPPNet )

 

이 문제를 바로 Fast RCNN은 'ROI Pooling'이라는 것을 사용해서 해결하는 것을 제안합니다. 

 

Fast RCNN의 특징은 2가지로 볼 수 있습니다.

 

(1) Feature map 아이들을 ROI Pooling을 적용해서 뽑은 다음에 CNN의 input으로 집어 넣는 과정을 거칩니다. 

 

(2) CNN에서 softmax를 통해 Classification을 수행하고 Regression도 같이 수행합니다. ( End-to-end )

 

저기서 (1)을 통해, ROI Pooling을 해주게 되면 Feature map 을 고정 크기의 Pooling 으로 mapping을 시켜주게 됩니다. 

그렇다면 저 ROI Pooling은 어떻게 수행되는 걸까요?

예를 들어 아래와 같이 2개의 Object detection region이 있다고 해보면,

저기서 이를 ROI Pooling을 통해 고정된 7x7로 만들고 싶다고 해봅시다.

이 경우 14x7의 ROI의 경우 다음 연산을 통해 7x7를 만들 수 있습니다.

세로로는 stride=2, 가로로는 stride=1로 해주어, max 값을 pooling해주게 됩니다. 그리고 8x7 같이 깔끔한 모형이 아닌 경우에는 보간법 기반의 다양한 resize방법으로 바꾸어서 7x7로 만들어낸다고 합니다. 

 

따라서 저 8x7과 14x7을 7x7로 pooling해주게 되면 다음과 같이 

2개의 채널로 구성된 7x7 ROI pooling이 완성됩니다. 바로 이 녀석을 바탕으로 classification과 regression을 수행하게 됩니다. 

 

이를 조금 더 이해하기 쉬운 구조로 표현해준 다음 그림을 참고해봅시다.

https://jonathan-hui.medium.com/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9

 

이렇게 구축된 모형에 classification과 regression을 수행해주는 부분을 전부 하나의 end-to-end 네트워크로 만들어주어, 전부 다 한꺼번에 backpropagation을 시킬 수 있게 됩니다. 

 

따라서 Loss function은 이를 한꺼번에 고려한 수식을 구성됩니다. 즉 기존 classification과 regression loss를 합해서 multi task loss로 바꾼 형태가 됩니다. 

 

위 수식에서 L_cls는 classification 에러, L_loc은 regression 에러가 됩니다. 그리고 이 regression error는 일반적인 L1 error가 아닌, 아래와 같이 살짝 수정된 smoothL1을 사용합니다. 

 

 

이제 여기서 마지막 RCNN 계열인 Faster RCNN을 살펴보겠습니다. 

 

Faster RCNN

Faster RCNN에 이르러서 비로소 Object Detection을 구성하는 모든 요소들을 다 딥러닝으로 구성되게 됩니다. 아직 딥러닝 구조가 아닌 부분이 바로 SS입니다. 이 부분이 이제 'Region Proposal Network (RPN)'이라는 네트워크로 대체되게 됩니다. 

기존 Fast RCNN에서 이 RPN을 적용한게 Faster RCNN의 전부입니다. 

 

RCNN 계열 모형들을 잘 설명해준 그림이 있어 참고로 올립니다.

 

 

그렇다면 이 RPN은 어떻게 구현되어 있을까요?

 

여기서는 바로 'anchor box'라는 개념을 활용합니다. 

 

이 anchor box도 SS에서 활용되는 것과 크게 의미는 다르지 않습니다. 말 그대로 object가 있는 지 없는 지의 후보를 표현하는 box이기 때문입니다. 

https://www.researchgate.net/figure/Anchor-Boxes-at-a-certain-position-in-the-feature-map-There-are-15-anchor-boxes-defined_fig7_326786331

 

이 anchor box는 기본적으로 9개로 구성이 되며 각각 다른 scale을 가질 수 있는 다양한 object의 크기를 반영해주기 위함입니다. 그래서 바로 이 다양한 크기의 anchor box들을 활용해서 object가 있을 위치를 추정해주는 거죠. 이해를 돕고자 아래 슬라이드를 참고해보았습니다.

물론 위 사진은 엄밀히 말하면 잘못된 사진입니다. Anchor box는 위처럼 실제 real input에 적용되지 않고 feature map level에서 적용되기 때문입니다. 하지만 의미는 동일합니다. 저 경우 차와 사람 2개의 object를 detect하기 위해 2개의 anchor box가 추려지게 됩니다. 

 

구체적으로 예를 들어보겠습니다. 아래 그림을 보시죠

아래와 같이 800x600의 real input을 가정했을 때 네트워크를 통과하게 되면 1/16으로 크기가 줄어든 feature map이 생겨난다고 하면, feature map은 50x38 ( 채널 수는 증가 ) 이 될 겁니다. 그러면 저 때 형성되는 저 격자 점 한 개 한 개를 바로 grid point라고 합니다. 바로 저 grid point의 중심을 기준으로 9개의 anchor box를 겹쳐 그리게 되는데 직관적인 이해를 위해 아래 그림을 보시면

위 그림이 이렇게 격자점으로 표시되어 있는 것을 grid point라고 하면 저렇게 검정색으로 3개의 anchor box를 예로 그려보았습니다. 실제 저렇게 9개의 anchor box가 그려지게 되고 그것들을 object가 있는 후보로 각각 설정합니다.

그리고 위처럼 그 anchor box들은 서로 겹치기 십상이겠죠. 

 

이를 더 명확히 표현한 것은 아래 슬라이드와 같습니다. 

동일한 예시이고 위의 ppt 그림처럼 총 50*38 = 1900개의 grid point가 생겨나고 각 grid point마다 9개의 anchor box가 생기기 때문에, 1900*9 = 17,100 개의 anchor box가 생겨나게 됩니다. 바로 이 anchor box들을 활용해서 RPN을 수행합니다. 

 

그러면 이제 디테일한 내용을 살펴보겠습니다.

우선 큰 구조는 그림의 윗단과 같습니다. 원본 이미지에 네트워크를 통과시켜 feature map을 구하고 이를 RPN을 통해 region proposal을 수행하는 게 큰 그림이죠. 그리고 그 RPN의 구체적인 구성 요소를 살펴보면 처음에는 feature map을 3x3 convolution layer를 통과시키기 되는데, 이 때 padding을 적용해주어 결국 도출되는 사이즈는 이전 input 40x50x512(채널)과 동일하게 나타납니다. 이를 그림으로 나타내면 다음과 같습니다.

그리고 이후 classification과 regression을 수행하는 부분을 확인해보겠습니다.

우선 Classification 단을 봐봅시다. 우선 저 부분은 1x1 convolution layer는 9개의 output channel을 가지게 되는데 output 형태는 40x50x9가 되고 저 9가 바로 anchor box에 대한 채널이 됩니다. 고로, 총 40x50x9인 18,000개의 anchor box로 구성이 되게 됩니다. 그리고 이 18,000개 별로 개별적으로 object냐 아니냐를 판단하게 됩니다. 마지막 단에는 sigmoid 같은 classification 단을 구성해서 이진 분류를 수행합니다.

 

그리고 영역을 찾게 되는 bounding box regression을 수행하는 단이 바로 아래에 위치하게 됩니다. 이 경우 1x1 convolution layer가 되고 4x9 output channel이 됩니다. 즉, 40x50x9x4가 되는 것이죠. 바로 이 4는 bounding box의 특징, 즉 중심점 x1, y1과 width, height에 대한 정보가 됩니다.

여기서 Bbox Regression을 수행할 때는 RCNN과 유사합니다. 다만 중요한 점은 Anchor Box 개념이 있다는 점이죠. 즉, GT와 예측 Bbox의 중심 좌표 x, y 그리고 w, h의 차이가 Anchor box와 GT 간의 중심 좌표 x, y, w, h의 차이와 최대한 동일하게 예측이 되게 하는 것입니다. 바로 이러한 부분 때문에 'Anchor'라는 말이 붙었습니다. "기준"이라는 뜻이죠.

 

물론 모든 anchor box를 사용하는 것은 아닙니다. 어느 정도 IOU 이상을 가지는 것을 사용해야겠죠. 여기서는 IOU가 0.7 이상인 경우를 Positive anchor box라고 하는데 이들을 위주로 Regression을 학습합니다.

 

그리고 Loss function은 다음과 같이 디자인 됩니다. 

pi = Anchor i가 object일 예측 확률

pi* = Anchor i의 GT object 여부 ( positive 1, negative 0 )

ti = Anchor i와 예측 좌표 차이 ( x,y,w,h )

ti* = Anchor i와 GT 좌표 차이 ( x,y,w,h )

N_cls = 미니 배치에 따른 정규화 값 (256)

N_box = 박스 개수 정규화 값 ( 최대 2400 )

 

저기서 pi*는 실제 object 인 경우만 1을 부여해서 실제 object일 때만 regression을 수행하게 됩니다. 

 

그래고 N_cls는 정규화 term인데, 실제 negative anchor box가 positive에 비해 훨씬 많기 때문에, mini batch를 통해 balancing을 해주게 됩니다. 예를 들어 256개의 mini batch라면 배치 별로 (128 positive, 128 negative) 쌍으로 뽑게 되는 것과 동일한 맥락입니다. 

 

이 RPN 네트워크를 Faster RCNN 구조에 집어넣으면 다음과 같이 구축됩니다. 

https://jonathan-hui.medium.com/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9

 

Faster RCNN은 독특한 점이 'Alternating Training'을 수행한다는 점이 특징입니다. 왜 이렇게 하는 지는 저도 잘 모르겠네요.. 논문에도 별 언급이 없는 것 같습니다.

Alternating Train은 말그대로 번갈아 학습하는 것을 의미합니다. 

  1. RPN 먼저 학습하고
  2. 그 다음 region proposal된 데이터를 바탕으로 Classification과 Regression을 학습
  3. 그 학습을 바탕으로 RPN을 Fine tuning
  4. 마지막으로 Faster RCNN을 Fine tuning

 

개인 공부용으로 정리된 것이다보니 정리가 말끔하지 않은 점은 양해부탁드립니다. 추가로 공부할 때 참고할만한 포스팅으로 아래 포스팅을 추천드립니다. 

 

https://jonathan-hui.medium.com/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9

 

What do we learn from region based object detectors (Faster R-CNN, R-FCN, FPN)?

In this series, we will take a comprehensive journey on object detection. In Part 1 here, we cover the region based object detectors…

jonathan-hui.medium.com

이상 긴 글 읽어주셔서 감사합니다.