본문 바로가기

개발/딥러닝

[논문 리뷰] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

faster R-CNN은 R-CNN(https://codestudycafe.tistory.com/63)을 조금 더 빠르게 바꾼 모델입니다. R-CNN에서 어떤 것이 달라졌는지로 시작해 보겠습니다.

무엇이 달라졌나?

  1. R-CNN은 2000개의 영역을 뽑아내고(resion proposal) 각 영역에 대해 CNN을 돌립니다. 그러면 CNN을 2000번 돌리게 되는데 이것을 한 번으로 줄였습니다.
  2. end-to-end 학습이 가능합니다. SVM을 제거해서 한번에 학습이 가능합니다.
  3. 3개의 모델을 합쳐서 만들었습니다.(CNN, resion proposan network, fast R-CNN)

어떻게 진행되나?

다음 과정을 거칩니다.

  1. 먼저 CNN을 통과시켜 feature map을 뽑아냅니다.
  2. resion proposal network를 통과시켜 어떤 영역을 관심있게 볼 것인가 찾아냅니다.
  3. ROI pooling으로 feature map에서 관심있는 부분을 뽑아냅니다.
  4. fast R-CNN으로 해당 영역이 어떤 레이블에 속하는지 분류합니다.

CNN

이미지의 특징을 추출합니다. CNN은 논문에서 사전 훈련된 VGG-16을 사용했습니다. 이미 훈련된 모델에서 마지막 분류 쪽을 제거해서 사용합니다.

resion proposal network

어떤 이미지를 관심있게 볼 것인지 찾아내는 모델입니다. CNN은 미리 학습된 모델을 사용했지만 resion proposal network는 직접 학습을 시켜 줄 것입니다. 이 네트워크는 R-CNN의 selective search를 대신해 줄 것입니다.

selective search를 어떻게 없앴나?

selective search는 영역을 적절하게 나누어 주는 알고리즘입니다. 이번에는 anchor box를 도입해 영역을 나눠줄 것입니다.

먼저 이미지를 작은 사각형으로 나눕니다. 보기 쉬우라고 많이 크게 나누었습니다. 빨간 점은 각 사각형의 중심입니다.

근데 이대로는 모든 영역을 적절하게 나누었다고 하긴 어렵습니다. 적어도 경계 부분은 정확히 표현되지 않았을 거니까요. 그래서 각 점을 중심으로 다양한 비율, 다양한 크기로 나누어 줄 것입니다. 아래는 가운데 점을 기준으로 나누어 준 것입니다.

한 점에 대해서 9개의 영역으로 나누었습니다. 이런 점이 3*3개가 있으니 3*3*9개의 영역으로 나눈 셈입니다.

라벨링은?

3*3*9개의 영역이 있으면 이제 각 영역이 배경인지 아닌지, 어떤 라벨에 속하는지 알아야 합니다. 3*3*9개의 영역과 라벨링 한 3개의 영역과의 IOU를 구합니다. 그럼 각 영역마다 어떤 라벨과 가장 잘 겹쳐있는지, 그때의 IOU가 얼마인지 알 수 있습니다.

그럼 각 라벨마다 가장 IOU가 큰 영역과 IOU가 특정 기준 이상인 영역을 양성, IOU가 특정 기준 이하인 영역을 음성으로 해서 학습을 시킬 수 있습니다.

정확한 영역은?

다음 영역을 보죠. 초록색은 라벨링, 빨간색은 anchor box로 나온 영역입니다.

IOU는 지금 충분한 것 같습니다. 하지만 빨간 영역이 초록 영역을 잘 표현한다고 하긴 어렵습니다.이 빨간색 영역의 중심을 옮겨야 하고 너비와 높이도 조절해 줘야 합니다. 이 전에 R-CNN에서 했던 bounding box regression을 해 주는 것입니다. 다음 식을 이용해 각 빨간 영역을 얼마나 옮겨야 하는지도 학습시켜 줍니다.

ROI pooling

저희는 성공적으로 ROI(Region of Interest. 관심있는 영역)을 찾았습니다. 이전에 CNN에서 나온 결과에서 ROI에 해당하는 영역만 뽑아낸 다음 fast R-CNN으로 넘겨주면 됩니다. 하지만 ROI의 크기는 전부 다르고 크기가 다르면 모델에 넣기 어렵습니다. 이때 필요한 것이 ROI pooling입니다.

 

왼쪽은 CNN을 거쳐 나온 피쳐 맵입니다. h,w는 resion proposal network에서 찾아낸 ROI입니다. fast R-CNN의 입력이 2*2라고 하면 h, w 영역을 적당히 나눠 2*2개의 구역으로 나눕니다. 그리고 각 영역에 대해 max pooling을 합니다.

fast R-CNN

이제 영역도 알았으니 어떤 녀석인지 알아야 합니다. ROI pooling 한 각각의 영역에 대해서 해당 영역이 어떤 라벨에 속하는지, 그리고 정확한 영역이 어디인지를 알아냅니다. 사실 이 부분은 resion proposal network랑 같습니다.

각 영역에 대해 평평하게 편 다음 fully connect를 열심히 합니다. 이때, 라벨을 알아내는 k+1(라벨 종류 + 배경) 개의 출력과 위치를 나타내는 4개의 출력을 만듭니다.

 

이렇게 하면 faster R-CNN을 학습시킬 수 있습니다.