본문 바로가기

논문 정리

Faster R-CNN

  Fast R-CNN은 R-CNN에 있던 학습 속도와 inference 속도의 개선과 classification에 사용했던 머신러닝을 softmax로 대체하면서 end-to-end 학습이 가능하게 되었습니다. 또한 RoI Pooling을 적용해서 서로 다른 크기의 Object들을 FC layer에 맵핑 가능해졌습니다.

 

Fast R-CNN에서는 Region Proposal을 Selective Search를 계속 사용했습니다. Faster R-CNN에서는 Region Proposal를 하나의 NetWork로 만듬으로 gpu를 통한 학습이 가능하게 되었고, 이를 RPN(Region Proposal Network)라고 부릅니다.

 

Faster R-CNN에서는 RPN에서 출력한 Bounding Box를 사용해서 Feature들을 Cropping 한 후에 RoI Pooling과 Classification을 수행하게 됩니다.

 

Faster R-CNN 아키텍처

 

  Fast R-CNN에서는 Selective Search를 사용해서 2000개 가량의 객체를 찾고 찾은 객체를 RoI Pooling을 수행한 수에 Clas sification 하는 방법을 사용합니다. 여기서 Selective Search의 경우, 네트워크가 이니기 때문에 2000개가량의 객체를 찾는다는 것은 매우 비효율적이므로 해당 부분을 Faster R-CNN은 GPU 연산을 하기 위해서 RPN으로 교체해서 GPU 연산을 수행할 수 있도록 했다고 생각하시면 됩니다.

 

Faster RCNN과 Fast R-CNN 구조는 비슷

 

  Faster R-CNN의 핵심은 바로 RPN입니다. Faster R-CNN에서 수행한 RPN은 다음과 같이 이미지를  임의의 박스를 임의의 위치에 겹치도록 생성하는 것이 아닌 이미지를 격자 무늬로 나눈 다음에 빨강박스 하나당 미리 정의된 Anchor Box들을 사용해서 실제 Ground Truth와 유사한 Box를 찾는다고 생각하시면 됩니다. 

 

  Faster R-CNN에서는 처음으로 Anchor Box라는 개념을 도입했습니다.

 

RPN
RPN - Anchor Box

 

위의 그림에서 파색박스가 anchor box 박스입니다.

grid를 나눈 빨강색 박스당 미리 크기와 비율 등이 정해진 anchor box들이 존재합니다. 따라서 이 anchor box들을 실제 ground truth와 최대한 가까워 지도록 regression을 해서 ground truth를 찾는 방법을 사용합니다.

 

또한 논문에서는 Faster RCNN에 적용한 anchor box를 이용해서 Object를 Detection하기 위한 총 3가지 방법을 제안합니다.

제안한 3가지 방법

(a) 영상의 Scale을 바꾸는 방법

  • 만약 10x10의 크기의 Kernel있다고 가정하고, 입력 영상의 해상도를 여러 해상도로 바꾸어 제일 큰 해상도의 영상에서는 찾지 못한 말을 입력 영상의 크기를 줄여 말을 찾을 수 있게됩니다.

(b) 영상의 크기를 줄이는 것 대신 여러 크기의 anochor box를 사용하는 방법

  • (b)는 영상을 줄이는 것 대신에 filter의 사이즈를 다양하게 사용해서, 크기가 다른 Object를 찾는 방법입니다.

(c) reference를 여러개 사용

  • 여기서 reference란 anchor box와 같이 해당 물체들의 적합한 box들을 미리 여러개의 사이즈로 구분하고 추론하는 것을 의미합니다.
  • 즉, 작은 사이즈의 Object는 작은 anchor box로 큰 사이즈의 Object는 큰 사이즈의 anchor box로 찾는 것을 의미합니다. 

  제한된 방법으로 anchor box를 Faster RCNN이 학습함으로 최대한 GT와 비슷한 Box를 찾습니다. 따라서 해당 anchor box를 사용하기 위해서 faster rcnn에서는 Region Proposal이 Network가 됨으로 인해서 GPU 학습이 가능하게 되었습니다.

 

 

RPN(Region Proposal Network)

RPN

  RPN은 우선 Sliding Window라는 Window를 먼저 정의합니다. 이때 window 하나당 2k개의 scores와 4k개의 coordinates가 존재합니다. 

  • 2k scores
    • 해당 sliding window에 object가 있는지 없는지에 대한 판단하는 score가 k개가 존재합니다.
  • 4k coordinates
    • bounding box의 좌표 값을 의미합니다.

  그리고 window 마다 존재하는 grid point가 존재하는데 해당 grid point마다 미리 정의된 k개의 anchor box가 있습니다. 여기서 각 anchor box는 (center x, center y, width, height)의 좌표 값을 가지고 있고, 해당 anchor box가 object인지 배경인지를 구분하는 score가 출력이 됩니다.

 

그렇다면 1개의 window당 여러개의 anchor box가 생성이 되고, 해당 grid point 마다 anchor box를 그리게 되면 다음과 같이 그려집니다.

그렇다면, 해당 anchor box들을 이용해서, 최적의 박스를 찾기 위해서는 어떻게 해야할까요  ... ?

 최적의 박스를 찾기 위해서는 nms 방법을 사용하게 됩니다.

 

nms란 Non-Maximum Suppression입니다. 해당 방법은 하나의 물체를 가르키는 여러개의 박스들 중에 1개의 박스만 남기는 방법입니다.

 

