☞ 문서의 내용은 가장 하단 참고문헌 및 사이트를 참고하여 필자가 보기 쉽도록 정리한 내용입니다.
☞ 틀린 내용 및 저작권 관련 문의가 있는 경우 문의하시면 수정 및 삭제 조치하겠습니다.
이미지에 존재하는 다양한 Object를 인식하는 것은 Object Detection의 핵심적인 문제이다. 이전 네트워크에서는 다양한 크기의 물체를 탐지하기 위해 크기를 resize하며 물체를 찾았다. 이런 작업은 메모리와 시간적 측면에서 매우 비효울적이다. 이에 본 논문에서는 FPN을 통해 컴퓨팅 자원을 적게 차지하면서 다양한 크기의 객체를 인식하는 방법을 제안한다. Object Detection 분야에서 영향력이 큰 논문이다.
Feature Pyramid
FPN을 살펴보기 전에 기존의 모델들이 어떻게 생겼는지에 대한 간단한 소개와 모델들의 한계를 설명한다.
(a) Input Image의 크기를 다양하게 resize하고 이미지 네트워크에 입력하는 방법이다. 다양한 크기의 객체를 포착하는데 좋은 결과를 보여준다. 하지만 연산량이 많아 추론 속도가 매우 느리며, 메모리를 굉장히 많이 사용한다. 때문에 현실에서 사용하기 어렵다.
(b) Input image를 네트워크에 입력하여 최종 단계의 feature map에서 object detectiond을 수행하는 기법이다. yolo v1이 이러한 기법을 사용한다. multi scale을 사용하지 않고 한번에 특징을 압축하여 마지막에 압축된 특징만을 사용하기 때문에 (a)보다 연산량은 작지만 성능이 떨어지는 단점이 있다.
(c)는 CNN 신경망을 통과하는 중간 과정에 생성되는 feature map 각각에 Object Detection을 수행하는 기법이다. SSD가 이러한 기법에 속하며 해당 기법은 작은 물체에 대한 정보를 살리면서 Object Detection을 수행할 수 있지만 상위 레이어에서 얻게 되는 추상화 된 정보를 활용하지 못하는 단점이 있다.
모델이 얕은 layer에서 추출한 feature map에서 저수준 특징(low-level feature)까지 학습하면 representational capacity를 손상시켜 객체 인식률이 낮아진다. SSD는 문제를 해결하기 위해 low-level feature를 사용하지 않고, 전체 convolutional network 중간 지점부터 feature map을 추출한다. 하지만 FPN논문의 저자는 높은 해상도의 feature map은 작은 객체를 detect할 때 유용하기 때문에 이를 사용하지 않는 것이 적절하지 않다고 지적한다.
*representational capacity 는 머신러닝 모델의 flexibility, 즉 실제 데이터의 적응력 정도를 의미한다.
Pyramid
pyramid는 convolutional network에서 얻을 수 있는 서로 다른 해상도의 feature map을 쌓아올린 형태라고 생각하면 된다. 그리고 level은 피라미드의 각 층에 해당하는 feature map이다. Convolutional network에서 더 얕은, 즉 입력층에 보다 가까울 수록 feature map은 높은 해상도(high resolution)을 가지며, 가장자리 곡선 등과 같은 저수준 특징(low-level feature)을 보유하고 있다. 반대로 더 깊은 layer에서 얻을 수 있는 feature map은 낮은 해상도(low resolution)을 가지며, 질감과 물체의 일부분 등 class를 추론할 수 있는 고수준 특징(high level feature)을 가지고 있다. Object Detection 모델은 Pyramid의 각 level의 feature map을 일부 혹은 전부 사용하여 예측을 수행한다.
Feature Pyramid Network
FPN(Feature Pyramid Network)는 single-scale 이미지를 convolutional network에 입력하여 다양한 scale의 feature map을 출력하는 네트워크이다. 논문에서는 ResNet을 사용한다. FPN의 Architecture를 자세히 보면 아래 그림과 같다. 논문에서 Architecture를 Bottom-up patway와 top-down pathway로 나눠 설명한다. 그림에서도 볼 수 있듯이 bottom-up은 resolution을 줄여가며 feature를 얻는 forward과정이고, top-down은 low resolution이지만 feature를 다시 원래 resolution으로 내려주면서 기존의 feature와 결합한다.
Bottom-up pathway
Bottom-up pathway 과정은 Image를 convolutional network에 입력하여 2배씩 작아지는 feature map을 추출하는 과정이다. 이 때 각 stage의 마지막 layer의 output feature map을 추출한다. 네트워크에는 같은 크기의 feature map을 출력하는 layer가 많지만 논문에서는 이러한 layer를 모두 같은 stage에 속해있다고 정의한다. 각 stage별로 마지막 layer를 pyramid level로 지정하는 이유는 더 깊은 layer일수록 더 강력한 feature를 보유하고 있기 때문이다.
ResNet의 경우 각 stage의 마지막 residual block의 output feature map을 활용하여 feature pyramid를 구성하며 각 output을 {c5,c4,c3,c2}라고 지정한다. 이는 conv4, conv6, conv8, conv10의 output feature map임을 의미하며, 각각 {4,8,16,32} strid를 가지고 있다. 여기서 {c5,c4,c3,c2} 은 각가 원본 이미지의 1/4, 1/8, 1/16, 1/32 크기를 가진 feature map이다. conv2의 output feature map의 경우 너무 많은 메모리를 차지하여 제외했다.
Top- down patway and Lateral connections
Top-down pathway는 각 Pyramid level에 있는 Feature map을 2배로 Upsampling하고 Cahnnel 수를 동일하게 맞춰주는 과정이다. 각 pyramid level의 feature map을 2배로 upsampling 해주면 바로 아래 level의 feature map과 크기가 같아진다. 가령C2는 C3와 크기가 같아진다. 이 때 nearset neighbor upsaimg 방식을 사용한다. 이후 모든 pyramid level의 feature map에 1x1 conv 연산을 적용하여 channel을 256으로 맞춘다.
Nearest Neighbor는 Dense 데이터를 그대로 늘려서, 빈 구역에 채워 넣는 방법이다. upsamling에도 다양한 기법들이 있지만 저자들은 단순함을 위해 위 기법을 채택했다고 한다.
그 다음 upsample된 feature map과 바로 아래 level의 feature map과 element-wise addition 연산을 하는 Lateral connections 과정을 수행한다. 이후 각각의 feature map에 3x3 conv 연산을 적용하여 feature map을 얻는다. 이때 얻은 feature map은 각각 {p2,p3,p4,p5}이다. 이는 각각 {c2,c3,c4,c5} feature map의 크기와 같다. 가장 높은 level에 있는 feature map c2의 경우 1x1 conv 연산 후 그대로 출력하여 p2를 얻는다. 이 과정을 통해 4개의 서로 다른 Scale을 가진 Feature map을 얻는다.
Training ResNet + Faster R-CNN with FPN
논문에서는 ResNet을 backbone network로 사용하는 Faster R-CNN에 FPN을 적용하여 학습시키는 과정을 설명한다.
Build Feature Pyramid by FPN
먼저 ResNet 기반의 FPN에 이미지를 입력한 후 Bottom-up pathway을 거쳐 원본 이미지의 1/4, 1/8, 1/16, 1/32 크기에 해당하는 feature map {c5,c4,c3,c2}을 출력한다. 이후 Top-down pathway과정을 통해 1x1 conv 연산을 적용하여 모든 feature map {c5,c4,c3,c2}를 출력한다. 이후 Top-down path way과정을 통해 1x1 conv 연산을 적용하여 모든 featrue map의 channel 수를 256으로 맞춰주고 크기를 2배로 upsapmling 해준다. 마지막으로 Lateral connections을 통해 각 feature map을 바로 아래 pyramid level에 존재하는 feature map과 element-wise addtion 연산을 수행한다. 이후 3x3 conv 연산을 수행하여 {c5,c4,c3,c2} feature map을 출력한다. 앞의 과정을 통해 얻은 feature pyramid {c5,c4,c3,c2}는 RPN와 ROI pooling시 사용된다.
Class score and Bounding box by RPN
앞선 과정에서 얻은 feature map {c5,c4,c3,c2}를 RPN에 입력한다. 이 때 각 feature map을 위의 그림과 같이 개별적으로 RPN에 입력하여 각각의 class score와 bounding box regressor를 출력한다. 이후 Non Maximum suppression 알고리즘을 적용하여 class score가 높은 상위 1000개의 region proposal만을 출력한다.
Max pooling by RoI pooling
앞선 과정에서 얻은 1000개의 region proposals를 사용하여 ROI pooling을 수행한다. Fast R-CNN은 single-scale feature map만을 사용한 반면, FPN을 적용한 Faster R-CNN은 multi-scale feature map을 사용하기 때문 region proposals를 어떤 scale의 feature map과 매칭시킬지를 결정해야 한다.
여기서 k는 피쳐 맵의 번호입니다. 224란 크기는 pretrained model이 224x224 크기의 이미지를 학습한 것에서 따왔습니다. k0는 224x224 크기의 ROI가 들어왔을 때 몇 번째 피쳐맵에 사상시킬 것인지를 결정하는 수이며, 논문에서는 4로 설정되었습니다. 만약 512x512 크기의 RoI가 입력으로 들어왔다면 4+log2(2.28) = 5.11로 P5에 사상됩니다. 이를 시각화하면 아래와 같습니다.
참고문헌