📑 논문 제목: Focal Loss for Dense Object Detection
📑 논문 다운로드: PDF
이번엔 RetinaNet의 논문을 리뷰해보려고 합니다. RetinaNet은 Object Detection 알고리즘 중 하나이며 One-statge-Detector입니다.
이전 Object Detection에 대해 포스팅한 자료를 참고해도 좋습니다.
Object Detection의 모델은 이미지 내의 객체의 영역을 찾아내고, IoU(Intersection over Union) threshold에 따라 positive/negative sample로 나눈 뒤 학습합니다.
📌 참고: Iou 개념
여기서 class imbalance의 문제가 발생합니다. 이미지 내에 positive sample(object)와negative sample(background) 사이의 차이가 크기 때문인데요. 첫 번째로 배경 영역 때문에 대부분 sample이 easy negative가 되고, easy negative의 수가 압도적으로 많아서 학습에 끼치는 영향력이 커져서 모델의 성능이 하락합니다.
Two-statge-Detector는 이러한 문제를 해결하기 위해 두 가지 측면에서 해결책을 썼습니다. 첫 번째가 region proposals을 통해 background sample을 걸러주었습니다. 방법은 selective search, edgeboxes, deepmask, RPN 등이 있습니다. 또한, ositive/negative sample의 수를 적절하게 유지하는 sampling heuristic 방법을 적용했습니다. hard negative mining, OHEM 등이 이러한 방법에 해당합니다.
One-statge-Detector 계열의 문제점은 위에서 언급한 class imbalance의 문제를 해결하기에 부적절했습니다. region proposal 과정을 없애고 이미지 전체를 sampling하는 dence sampling 방법을 수행하기 때문에, 더 많은 후보 영역이 발생하고 class imbalance 문제가 더 심각합니다.
따라서 One-statge-Detector는 Two-statge-Detector보다 속도는 빠르지만 성능은 떨어진다는 특징이 있었습니다.
그래서 해당 논문은 class imbalance의 문제를 main으로 보고 focal loss를 통한 해결 방법을 제시하였고, Two-statge-Detector보다 더 좋은 성능까지 입증합니다.
위의 그래프에서 가 Cross Entropy 식이고 아래의 이 해당 논문에서 제시하는 Focal Loss입니다.
두 식의 차이는 이며 는 뒤의 Focal Loss에서 설명이 될듯합니다.
높은 정확도를 보여줬던 detector은 R-CNN 계열의 tow-stage였고, one-stage detector는 대비되게도 dence sampling을 통해 빠르고 간단하게 object의 locations를 찾아냈지만 성능은 two-stage를 따라가지 못했습니다.
논문 저자들이 발견한 것은 foreground와 background 사이의 class imbalance문제였고, 이것이 dence detector가 학습하는데 가장 큰 원인이었습니다.
class imbalance를 해결하기 위해 기존의 cross entropy loss를 reshapling하는 방법을 제안했고, 그것은 잘 분류되는 예들(well-classified examples, easy sample)에게 더 작은 가중치(dwon-weights)를 주는 방법이었습니다.
easy sample에게 작은 가중치를 주게 되면 학습하는데 방해하는 걸 조금 더 막아줍니다.
그 방법 이름이 이며, detector가 학습하는 동안 엄청나게 많은 수의 easy negatives에게 영향이 가는 것을 막으며
작게 분포되어 있는 hard example(object)에게 집중합니다.
이 새로운 를 평가하기 위해 simple dense detector을 설계했고 그것이 RetinaNet입니다.
이 결과는 이전 것보다 속도도 빠르고 성능도 좋아 (당시에) SOTA를 달성했습니다.
해당 그래프의 ms는 속도이며, AP는 평가 지표입니다. RetinaNet101을 살펴보면 RetinaNet50보다 같은 속도에 비해 더 좋은 성능 결과를 보여주고 있습니다.
A부터 G까지 one-stage/two stage detector를 비교해보면 성능도 속도도 우수하다는 것을 확인할 수 있습니다.
Focal Loss는 학습하면서 foreground와 background 사이의 큰 imbalance 문제를 해결하도록 one-stage에서 설계되었습니다.
그리고 binary classification을 위한 Cross Entropy()를 바탕으로 시작합니다.
ground-truth class에 대해서 [0, 1]로 분류하고, label과 동일하면 1입니다.
표기상 편의를 위해 라고 정의합니다.
일 때, 이고 그 외의 경우엔 입니다. 그래서 의 식을 다시 써서, = 라고 표기합니다.
여기서 y에 상관없이 > 0.5 이면 Confidence가 높으므로 Loss가 크게 줄어드는데, 문제는 쉽게 분류가 잘 돼서 0.5를 넘기기 쉬운 Background나 class들이 너무 많이 Loss를 줄여버리게 됩니다.
이렇게 되면 Rare한 클래스가 Loss에 미치는 귀중한 영향을 압도해버릴 수 있는데요.
해당 논문에서는 에다가 balance를 맞춰주는 idea로 Balanced Cross Entropy란 것을 먼저 제안합니다.
Balanced Cross Entropy는 Weightng Factor를 제안한 것인데요.
y가 1일 때와 -1일 때, 각각 Loss에 미치는 영향을 다르게 만들어주는 아이디어입니다.
Weighting Factor 로 Positive와 Negative Sample들이 Loss에 미치는 영향의 정도는 조정해주었습니다.
하지만 아직 진짜 목표인 Easy/Hard Sample들에 대한 Loss 반영 정도를 조정해주지 않았습니다.
이 부분을 해결한 것이 Scaling Factor이고, Scaling Factor가 추가된 것이 Focal loss function입니다!
쉽게 분류되는 negative는 loss의 대부분을 차지하고, gradient를 거의 지배합니다.
balance는 positive/negative에겐 영향을 주지만, 그것은 easy/hard example 사이를 구별짓지는 못합니다.
그래서 에 를 곱해 factor에 더 변화를 주었습니다.
는 조정할 수 있는 파라미터 값입니다.
example이 잘못 분류되거나 가 작으면 factor는 1에 가깝고, loss는 영향을 받지 않습니다.
가 1이면 factor는 0으로 가고, 잘 분류되는 example의 loss는 가중치가 낮아집니다.
파라미터 은 easy example의 가중치가 작아지는 비율을 더 부드럽게 조정해줍니다.
가 0일 때, 은 와 동일하면서 이 증가함에 따라 Scaling factor의 영향이 커집니다.
modulating factor는 easy example의 기여도를 줄이고,
example이 작은 loss를 받는 범위를 확장시키는 기능을 합니다.
예를 들어 , 일 때, CE에 비해 100배 적은 loss를 가지며 일 때는 1000배 적은 loss를 가집니다.
이는 잘못 분류된 example을 수정하는 작업의 중요도를 상승시킴을 의미합니다.
여기서는 일 때, 가장 효과적이라고 언급하고 있습니다.
마지막으로 에 앞에서 의 balance를 추가합니다.
결론적으로는 위의 식을 채택했는데, balance가 맞지 않은 형식에 비해 정확도가 약간 향상되었습니다.
loss layer의 구현은 를 계산하기 위한 sigmoid 연산과 loss 계산을 결합하여 더 좋은 성능을 가져온다는 점에 주목했습니다.
RetinaNet은 하나의 backbone network와 두 가지의 task를 가진 subnetwork가 있습니다.
backbone은 전체 input image에 대한 convolutional feature map의 연산을 하는 기능을 합니다. 이건 자체 convolutional network입니다.
feedforward로 ResNet을 사용했습니다. 그림을 보면 ResNet 상단에서 FPN backbone을 사용했고, multi-scale convolutional feature pyramid를 생성합니다.
여기서 anchor box를 생성합니다.
first subnet은 backbone의 output(anchor box)에 대한 object를 classification하는 역할을 합니다.
second subnet은 anchor box와 GT(Ground Truth) Box를 비교하는 regression의 연산을 수행합니다.
RetinaNet의 Backbone으로 FPN(Feature Pyramid Network Backbone)을 사용하였습니다.
FPN은 하나의 input image에 대해 multio-scale feature pyramid를 생성합니다.
각 레벨의 pyramid는 다른 scale에서 object를 detect하는데 사용됩니다.
작은 크기의 object부터 큰 크기의 object까지 다양한 scale을 가지는 object의 detect 능력이 향상 됩니다.
ResNet 자체만 사용했을 때는 AP가 낮아서 ResNet 상단에 FPN을 적용합니다
pyramid는 level P3~P7을 사용했고, pyramid의 channels의 수는 256입니다.
RPN과 비교해서, object classification subnet은 더 깊고, 오직 conv layers만 사용하여 box regression subnet과는 공유하지 않습니다.
RetinaNet의 판단 속도 향상을 위해, 각 FPN level에서 가장 box prediction 점수가 높은 1,000개의 box만 result에 사용하였습니다.
다른 detector와 마찬가지로 최종 detection에 NMS(non-maximum suppression)를 0.5 임계값으로 적용하여 최종 값을 산출합니다.
RetinaNet을 COCO 데이터셋을 통해 학습시킨 후 서로 다른 loss function을 사용하여 AP 값을 측정했습니다.
또한, SSD 모델을 통해 positive/negative 비율을 1:3으로
NMS threshold=0.5로 설정한 OHEM과 성능을 비교한 결과,
Focal loss를 사용한 경우의 AP값이 3.2% 더 높게 나타났습니다.
이를 통해, Focal loss가 class imbalance 문제를 기존의 방식보다 효과적으로 해결했습니다.
RetinaNet의 성능은 기존 two-stage, one-stafe 모델들과 비교해보았을 때도, 우수함을 알 수 있습니다.
one-stage의 가장 주요한 obstacle이었던 class imbalance문제를 해결하기 위해 를 제안하였고, 성능을 입증했습니다.
해당 논문의 접근은 굉장히 간단하면서 효과적인데요.
fully convolutional one-stage detector를 설계하여 효과를 증명하였고, SOTA를 달성했습니다!
페이스북이 만든 성과를 구경하고 싶으신 분들은 해당 github으로 이동해서 보시길 바랍니다.
📌 논문 리뷰 참고1: RetinaNet 논문(Focal Loss for Dense Object Detection) 리뷰
📌 논문 리뷰 참고2: Focal Loss for Dense Object Detection 리뷰
📌 논문: Feature Pyramid Networks for Object Detection