nms를 적용하는 방법은 다음과 같습니다.

  1. Confidence Score Threshold 보다 낮은 박스들을 제거합니다.(모델 개발자의 선택에 따라서 달라지는 값)
  2. Confidence Score Threshold 이상의 박스들을 내림차 순으로 정렬합니다.(높은 점수 -> 낮은 점수)
  3. 정렬 후에 내림차순으로 박스들간의 IoU Score를 계산
  4. 설정한 IoU Threshold 보다 높은 IoU Score를 제거
  5. 위에 1 ~ 4를 수행하면, Confidence Score가 높은 박스 1개만 남게 됩니다.

Faster RCNN은 다음과 같이 Loss Function을 정의하고 있습니다.

Faster RCNN Loss Function

Faster RCNN의 Loss Function은 다음과 같이 정의하고 있습니다.

Classification Loss와 Bounding Box Regression Loss를 합친 Multi-task Loss의 형식입니다.

 

Faster RCNN의 학습 과정은 크게 4개의 단계로 나누어져 있다고 합니다.

  1. ImageNet pre-trained된 모델로 RPN을 end-to-end로 학습을 합니다.
  2. 이후,  RPN을 사용해서 fast R-CNN을 학습을합니다.
  3. feature 추출을 위한 parameter 공유와 RPN 학습
  4. feature 추출을 위한 parameter 공유와 Fast RCNN 학습

  위와 같은 단계로 Faster RCNN을 학습을 한 이유는 당시에는 Faster RCNN을 한 번에 학습할 수 있는 GPU 메모리가 없는 상황에 사용했던 방법입니다. 요즘에는 한 번에 학습이 가능합니다.

 

Faster RCNN은 성능 측정을 위해서 mAP(mean Average Precision)를 사용했습니다. mAP를 계산하기 위해서는 우선 Classification의 성능평가를 하기위한 오분류표를 이해를 해야합니다.

오분류표

오분류표를 이용한 정확도는 다음과 같이 계산됩니다.

  • Accuracy = (TP + TN)/(TP + FP + FN + TN)
  • Precision(정밀도) : Positive라고 예측한 것 중 정답이 Positive인 것의 비율
    • Precision = TP/(TP+FP)
  • Recall(재현율) : 정답이 Positive인 것중 Positive라고 예측한 것의 비율
    • Recall = TP/(TP + FN)

그렇다면 mAP는 어떻게 계산이 될까요 .. ?

  먼저, Class별 AP를 계산을 해야합니다. AP는 값은 precision과 recall에 의해서 계산이 됩니다. 즉, precision recall 그래 프의 너비가 AP가 됩니다. 따라서  Confidence Score의 Threshold의 값에 따라서 precision과 recall 값이 달라져 계산이 되는 AP의 값이 달라지게됩니다.

 

우선, label이 새이고,  confidence score threshold 값이 0.9이고 다음 사진과 같이 detection이 되었다고 가정하면, 

Precision은 1.0, recall은 0.2가 됩니다. Precision은 위에서 정의 한 것 처럼 Positive라고 예측한 것 중 정답이 Positive인 것의 비율입니다. Positive라고 예측한 것은 1개이고, 정답이 Positive인 것 또한 1이기 때문에 1/1 = 1 이됩니다. recall의  경우, 정답이 Positive인 것중 Positive라고 예측한 것의 비율 입니다. 따라서 정답이 Positive 인 것은 화면에 총 5마리의 새가 있으므로 5가됩니다. Positive라고 예측한 것은 1개의 object만 맞추었기 때문에 1이 됩니다. 즉, 1/5 = 0.2로 계산됩니다.

 

이런식으로 confidence score를 조절해 가면서 recall과 precision을 구하면 다음과 같이 계산이 됩니다.

 

위와 같이 계산된 precision과 recall을 사용해서 그래프를 그리면 다음과 같이 그려집니다.

 

recall 값이 0.0 ~ 1.0까지의 포인트 별로 최대 precision의 평균 값을 구하게 됩니다.

 

총 포인트의 개수는 11개입니다. 즉 다음과 같이 계산할 수 있습니다.

새의 AP 계산

새에 대한 AP는 0.758 입니다. 이런식으로 다른 object의 AP를 구한후에 AP값들을 평균을 한 값이 mAP입니다.

 

또한 위의 precision과 recall을 사용해서 precision과 recall의 조화 평균인 f1 score도 계산을 할 수 있습니다.

F1 Score

 

다음으로는 Faster RCNN의 성능 평가 결과입니다.

여기서 ZF는 Convolution layer를 5개만 사용한 모델입니다.RPN을 사용학고, ZF에 parameter를 공유하게 되면 mAP가 59.9로 가장 좋은 성능을 보이고 있습니다.

또한, VGG를 backbone으로 사용하고, parameter를 공유하지 않았을 경우 보다 공유했을 경우에 더 성능이 좋았으며, pascal voc 데이터를 07년도와 12년도 2개를 동시에 사영했을 경우에 07년도 데이터만 사용 했을 경우보다 성능이 더 좋았다고 합니다. 또한 마지막에 COCO 데이터 셋을 함께 학습한 모델이 더 성능이 좋았다고 합니다.

 

또한, featrue sharing은 데이터가 충분하지 않을 때 모델의 성능을 올리기 위해서도 좋은 방법이라고 합니다.

 

RPN을 사용한 Faster RCNN의 경우가 더 성능이 좋고 빠른 FPS를 보여주고 있습니다.

 

마지막으로 Faster RCNN의 Detection 결과입니다.

'논문 정리' 카테고리의 다른 글

[간단리뷰]Unet++  (0) 2024.05.11
[review]PETALS: Collaborative Inference and Fine-tuning of Large Models  (0) 2023.08.08
YOLOV1  (0) 2023.07.02
Fast R-CNN  (0) 2023.06.03
R-CNN  (0) 2023.05.30