이번 포스트에서는 FPN이라는 Network에 대해 정리해보고자 합니다.
우선, FPN에 대한 논문은 다음과 같습니다.
이미지에 포함되어 있는 다양한 크기의 객체를 인식하는 것은 Object Detection Task의 핵심 문제입니다. DL Model이 Object의 Scale에 관계없이 객체를 Detection 할 수 있도록 다양한 방법을 사용해 왔지만 기존의 방식을 사용하면 Model의 추론 속도가 너무 느려지고 메모리를 지나치게 많이 사용하는 문제가 발생되어 왔죠.
FPN(= Feature Pyramid Network)을 통해 Computing 자원을 적게 사용하면서 다양한 크기의 Object를 인식할 수 있습니다. 대략적인 FPN의 과정은 다음과 같습니다.
- Botton-up Pathway
원본 이미지를 Convolution Network에 입력하여 Forward Pass를 수행하고 각 Stage마다 서로 다른 Scale을 가지는 4개의 Feature Map을 추출합니다.
- Top-down Pathway
각 Feature Map에 1x1 Conv 연산을 적용하여 모두 256 Channel을 가지도록 Upsampling을 수행합니다.
- Lateral Connections
Pyramid Level 바로 아래 있는 Feature Map과 Element-wise Addition 연산을 수행합니다. 이를 통해 얻은 4개의 서로 다른 Feature Map에 3x3 Conv 연산을 적용합니다.
Pyramid
FPN 논문에서 “Pyramid”라는 단어는 자주 등장합니다. Pyramid는 Convolutional Network에서 얻을 수 있는 서로 다른 해상도의 Feature Map을 쌓아 올린 형태입니다. Level은 Pyramid의 각 층에 해당하는 Feature Map입니다. 그림으로 표현하면 다음과 같습니다.
Feature Map의 해상도와 각각 보유하고 있는 Representation의 관계에 대해 설명하면 다음과 같습니다.
Convolutional Network에서 더 얕은, 입력 층에 보다 가까울수록 Feature Map은 높은 해상도(= High Resolution)를 가지며 가장자리, 곡선 등과 같은 Low-Level Feature을 보유하고 있습니다.
반대로 더 깊은 Layer에서 얻을 수 있는 Feature Map은 낮은 해상도(= Low Resolution)를 가지며, 질감과 물체의 일부분 등 Class를 추론할 수 있는 High-Level Feature을 가지고 있습니다.
Object Detection Model은 Pyramid의 각 Level의 Feature Map을 일부, 혹은 전부 사용하여 예측을 수행합니다.
기존의 방식들
과거, 다양한 크기의 객체를 Detection 하도록 Model을 학습시키기 위한 다양한 시도들이 있었습니다. 몇 가지 방식은 다음과 같습니다.
- (a) Featurized image pyramid
입력 이미지의 크기를 Resize 하여 다양한 Scale의 이미지를 Network에 입력하는 방법입니다.
Overfit Model 학습 시 해당 방법을 사용했으며, 다양한 크기의 객체를 포착하는데 좋은 결과를 보여주었습니다. 그러나 이미지 한 장을 독립적으로 Model에 입력하여 Feature map을 생성하기 때문에 추론 속도가 매우 느리며 메모리를 지나치게 많이 사용하는 문제점이 있습니다.
- (b) Single feature map
단일 Scale의 입력 이미지를 네트워크에 입력하여 단일 Scale의 Feature map을 통해 Object Detection을 수행하는 방법입니다.
YOLO v1 Model 학습 시 해당 방법을 사용했는데, 학습 및 추론의 속도가 매우 빠르다는 장점이 있지만 성능이 떨어진다는 단점이 있습니다.
- (c) Pyramid feature hierarchy
네트워크에서 미리 지정한 Conv Layer마다 Feature Map을 추출하여 Detection 하는 방법입니다.
SSD Model 학습 시 해당 방법을 사용했습니다. Multi-Scale feature Map을 사용하기 때문에 성능이 높다는 장점이 있지만 Feature Map 간 해상도 차이로 인해 학습하는 representation에서 차이가 나는 Semantic Gap이 발생한다는 문제가 있습니다. Model이 얕은 Layer에서 추출한 Feature Map에서 Low-Level Feature까지 학습하면 representational capacity를 손상시켜 객체 인식률이 낮아진다고 합니다.
SSD는 이 문제를 해결하기 위해 Low-Level Feature를 사용하지 않고 전체 Convolutional Network 중간 지점부터 Feature Map을 추출하였으나 FPN 논문 저자는 높은 해상도의 Feature Map은 작은 객체를 Detection 할 때 유용하기 때문에 이를 사용하지 않는 것은 적절하지 않다고 합니다.
- (d) Feature Pyramid Network
FPN에서 제안하는 구조입니다. 해당 부분에 대한 내용은 아래에서 자세히 다루도록 하겠습니다.
Feature Pyramid Network
임의의 크기의 Single-Scale 이미지를 Convolutional Network에 입력하여 다양한 Scale의 Feature Map을 출력하는 Network입니다. FPN은 완전히 새롭게 설계된 Model이 아니라 기존 Convolutional Network에서, 지정한 Layer별로 Feature Map을 추출하여 수정하는 Network죠.
FPN 논문에서는 Model로는 ResNet을 사용하였습니다. 전반적인 과정은 다음과 같습니다.
FPN이 Feature Map을 추출하여 Pyramid를 건축하는 과정은 앞서 간략히 설명했듯이 Botton-up Pathway, Top-down Pathway, Lateral Connections에 따라 진행됩니다. 각각에 대한 자세한 내용은 다음과 같습니다.
- Botton-up Pathway
이미지를 Convolutional Network에 입력하여 Forward Pass 하여 2배씩 작아지는 Featrue Map을 추출하는 과정입니다. 이때 각 Stage는 마지막 Layer의 Output Feature Map을 추출합니다. 그림으로 표현하면 다음과 같습니다.
Network에는 같은 크기의 Feature Map을 출력하는 Layer가 많지만 논문에서는 이러한 Layer를 모두 같은 Stage에 속해 있다고 정의합니다. 각 Stage에서 마지막 Layer를 Pyramid Level로 지정하는 이유는 더 깊은 Layer일수록 더 강력한 Feature를 보유하고 있기 때문입니다.
ResNet의 경우 각 Stage의 마지막 Residual Block의 Output Feature Map을 활용하여 Feature Pyramid를 구성하며 각 Output을 {c2, c3, c4, c5}라고 지정한다. 이는 conv2, conv3, conv4, conv5의 Output Feature Map임을 의미하며, 각각 {4, 8, 16, 32} Stride를 가지고 있습니다. 여기서 {c2, c3, c4, c5}은 각각 원본 이미지의 1/4, 1/8, 1/16, 1/32 크기를 가진 Feature Map입니다. conv1의 Output Feature Map은 너무 많은 메모리를 차지하기 때문에 피라미드에서 제외되었다고 합니다.
- Top-down Pathway & Lateral Connections
각 Pyramid Level에 있는 Feature Map을 2배로 Upsampling 하고 Channel 수를 동일하게 맞춰주는 과정입니다. 각 Pyramid Level의 Feature Map을 2배로 Upsampling 해주게 되면 바로 아래 Level의 Feature Map과 크기가 같아집니다. 이때 다음과 같은 Nearest neighbor Upsampling 방식을 사용합니다.
이후, 모든 Pyramid Level의 Feature Map에 1x1 Conv 연산을 적용하여 Channel을 256으로 맞춥니다. 그다음 Upsampling 된 Feature Map과 바로 아래 Level의 Feature Map과 Element-wise Addition 연산을 하는 Lateral Connections 과정을 수행합니다. 이후, 각각의 Feature Map에 3x3 Conv 연산을 적용하여 얻은 Feature Map을 각각 {p2, p3, p4, p5}라고 합니다. 이는 각각 {c2, c3, c4, c5} Feature Map의 크기와 같습니다. 가장 높은 Level에 있는 Feature Map c2의 경우 1x1 Conv 연산 후 그대로 출력하여 p2를 얻게 됩니다.
앞서 설명한 Top-down Pathway와 Lateral Connections의 전반적인 과정을 표현하면 다음과 같습니다.
이와 같은 과정을 통해 FPN은 Single-Scale 이미지를 입력하여 4개의 서로 다른 Scale을 가진 Feature Map을 얻게 됩니다. 단일 크기의 이미지를 Model에 입력하기 때문에 앞서 언급한 기존의 방식 (a) Featurized image pyramid에 비해 빠르고 메모리를 덜 차지하게 됩니다. 또한 Multi-Scale Feature Map을 출력하기 때문에 (b) Single feature map 방식보다 더 높은 Detection 성능을 보입니다.
Detection task 시 고해상도 Feature map은 Low-Level Feature를 가지지만 객체의 위치에 대한 정보는 상대적으로 정확하게 보존하고 있습니다. 이는 저해상도 Feature Map에 비해 Downsample 된 수가 적기 때문입니다. 이러한 고해상도 Feature Map의 특징을 Element-wise Addition을 통해 저해상도 Feature Map에 전달하기 때문에 (c) Pyramid feature hierarchy에 비해 작은 객체를 더 잘 Detect 합니다.
이렇게 FPN에 대해 알아보았습니다.
여러 Model들을 정리하면서 느끼는 것은 Model 구조 자체의 설계도 중요하지만, Feature를 추출하거나 Loss Fuction을 변형하거나 하는 등의 일부 튜닝 과정이 더 중요할 수도 있겠다는 생각을 해보았습니다.
이번 포스트는 여기서 마무리하도록 하겠습니다.
'Programming > Deep Learning Network' 카테고리의 다른 글
[Model] YOLO v1 (0) | 2023.02.23 |
---|---|
[Model] R-CNN (0) | 2023.02.23 |
[Model] RetinaNet (0) | 2023.02.22 |
[Model] MobileNet v1 (0) | 2023.02.21 |
[Model] Grad-CAM (1) | 2023.02.15 |
댓글