이번 포스팅에서는 two-stage detection을 수행하는 faster R-CNN에 대해서 알아보도록 하겠습니다.
two-stage object detection이란, 물체가 있다고 생각되는 구역에 바운딩 박스를 만드는 Region proposal부와, 해당 구역의 물체를 분류(classify)하는 과정이 나누어져 실행되는 방식입니다.
Faster R-CNN은 RPN(Region Proposal Network)이라고 하는 영역 감지 네트워크를 사용하는데, 이를 설명하기 전에 Faster R-CNN이 진화해온 과정을 먼저 이야기해볼 생각입니다.
모델은 R-CNN > Fast R-CNN > Faster R-CNN 순서로 발전해왔는데, 각 단계에서의 한계점과 개선점을 짚어보는 방식으로 이번 포스팅을 적어보겠습니다.
먼저 R-CNN입니다.
R-CNN structure
R-CNN 프로세스
1. Selective Search라는 외부 모듈을 사용해 region proposal을 생성한다.(Selective Search는 cpu상에서 돌아야한다.)
2. Selective Search로 얻은 2000개의 region proposal들을 ConvNet에 입력전 정해진 크기로 resizing 한다.
3. resize된 2000개의 RoI(Region of Interest)를 순차적으로 ConvNet을 통과시킨 후 각각의 region proposal에 대해 Bbox regressor로 재보정된 바운딩 박스와 SVM(Support Vector Machine)으로 다중 분류 결과를 얻는다.(softmax보다 SVM을 쓴 모델에서 정확도 측면에서 높은 성능을 보였다.)
R-CNN의 문제점
1. Selective Search 알고리즘은 cpu상에서 돌아야하므로 모델의 속도가 매우 느리다.
2. AlexNet을 그대로 사용하기 때문에 Convolution layer로 넣어주기 전 resizing 과정이 강제된다.(또한 resizing으로 인한 이미지 왜곡과 손실이 발생한다.)
3. 2000개의 Region proposal 후보를 모두 CNN에 넣어주므로 굉장히 느린 성능을 낸다.
4. 연산을 공유하지 않는 모델들(CNN, SVM, Bbox regressor)이 결합된 형태로 한 번에 학습이 불가능하다.
R-CNN은 시리즈의 가장 초기 모델로 여러가지 단점들이 존재합니다.
Fast R-CNN은 RoI풀링을 활용해 몇가지 단점들을 극복했습니다.
Fast R-CNN
Fast R-CNN 프로세스
1. Selective Search를 통해 Region proposal을 생성한다.
2. 사전 학습된 ConvNet을 통과시켜 특성 맵을 얻는다.
3. Region proposal을 얻은 특성 맵에 투영하여 RoI 풀링을 진행한다.
4. RoI 풀링을 통해 얻은 출력 텐서들은 Fully Connected layer를 거쳐 Bbox regressor와 softmax결과를 출력한다.
프로세스2. 에서 한번의 CNN 연산으로 특성맵을 얻고, 그 특성맵들 상에 region proposal들을 projection 후 RoI풀링을 진행합니다.
특성 맵에서 RoI 풀링을 통해서 나온 결과물이 ConvNet이 아닌 FC layer를 거치므로 2000번의 CNN 연산이 필요 없어졌습니다.
그렇다면 RoI 풀링은 무엇일까요? 특성 맵 위에 Region proposal들을 투영시킨 후, 그 영역을 내가 원하는 크기로 맞춰줄 수 있는 풀링 방법입니다.
그림에서 보시다시피 Selective Search를 통해 만들어진 Region proposal은 각 꼭짓점의 좌표와 길이값을 가집니다.
이 꼭짓점의 좌표와 길이값을 우리가 얻은 특성맵(그림에서는 16*16)에 맞춰 스케일링 해줍니다.
빨간색 상자가 특성 맵 위에 스케일된 박스입니다. 삐져나온 부분은 rounding(반올림)하여 정수값으로 맞춰줍니다.
그렇게 하여 얻은 초록색 부분에서 내가 원하는 사이즈로 풀링을 진행하게 됩니다.
RoI pooling
내가 3*3 크기의 출력을 원하는 경우입니다.
6개의 열은 3과 나누어 떨어지기 때문에 잘라낼 필요가 없지만, 4개의 행은 3과 나누어 떨어지지 않기 때문에 마지막행은 버려줍니다.
후에 그림처럼 max pooling을 하면 내가 원하는 크기의 특성 맵을 얻을 수 있습니다.
Fast R-CNN은 2000번의 CNN연산 반복이 필요 없고,문제점을 해결했습니다.
또한, R-CNN에서는 ConvNet 통과 전 RoI가 Bbox regressor로 들어가고, ConvNet 통과 후의 결과가 분류기로 들어가 연산을 공유하지 못하던 문제를 Fast R-CNN은 RoI 풀링 후의 출력을 Bbox regressor와 분류기로 전달하여 두 모델의 연산을 공유할 수 있게 되었습니다.
이를 통해 모델의 속도를 대폭 개선했으나 Region proposal 과정에서 Selective Search 외부 모듈을 사용하고 있다는 단점이 있습니다.
Selective Search를 사용하여 Region proposal을 얻어야 한다는 단점을 RPN(Region Proposal Network)를 통해 해결한 것이 바로 Faster R-CNN입니다.
Faster R-CNN
Faster R-CNN 프로세스
1. 사전 학습된 ConvNet을 통과시켜 특성 맵을 얻는다.
2. 얻은 특성 맵에서 RPN을 거쳐 RoI를 얻는다.
3. 얻은 RoI에 NMS를 적용한 후 특성맵에 NMS가 적용된 RoI를 투영한다.
4. RoI 풀링을 통해 얻은 출력 텐서들은 Fully Connected layer를 거쳐 Bbox regressor와 softmax결과를 출력한다.
RPN을 통해서 Region proposal을 얻는다는 것 말고는 Fast R-CNN과 동일하다고 봐도 됩니다.
이제 RPN에 대해서 알아보겠습니다.
Region proposal with RPN
pre-trained convolution을 거친 특성 맵을 3x3 윈도우로 슬라이딩합니다. 이때, 각 슬라이드 당 k개(논문에서는 9개)의 앵커 박스를 적용합니다. 𝑊×𝐻 의 특성 맵이 입력된다면 총 앵커박스의 개수는 𝑊×𝐻×𝑘개 입니다.(후에 이미지의 범위를 넘어가는 앵커박스는 제거합니다.)
그리고 물체인지 아닌지에 대한 이진 분류를 수행하는 파트와 각 앵커의 좌표값 regressor 파트로 전달됩니다. 각 파트에서 1x1 Conv를 수행합니다.
이진 분류 파트의 depth는 2×𝑘개 > (object or not)×𝑘 개 좌표값 regressor 파트의 depth는 4×𝑘개 > (x,y,w,h)×𝑘 개
슬라이드 하나 당 9개의 앵커박스 정보를 convolution한다고 보면 되는데, 이 과정을 그림으로 보면 다음과 같습니다.
sliding window로 특성을 수집
위는 3x3 윈도우 하나의 관점으로 본 그림이고, 밑은 전체를 슬라이딩 하며 나타나는 결과입니다.
RPN은 이러한 과정을 통해 Region proposal을 수행합니다.
각 앵커박스에 물체가 있는지 없는지는 groud truth와의 IoU를 계산하고, 임계값(논문에서는 0.7) 이상이면 positive labeling(1로 라벨링), 임계값 (논문에서는 0.3) 이하면 negative labeling(0으로 라벨링)하여 훈련에 사용합니다.
그 사이의 IoU를 가지는 것들은 훈련에 사용하지 않습니다.
IoU란 ground truth와 앵커박스간의 교집합영역/합집합영역 을 의미합니다. IoU(Intersection of Union)
이렇게 RPN을 거쳐 생성된 Region proposal들에 NMS(Non-Maximum Suppression)를 적용한 Region proposal들을 최종적으로 특성 맵에 Projection하게 됩니다.
NMS는 같은 객체를 탐지하는 박스 중 confidence score가 가장 높은 박스를 제외한 나머지 bounding box를 제거하는 알고리즘입니다.
이미지 출처: LearnOpenCV
NMS 알고리즘
1. 우선 일정 confidence score 이하의 bounding box는 제거한다.
2. 남은 bounding box중 confidence score가 가장 높은 박스를 기준으로 하여 해당 박스와 다른 bounding box들과의 IoU를 구한다. 이 때 IoU threshold를 정해주고 그 이상의 IoU를 가지는 박스는 같은 객체를 탐지한 박스라고 간주하여 제거한다.
3. 다음으로 confidence score가 높은 박스를 기준으로 과정 2. 를 반복한다.
RPN의 훈련을 위한 손실함수로는 물체인지 아닌지 여부와 좌표 오차를 모두 고려하는 multi loss를 사용합니다.
왼쪽 항이 이진 분류 파트에서의 error, 오른쪽 항이 좌표 regressor에서의 error 값입니다.
밸런싱 웨이트로 람다를 설정해주어 각 항 간의 균형을 맞추어줍니다.
여기까지 RPN에 대해서 알아보았습니다. 후에 이렇게 훈련한 RPN과 Fast R-CNN을 결합하여 Faster R-CNN의 전체 구조를 완성합니다.
따라서 Faster R-CNN은 더 이상 외부 모듈인 Selective Search를 사용하지 않아도 되었고, 대신 RPN을 통한 Region proposal을 활용하여 모든 모델들을 GPU상에서 구동할 수 있게 되었습니다.
Region proposal을 RPN을 통해 만들어냄으로 속도 측면에서 Faster R-CNN보다 더 우수해졌습니다.
이번 포스팅에서는 two-stage object detection에 대해서 알아보았는데요, 이번 포스팅에서 배웠듯이 two-stage detection 같은 경우 Region proposal파트와 classification 파트가 따로 존재하게 됩니다. 그러므로 one-stage detection보다 속도 측면에서는 조금 느릴지라도 더 높은 정확도를 보여주는 것이 two-stage detection의 특징입니다.