EfficientDet은 EfficientNet을 개발한 Google Brain 팀에서 쓴 논문으로 Object Detection을 위해 자신들이 개발한 EfficientNet을 Backbone으로 사용하여 설계된 모델입니다. 일반적으로 Object Detection 모델은 Accuracy와 Efficiency가 Trade-off 관계에 있기 때문에 높은 정확도와 좋은 효율을 모두 가지는 모델을 설계하기란 매우 어렵습니다. EfficientDet은 아래 두 가지 challenge를 인지하고 해결함으로써 높은 정확도와 좋은 효율, 두 마리의 토끼를 모두 잡은 모델입니다.
Challenge 1. Efficient multi-scale feature fusion
Feature Pyramid Network(FPN)는 2017년 공개된 이후 대부분의 Object Detection 연구에서 사용되고 있었습니다. 이전 포스팅에서 살펴본 One-Stage Detector의 대표격인 모델인 RetinaNet이나 YOLOv3에 FPN 구조가 적용되고, FPN 성능을 개선하고자 하는 연구들이 많이 진행이 되어왔습니다. 하지만 선행 연구들은 모두 서로 다른 input feature들을 합칠 때 단순히 크기를 맞춰 더하는 방식을 사용하고 있었습니다.
EfficientDet은 서로 다른 input feature들은 해상도가 다르기 때문에 output feature에 기여하는 정도를 다르게 가져가야 함을 주장하며, (단순히 더하면 같은 weight로 기여하게 됨) 간단하지만 효과적인 weighted bi-directional FPN(BiFPN) 구조를 제안하였습니다. 이 구조를 사용하면 서로 다른 input feature들의 중요성을 학습을 통해 배울 수 있으며, 이를 통해 성능을 많이 향상시킬 수 있었습니다.
Challenge 2. Model scaling
EfficientNet에서 제안한 Compound Scaling 기법은 모델의 크기와 연산량를 결정하는 요소들(input resolution, depth, width)을 동시에 고려하여 증가시키는 방법을 의미하며, 이 방법을 통해 높은 성능을 달성할 수 있었습니다. 이러한 아이디어를 Object Detection에도 적용을 할 수 있으며, backbone, feature network, box/class prediction network 등 모든 곳에 이 기법을 적용함으로써 성능을 향상시켰습니다.
즉 EfficientDet은 FPN을 발전시킨 BiFPN과 EfficientNet에서 사용된 Compound Scaling 기법을 전체 네트워크 모델에 적용함으로써 다른 모델들보다 높은 정확도와 좋은 효율을 가질 수 있었습니다. 그럼 각각에 대해 자세히 살펴보도록 하겠습니다.
BiFPN
BiFPN은 Cross Scale Connections과 Weighted Feature Fusion을 사용해 효율적으로 feature 정보들을 합치게 됩니다.
Cross Scale Connections
Cross Scale Connections이란 말 그대로 다양한 해상도의 feature map들을 합치는 것을 의미합니다. 그러면 BiFPN은 어떤 방식으로 feature map들을 합치는지 살펴봅시다.
RetinaNet에서 처음으로 FPN이 사용되어 성능을 높인 이후 성능을 더욱 높이고자 아래와 같이 FPN에 대한 연구는 활발히 진행되었습니다.
(a)는 우리가 아는 전통적인 FPN 방식으로 bottom up과 top down 방식으로 추출된, 서로 다른 해상도 정보를 가지는 feature map들을 lateral connection으로 연결하는 방식입니다. 이전에 설명드린 YOLOv3과 RetinaNet에서도 이 구조를 사용하였죠.
(b) PANet은 High-level feature map도 Low-level feature map의 특성을 얻기 위해서 추가적으로 bottom-up pathway를 FPN에 추가하는 방식입니다. 또한 PANet은 Instance Segmentation 모델인 Mask R-CNN에서 사용되는 방식이기도 하죠.
(c) NAS-FPN은 강화학습으로 최적의 FPN feature map을 만드는 방식입니다. 성능은 좋게 나오지만 학습하는데 수천 시간이 걸릴 정도로 너무 많은 GPU time을 필요로 하며 학습 결과대로 서로 다른 feature map이 합쳐지기 때문에 규칙성이 없어 수정하기 어렵다는 단점이 있습니다.
논문의 저자는 PANet이 FPN과 NAS-FPN보다 좋은 성능을 보인다는 것을 발견하고 PANet을 기반으로 아래 3가지의 수정과 개선을 통해서 BiFPN 구조를 만들었습니다.
- 하나의 input edge만을 가지는 node들은 기여도가 적을 것이기 때문에 삭제
- 많은 cost를 사용하지 않으면서 더욱 많은 정보를 전달하기 위해 같은 level에 있는 input node와 output node를 연결하는 추가적인 edge 설치
- 더 높은 수준의 feature fusion을 가능하도록 하나의 bidirectional path (하나의 top-down과 bottom-up path)를 가지는 PANet과 다르게, 이 bidirectional path를 하나의 feature network layer로 생각하여, 같은 layer를 여러번 반복 (repeated blocks)
Weighted Feature Fusion
일반적으로 FPN에서 서로 다른 resolution(feature map size)의 feature map을 합칠 때 feature map의 사이즈를 sampling을 통해 맞춘 후 더해주는 방식을 사용합니다. 이는 어떤 feature map이든 같은 weight를 적용하여 더하는 것과 마찬가지인 것입니다. 하지만 Input feature map들은 Output feature map을 생성하는 기여도가 다르기 때문에 이 논문에서는 각 Input fearue map 별로 서로 다른 가중치를 부여한 후 합쳐 Output feature map을 생성합니다. 이 때 가중치는 정해진 값이 아니라 모두 학습 시켜서 도출된 값입니다. 논문에서 고려한 가중치를 부여하는 방식은 총 3가지로 아래와 같습니다.
1. Unbounded fusion
식 그대로 각 입력 feature map에 가중치 $w_i$를 곱하고 합쳐 출력 feature map을 생성합니다. 하지만 말 그대로 unbounded(제한이 없다)되어 있기 때문에 학습에 불안전성을 유발할 수 있고 결과가 이상하게 나올 수 있다고 합니다.
2. SoftMax-based fusion
Softmax fusion은 익순한 Softmax 함수를 적용하여 가중치의 합이 1이 되도록 각각의 값을 0에서 1로 값을 변환하여 sum을 해주는 방식입니다. 성능은 괜찮지만 실제로 gpu에서 연산을 시도하면 속도를 많이 떨어뜨리는 요인이 된다고 합니다.
3. Fast normalized fusion
그래서 논문에서는 최종적으로 Fast normalized fusion 방식을 제안하였습니다. 우선 weight들은 ReLU를 거치기 때문에 non-zero임이 보장이 되고, 분모가 0이 되는 것을 막기 위해 0.0001 크기의 입실론(ε)을 넣어주었습니다. Weight 값이 0~1사이로 normalize가 되는 것은 SoftMax와 유사하며 성능에 있어서는 softmax based fusion과 거의 비슷하지만 속도면에서 30퍼센트 정도 빨라서 이 방법을 사용했다고 합니다.
종합적으로 하나의 그림으로 정리하면 다음과 같습니다.
Compound Scaling
앞서 설명했듯이 EfficientDet은 Backbone으로 EfficientNet을 사용하며, 현재 설명하려는 Compound Scaling 또한 EfficientNet에 이미 적용된 기법이기 때문에 EfficientNet에 대한 간단한 이해가 필요합니다.
EfficientNet
EfficientNet 이전의 detector 모델들은 모델의 성능을 향상시키기 위해서 baseline detector를 scaling하는 연구가 많이 진행되었습니다. 보통 Backbone network의 깊이를 키우거나 input 이미지 크기(resolution)를 키우거나, feature channel size를 키우거나, feature network를 반복하는 등의 방식이 사용되었으나 이러한 scaling 방법론들은 하나의 dimension에만 집중하였습니다.
EfficientNet은 위 그림과 같이 네트워크의 width, depth, input image resolution의 세 가지 scaling factor를 독립적이지 않고, 함께 최적으로 scaling하여 모델 성능을 극대화시키는 Compound Scaling 기법을 제안하였습니다.
위 그림과 같이 width, depth, image resolution을 무조건 크게만 한디고 성능이 계속 좋아지는 것은 아닙니다. Width, Depth를 일정 수준 이상 늘려도 성능 향상이 미비한 구간을 볼 수 있으며 ImageNet 데이터세트 기준 80% 정확도에서 개별 Scaling 요소를 증가 시키더라도 성능 향상이 어려운 것을 확인할 수 있습니다. 오히려 FLOPS 수는 계속 상승하여 파라미터 개수가 많아져 검출 속도가 느려질 수도 있습니다. 따라서 EfficientNet은 depth, width, resolution에 따른 FLOPS 변화를 기반으로 아래와 같이 최적 식을 도출하여 depth, width, resolution을 결정해줍니다.
우선 depth, width, resolution 은 각각 $\alpha, \beta, \gamma$로 나타내며 각각의 비율은 4번째 줄의 $\alpha$ x $\beta^2$ x $\gamma^2 \approx 2$ 조건을 만족시켜야 합니다. 이 때 width와 resolution에 제곱이 들어간 이유는 depth는 2배 키워주면 FLOPS도 linear하게 2배 증가하지만, width와 resolution은 가로와 세로가 각각 곱해지기 때문에 제곱 배가 증가하기 때문입니다. 그 뒤 전체 모델의 사이즈는 $\alpha, \beta, \gamma$에 똑같은 $\phi$만큼 제곱하여 조절을 하게 됩니다.
EfficientNet의 $\alpha, \beta, \gamma$ 값은 간단한 grid search를 통해 구하는 방식을 제안하고 있으며, 먼저 처음 단계에서는 $\phi$를 1로 고정한 뒤, 타겟 데이터셋에서 좋은 성능을 보이는 $\alpha, \beta, \gamma$ 값을 찾아냅니다. EfficientNetB0의 경우 $\alpha = 1.2 , \beta = 1.1 , \gamma = 1.15$로 설정됩니다. 이후 이 값들을 고정하고 $\phi$값을 증가 시켜가면 EfficientB1~ B7까지의 $\alpha, \beta, \gamma$ 값을 설정해줍니다. 아래 그림은 EfficientNetB0~B7까지의 설정된 depth, width, resolution 값들입니다.
EfficientDet에서의 Compound Scaling
그럼 이제 EfficientDet에 적용된 Compound Scaling을 살펴봅시다. 먼저 아래의 EfficientDet 모델의 전체 구조입니다.
Backbone으로 EfficientNet을 사용하며 이후 도출된 level 3~7까지의 feature map {P3, P4, P5, P6, P7}은 top-down과 bottom-up bidirectional feature fusion을 반복적으로 적용하는 BiFPN을 통과합니다. 이후 Output feature map은 class와 bounding box network의 input으로 사용되어 object class와 box를 예측하게 됩니다.
EfficientDet은 Compound Scaling을 사용하여 위 EfficientDet 구조의 Backbone, BiFPN, Prediction Layer 그리고 Input image resolution을 최적 결합하여 EfficientD0 ~D7까지의 모델을 구성합니다. 각각의 결합 방식 및 모델 구성은 다음과 같습니다.
- Backbone network
EfficientNet B0~B6로 EfficientNet의 Scaling 요소가 그대로 적용됨
- BiFPN network
Depth - Repetition block이 몇 번 반복되는지에 대한 요소
기본 반복 block을 3개로 설정하고 아래 식을 따라 Scaling이 적용됨$$D_{bifpn} = 3 + \phi$$ Width - 채널 수 {1.2, 1.25, 1.3, 1.35, 1.4, 1.45} 중 Grid Search를 통해서 1.35로 Scaling 계수를 선택하고 이를 기반으로 아래 식으로 Scaling 적용.$$W_{bifpn} = 64 \times (1.35)^\phi$$
- Prediction Network
Depth의 경우 아래 식이 적용됨 $$D_{box} = D_{class} = 3 + \left \lfloor \phi / 3 \right \rfloor$$
- 입력 이미지 크기(Input image resolution)
$$R_{input} = 512 + \phi \times 128$$
아래 표는 위의 Scaling 식이 적용된 EfficientDet의 D0 ~ D7x까지의 Scaling 값들입니다. $\phi$ 값에 따라서 D0($\phi$ = 0)부터 D7($\phi$ = 7)까지 개발됐으며 D7x는 D7과 같은 BiFPN과 head를 가지지만 EfficientNetB7 Backbone과 하나 더 많은 feature level (P3에서 P8)을 사용합니다.
이렇게 EfficientDet은 BiFPN, EfficientNet Backbone 사용 그리고 Compound Scaling 기법을 적용함으로써 적은 연산 수, 적은 파라미터 수에 비해 상대적으로 타 모델보다 높은 모델 예측 성능을 나타낼 수 있었습니다. 아래 표을 보면 알 수 있듯이 EfficientDet-D0 기준 YOLOv3보다 FLOP 수가 28배나 적으면서도 detect 성능은 더 좋거나 비슷한 것을 확인할 수 있습니다.
다른 detection 모델에 비해 mAP 성능도 좋을 뿐더러 parameter 수가 압도적으로 적은 것도 확인할 수 있습니다. 또한 단순히 FLOPS가 적다고 해서 항상 Inference Latency(지연도)가 적다는 보장은 없는데, 실제 CPU와 GPU의 Inference Latency를 보여주면서 Latency가 낮아 빠르게 동작할 수 있음을 알 수 있습니다.
Reference
'Perception > Object Detection' 카테고리의 다른 글
[Object Detection] YOLOv3: An Incremental Improvement (0) | 2024.04.06 |
---|---|
[Object Detection] YOLOv2 (YOLO9000:Better, Faster, Stronger) (0) | 2024.03.29 |
[Object Detection] YOLOv1 (You Only Look Once:Unified, Real-Time Object Detection) (0) | 2024.03.19 |
[Object Detection] SSD(Single Shot Multibox Detector) (1) | 2023.07.12 |
[Object Detection] Faster R-CNN (0) | 2023.07.01 |