RetinaNet은 2017년도 FaceBook AI Research 팀에 의해 개발되었으며 YOLOv3보다 먼저 나온 모델입니다. 당시 One-stage detector는 빠른 detect 속도는 인정받았지만 Faster R-CNN보다 detection 정확도는 떨어진다는 인식이 있었습니다. RetinaNet은 One-stage detector의 빠른 detection 속도의 장점을 가지면서 (SSD나 YOLO보다는 떨어짐) One-stage detector의 detection 성능 저하 문제를 개선시켰습니다. 특히 다른 One-stage detector보다 작은 Object에 대한 detection 성능이 뛰어났는데, 이렇게 detect 성능을 높인 RetinaNet의 2가지 특징이 바로 Focal Loss라는 Cross Entropy를 대체한 새로운 Loss 함수와 Feature Pyramid Network입니다. 그럼 이 2가지 특징과 함께 RetinaNet을 살펴보도록 하겠습니다.
Focal Loss
Focal Loss는 one-stage detector 학습 시에 존재하는 Foreground와 Background class 간의 Class Imbalance 문제를 해결하기 위해 고안된 새로운 Loss 함수입니다.
Object detection 모델은 이미지 내의 객체의 영역을 추정하고 IoU threshold에 따라 positive/negative sample로 구분한 후, 이를 활용하여 학습합니다. 하지만 아래 그림과 같이 일반적으로 이미지 내 검출하려는 객체의 수는 한정되어 있기 때문에 positive sample(객체 영역)은 negative sample(배경 영역)에 비해 매우 적습니다. 이로 인해 positive/negative sample 사이에 큰 차이가 생겨 Class Imbalance 문제가 발생합니다.
Easy(Background=Negative) Example: 찾기 쉬운 대상들. Background나 크고 선명한 대상 오브젝트. 이미 높은 예측 확률을 가지고 있음.
Hard(Foreground=Positive) Example: 찾기 어려운 대상들. 작고 형태가 불분명하여 낮은 예측 확률을 가지고 있음
이렇게 easy example이 많고 hard example이 적은 Class Imbalance 이슈는 object detection이 안고 있는 고유의 문제라고 할 수 있습니다. Two-stage detector의 경우 Region Proposal 부분에서 필터링을 통해서 background example을 일부 걸러내고 임의로 positive/negative sample의 수를 적절하게 유지하는 sampling heuristic 방법을 이용하여 Class Imbalance 문제를 해결했습니다. 하지만 One-stage detector는 Region Proposal과 Detection을 동시에 수행하기 때문에 매우 많은 오브젝트 후보들에 대해서 Detection을 수행해야 하므로 Class Imbalance로 인한 성능 저하 영향이 상대적으로 더 크다고 할 수 있습니다. (SSD의 경우 hard negative mining이라는 sampling heuristic 방법을 사용)
그럼 이 Class Imbalance로 인해 어떤 문제가 발생하는지 살펴보도록 합시다.
어떤 한 one-stage detector 모델에서 입력 이미지에 대한 예측 Anchor box 중 10000개의 easy example와 50개의 hard example이 나오는 Class Imbalance 문제가 생겼다고 가정합시다. 이때 Easy sample들은 찾기 쉬운 대상으로 Classification score가 모두 0.9로 높게 나왔고 hard sample들은 찾기 어려운 대상으로 Classification score가 모두 0.2정도로 낮게 나왔다고 합니다.
그렇다면 easy example과 hard example의 Loss 값은 아래의 Cross Entropy 식에 의하여 각각 약 0.1과 2로 나오게 됩니다.
제대로된 학습을 위해서는 이미 높은 예측 확률을 가지고 있는 Easy example보다 낮은 예측 확률을 가지는 Hard example에 대해서 많은 Loss를 줌으로써 Hard example에 대한 예측 확률을 높이는 것이 바람직합니다. 하지만 아래 그림과 같이 많은 Easy example의 개수로 인해서 Easy example에 의한 Loss가 Hard example에 의한 Loss보다 값이 더 커져버리면서 예측이 불확실한 Object들을 개선하려는 방향성으로 학습이 진행 되는 것이 아니라 이미 높은 예측 확률을 가진 Easy example, 즉 background나 확실한 Object들에 대해서 더 정확한 예측을 하기 위한 학습이 진행되게 됩니다. 이러면 학습의 효율도 떨어질 뿐더러 모델의 성능이 오히려 떨어질 수도 있습니다.
이를 해결하기 위해서 기존 One-stage detector는 학습 시 경험치에 기반한 샘플링이나 data augmentation을 적용하였지만 RetinaNet은 easy example을 down-weight하고 hard sample에 집중하여 학습하도록 하는 Focal Loss function을 만들어 Class Imbalance 문제를 해결하고자 했습니다.
Focal Loss의 식과 Focusing parameter $\gamma$에 따른 그래프는 아래와 같습니다. $\gamma$=0인 경우, focal loss는 Cross Entorpy와 같으며, 논문에서는 실험 결과 =2일 때 가장 좋은 결과를 보였다고 합니다.
위 그림을 보면 알 수 있듯이 Focal Loss는 확실한 Easy example일수록 Loss 값이 극한으로 줄어드는 것을 확인할 수 있습니다. (매우 쉽게 판별되는 example의 경우 Loss가 0.00000025로 Cross Entropy를 적용했을 때에 비해서 40000배 작은 Loss 값이 할당됨) 따라서 Class Imbalance 문제가 있어도 Easy Example들이 학습에 기여하는 정도를 낮춰 Hard Example들의 예측 확률을 높이는 방향으로 학습될 수 있는 것이죠.
이런 Focal Loss을 도입하여 Class Imbalance 문제를 해결한 RetinaNet은 SSD나 YOLO보다 훨씬 많은 anchor box를 사용하여 예측을 수행하게 됩니다.
RetinaNet Detector
RetinaNet 모델은 다음 그림과 같이 FPN이 적용된 ResNet Backbone에 각각 classification과 bounding box regression을 수행하는 2개의 subnetwork로 구성되어 있습니다.
FPN(Feature Pyramid Network)
YOLOv3와 같이 RetinaNet에서도 FPN이 사용되었습니다. FPN에 대해서는 YOLOv3 포스팅에서 자세히 설명하였으니 여기서는 간단한 설명만 하고 넘어가겠습니다.
FPN이란 서로 다른 크기를 가지는 Object들을 효과적으로 Detection하기 위하여 bottom up과 top down 방식으로 추출된, 서로 다른 해상도 정보를 가지는 feature map들을 lateral connection으로 연결하는 방식을 말합니다.
Lateral Connection: High-level feature map을 upsampling하여 하위 level의 feature map과의 크기를 맞춘 후 합치는 일련의 과정
RetinaNet은 FPN에서 나온 $P_3$에서 $P_7$까지의 5가지 크기의 feature map을 사용하여 Object Detection을 수행하게 됩니다. ($P_l$은 입력 이미지의 1/$2^l$의 resolution을 갖고, $l$은 pyramid level을 나타낸다). 이때 FPN에서 나온 모든 feature map의 채널 수는 256으로 동일하게 맞춰집니다.
추가로 각각의 합쳐진 Feature Map에서 predict를 하기 전에 추가로 3 x 3 convolution을 해주는데 이는 서로 다른 Feature Map들이 섞일 때 정보 손실이 되는 Aliasing 현상을 막기 위해서라고 합니다.
Anchors
RetinaNet은 3개의 서로 다른 크기와 3개의 서로 다른 스케일을 가지는 총 9개의 Anchor box를 $P_3$에서 $P_7$까지의 각 feature map의 개별 grid에 할당합니다. 각 Anchor box는 Classification을 위한
각 Feature Map에서의 Anchor box를 모두 합치면 하나의 입력 이미지에 대해서 총 100K개 정도의 Anchor box가 할당되는데 이렇게 많은 anchor들을 학습 시에 모두 사용하지 않고 Ground truth와의 IoU가 0.5이상인 Anchor box를 positive로, 0.4이하인 Anchor box를 negative(background)로 설정하여 이들만 학습에 사용합니다. 그 사이인 0.4 ~ 0.5의 IoU를 가지는 Anchor box들을 모두 무시합니다.
Inference 시에도 각 Feature map에서 box prediction 점수가 높은 1000개의 Anchor box만 result에 사용하고, 이들을 합친 후 0.5의 threshold로 NMS를 적용해서 최종 detection 결과를 얻습니다.
Classification Subnet
해당 subnet은 각 feature map에 작은 FCN을 적용함으로써 A개의 anchor box와 K개의 클래스 각각에 대해 object가 존재할 확률을 예측합니다. C 채널의 Feature Map이 입력되었을 때, subnet은 C 필터가 있는 4개의 3 x 3 Convolutional Layer를 적용하고 그 다음에 각각 ReLU 활성화 함수를 적용한 다음 KA 필터가 있는 3×3 Convolutional Layer를 적용합니다. 요기에 Sigmoid 활성화 함수가 적용되어 Prediction Score를 예측합니다. 논문에서는 C = 256 및 A = 9를 사용합니다.
Box regression Subnet
Box Regression Subnetwork 역시 ground truth와 anchor box의 offset을 예측하기 위해서 classification subnet과 마찬가지로 FCN(Fully Convolutional Network)을 적용합니다. Classification Subnetwork와 구조가 거의 동일하지만 마지막에 4A개의 결과를 내기 위해 4A개의 3 x 3 크기의 필터를 사용한다는 점만 다릅니다.
RetinaNet의 Focal Loss는 Cross entropy나 SSD의 OHEM(Online Hard Example Mining)을 사용한 모델보다 AP값이 더 높게 나옴으로써 Focal loss가 Class Imbalance 문제를 기존의 방식보다 효과적으로 해결한다는 것을 입증했습니다. RetinaNet은 여기에 추가로 FPN까지 사용하면서 여타 다른 SOTA Object detection 모델보다 높은 mAP 값을 가지는 것을 확인할 수 있습니다. Two-stage detector보다 수행 성능도 좋고 YOLO나 SSD보다는 떨어지지만 one-stage detector의 빠른 수행 속도도 장점으로 가진 것이죠.
다음 포스팅에서는 EfficientDet에 대해서 설명하도록 하겠습니다.
Reference
● https://www.inflearn.com/course/딥러닝-컴퓨터비전-완벽가이드/dashboard - 인프런 강의
● https://arxiv.org/pdf/1708.02002.pdf
● https://herbwood.tistory.com/19