조금 복잡한 학습과정과 레이어들로 꼬인 문제를 해결해보자! 글은 링크 를 바탕으로 정리되었다.
지금부터 정리해볼 Faster RCNN의 기본 구조도이다. 구조도 자체가 다른 그림보다 (레이어 기반으로) 복잡하게 설명되어 있지만, 이 그림에서 각 레이어와 결과값, 인풋 아웃풋 사이즈를 잘 설명할 수 있으면 Faster RCNN도 대부분 잘 이해했다고 할 수 있을 거 같아 들고왔다.
pretrained 된 VGG16 모델에 원본 이미지를 입력하여 피처맵을 얻는 과정이다. 이렇게 하나의 이미지에 대해 피처맵을 얻는다는 것은, 그 이미지를 추상화하여 핵심적인 정보만을 도출한다는 것과 같다. subsampling ratio를 1/16이라고 했을 때
Anchor generation layer, 는 말그대로 앵커를 만들어내는 레이어이다. 기존에 학습할 땐 앵커는 그냥 빈 값의 네모 공간이라 배웠는데 무엇을 만든다는거지? 할 수 있지만.. 구현의 관점에서 보았을 땐 결국 레이어 하나를 추가하여서 앵커를 만들어줘야 한다. 이때 앵커의 적용은 원본 이미지가 아닌 피처맵에 적용된다는 점을 기억하자. 앵커의 수는 그리드 셀의 수와 같으며, 원본 이미지의 크기에 sub-sampling ratio 를 곱한만큼의 수와 같다. 또한 각 셀마다 9개의 앵커 박스를 만든다. 이전에 sub-sampling ratio를 1/16이라 했으므로 800/16인 가로 세로 50짜리 그리드 셀이 만들어진다.
그다음으로 해야할 일은 이전에 만든 22500의 앵커박스 중 RPN을 어떤 것으로 훈련시킬 지 앵커를 선택하는 일이다. 앵커박스 중 1. 원본이미지의 경계를 벗어나지 말아야 하며 2. positive/negative 데이터를 샘플링해준다. 이때 positive 란 객체가 존재하는 FG(foreground), negative 란 객체가 존재하지 않는 background 이다. positive 라고 판단하는 기준은 앵커박스와 GT의 IOU가 0.7 이상인 경우, negative 라고 판단하는 경우는 앵커박스와 GT의 IOU가 0.3 이하인 경우이다. 이 사이에 해당하지 않는 앵커박스들은, 버린다.
이전 모델들과의 차이가 되는 지점으로써, RPN 은 피처맵을 입력받아 class score, boundingbox regression 을 반환한다. 이전에 SS와 거의 같은 역할인데, 이를 neural network 로 구성해 GPU 연산이 가능하게 했다는 점에서 의의가 있다.
최종적으로 2,3 에서 만든 앵커와 4에서 예측한 RPN을 바탕으로 region proposal 을 추출하는 작업이다. 이때는 Non maximum suppression 을 적용하여 부적절한 객체를 제거하는 과정을 거친다. 그 후 4에서 추출한 정보를 이용하는데, class score 을 이용해서는 N개의 anchor box 를 확정하고, regression 정보를 이용해서는 앵커박스의 위치를 조정한다.
이전에 했던 샘플 선택은 RPN이 학습하는데 사용할 앵커에 대한 선택이었고, 지금하는 선택은 Fast RCNN 모델 전체가 학습하는데 사용할 유용한 샘플을 선택하는 것이다. 이때 샘플이란 class 정보 (긍정, 부정) 값과 regression 정보값 (x, y, w, h) 이 모두 포함된 샘플일 것이다. region proposal 제안들이 들어오면 GT box 와의 IOU를 계산하여, 0.1~0.5 사이이면 부정, 0.5 이상이면 긍정으로 라벨된다.
다음은 각각의 proposal 을 사용하여 ROI pooling 을 수행해줄 차례다. ROI는 projection 시 크기를 일정하게 유지하기 위해 수행하는 것이며, 따라서 output 은 고정크기의 피처맵이다.
피처맵을 FC layer 에 입력하고, 고정크기의 피처벡터를 얻는다. 벡터를 분류 문제와 회귀 문제 레이어에 모두 입력하여 K+1, (K+1) X 4 의 피처벡터를 출력하고, loss 를 계산하고, Fast RCNN 모델을 학습시킨다.