논문 읽기/Object Detection

[논문 읽기] RetinaNet(2017) 리뷰, Focal Loss for Dense Object Detection

AI 꿈나무 2021. 3. 8. 22:24
반응형

 RetinaNet 논문은 모델이 예측하기 어려운 hard example에 집중하도록 하는 Focal Loss를 제안합니다. ResNet과 FPN을 활용하여 구축된 one-stage 모델인 RetinaNet은 focal loss를 사용하여 two-stage 모델 Faster R-CNN의 정확도를 능가했습니다.

 

 


클래스 불균형 문제(Class imbalance proplem)

 R-CNN과 같은 two-stage detector이 one-stage detector보다 높은 정확도를 나타내는 것은 일반적입니다. 하지만 one-stage detector(YOLO, SSD)는 속도가 빠르다는 장점이 있습니다. RetinaNet 저자는 one-stage detector의 낮은 정확도의 원인은 객체와 배경 클래스 불균형가 원인이라는 것을 발견합니다.

 

 two-stage 기법휴리스틱 샘플링(positive, negative 비율을 정해서 샘플링하는 방법) 또는 OHEM 기법을 클래스 불균형 문제를 해결하는데 사용합니다.. 수많은 ROI에서 hard negative sample을 골라서 mini-batch를 구성한뒤에 모델을 학습시키면, 모델은 False negative에 강인성이 생겨서 정확도가 높아집니다. 따라서 어느 정도 클래스 불균형문제를 해결할 수 있었습니다.

 

 하지만 one-stage detector은 클래스 불균형 문제를 해결할만한 적절한 방법이 없었습니다. 휴리스틱 샘플링을 사용했지만 비효율적이었고, training set은 예측하기 쉬운 배경 example이 대부분을 차지했습니다.

 

 Focal Loss는 one-stage detector에서도 클래스 불균형 문제를 해결할 수 있도록 합니다. loss function을 수정하여, 예측하기 쉬운 example에는 0에 가까운 loss를 부여하고, 예측하기 어려운 negative example에는 기존보다 높은 loss를 부여합니다. 즉, scale factor를 부여한 것입니다.

 

 

 위 그림은 Foscal loss(초록색 선)와 기존 loss function(파랑색 선)과의 차이점입니다. 정답일 확률이 높은 예측에는 0에 가까운 loss가 부여되는 것을 확인할 수 있습니다.

 


Cross entropy Loss

 Focal Loss는 one-stage detector에서 클래스 불균형 문제를 해결하기 위해 제안된 loss function입니다. 그리고 classification에서 사용하는 cross-entropy loss에 인자를 하나 추가한 것입니다. 우선 cross entropy loss을 살펴보겠습니다.

 

cross-entropy loss

 

 위 식은 이진 분류문제에서 사용하는 CE loss function입니다. y는 ground-truth class이고, p는 모델이 예측한 값입니다. 편리함을 위해 아래와 같이 간단히 표현하겠습니다.

 

 

 pt가 0.5이상이면 분류하기 쉬운 easy example 입니다. easy example은 loss값이 작지만, 엄청나게 많아지면 대부분의 loss를 차지하게 되어 hard example의 영향을 감소시킵니다. CE loss는 클래스 불균형이 존재할 때, 좋은 선택이 아닙니다.

 

Focal Loss

 Focal Loss는 cross entropy loss에 인자를 하나 추가입니다. 이 인자는 modulating factor이라고 하고, easy example의 영향을 감소시키고 hard example에 집중하도록 합니다. 앞에 인자가 추가함으로써 easy example이 loss에 미치는 영향을 감소시킬 수 있는 것입니다.

 

Focal Loss

 

 $\gamma$는 하이퍼파라미터입니다. 감마값으로 easy/hard example의 가중치를 조절할 수 있습니다. 논문에서는 $\gamma$=2 일때, 가장 성능이 좋다고 합니다.

 

 example이 잘못 분류됬으면 pt는 낮은 값을 갖습니다. pt가 낮으면 modulating factor은 1에 가까운 값을 갖게 됩니다. 따라서 loss는 가중치에 영향을 받지않습니다.

 

 example이 예측하기 쉽다면 pt는 큰 값을 가질 것입니다. (1- pt)에서 pt가 크면 0에 가까운 값을 지니게 됩니다. 따라서 loss도 0에 가까운 값을 갖게 됩니다.

 

 $\gamma$=2, pt=0.9인 경우에 CE loss보다 100배 낮은 loss값을 갖습니다. pt가 0.5 이하이면 CE loss보다 4배 더 큰 loss를 갖습니다. 이처럼 pt에 따라 loss값을 조절하여 easy example의 영향을 낮추고 hard example의 영향을 높이는 것입니다.

 

 


RetinaNet

 RetinaNet은 ResNet-FPN을 backnone으로 하여 2개의 sub-network를 사용하는 신경망입니다. 첫 번째 sub-network는 object classification을 수행하고, 두 번째 sub-network는 bounding box regression을 수행합니다. 전체적인 구조는 아래 그림과 같습니다.

 

 

구조를 좀 더 살펴보겠습니다.

 

1. Feature Pyramid Network

 ResNet구조에 FPN을 backbone으로 사용합니다. FPN은 top-down pathway와 lateral connection을 사용하여 multi-scale feature pyramid를 생성합니다. pyramid의 각 level에서 다양한 크기의 객체를 검출할 수 있습니다. P3부터 P7의 pyramid를 사용하고, 각 pyramid level은 256 채널을 갖습니다.

 

 속도를 높이기 위해 각 pyramid level에서 1000개의 top-scoring perdiction을 가진 box를 사용합니다. 모든 level에서 box가 병합되고 NMS를 수행하여 sub-network로 전달합니다.

 

2. Anchors

 Anchor를 사용합니다. 각 pyramid level에 aspect ratio={1:2, 1:1, 2:1}, size={$2^0, 2^{1/3}, 2^{2/3}$}을 사용하여 총 9개의 anchor를 할당합니다. 각 Anchor은 one-hot K vertor(K개의 class중 해당하는 class는 1, 나머지는 0)와 바운딩박스 offset 4개를 할당합니다. 따라서 하나의 Anchor에는 K*4의 vector가 할당됩니다.

 

 Anchor은 IOU가 0.5이상인 ground-thuth에 할당합니다. IoU가 0~0.4이면 배경으로 할당합니다. 0.4~0.5 IOU를 가진 anchor은 무시합니다.

 

3. Classification Subnet

 Anchor의 object class를 예측하는 network입니다. 각 pyramid level에 KA개 filter를 지닌 3x3 conv layer가 4개로 구성된 Conv layer를 부착합니다. K는 class 수, A는 anchor 수 입니다. 그리고 classification subnet의 출력값에 Focal Loss를 적용합니다.

 

4. Box Regression Subnet

 anchor와 ground-truth의 offset을 계산하는 network입니다. Classification Subnet과 동일하지만, 마지막에 4A 길이를 출력합니다. 각 anchor마다 offset 4개의 값을 출력하는 것입니다.

 


 

 당시 SOTA 모델과 비교한 성능입니다.

반응형