[논문 리뷰]/컴퓨터비전

[논문 리뷰] Focal Loss for Dense Object Detection (RetinaNet)

johyeongseob 2024. 9. 21. 20:27

논문: https://arxiv.org/abs/1708.02002

 

저자: Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollar. Facebook AI Research (FAIR)

 

인용: Ross, T-YLPG, and G. K. H. P. Dollár. "Focal loss for dense object detection." proceedings of the IEEE conference on computer vision and pattern recognition. 2017.

 

깃허브: https://github.com/facebookresearch/Detectron

 

: 게시글 아래 RetinaNet ICCV 2017 구두발표 영상과 영상 내용 요약이 있습니다.

 

0. 초록 (Abstract)

  최근까지 가장 높은 정확성을 보여주는 객체 검출 (object detector, 이하 OD)은 2-stage접근법이다. 이는 미리 찾은 객체 위치 (object location) 후보를 분류한다. 반면 1-stage detector는 이미지에서 규칙적이고 빽빽하게 가능한 객체 위치들을 찾는다. 단일 단계이기 때문에 빠르고 간단하나, 정확성이 비교적 낮다. 논문의 저자는 왜 이런 현상이 발생하는지 조사하여 그 결과가 훈련 중, 대상 (foreground) - 배경 (background) 클래스 불균형임을 밝혔다. 이 문제를 해결하기 위해 저자는 Focal Loss를 도입한 RetinaNet을 만들었다.해당 모델은 1-stage의 속도와 2-stage의 정확성을 모두 확보했다.

 

1. 서론 (Introduction)

 

현재 state-of-the-art(이하 SOTA) OD는 제안-기반 매커니즘인 2-stage이다. R-CNN 발표 이후 해당 라인들은 좋은 성과를 보여주었다. 하지만 만약 간단한 1-stage 모델이 비슷한 정확성을 얻는다면 어떠할까? 최근 1-stage detector인 YOLO 모델이나 SSD모델은 SOTA 모델에서 정확성을 조금 떨어지지만 속도는 더 빠르다. 저자는 1-stage 모델이며 동시에 SOTA 모델의 COCO AP를 달성한 모델을 소개한다. 그 모델의 핵심은 클래스 불균형(후보 영역에서 배경 영역이 물체 영역보다 매우x3 많음)을 해결하는 것이다.

 클래스 불균형은 2-stage cascade(OD의 multi-stage process, 한 단계의 output이 다음 단계의 input인 과정)나 sampling heuristics으로 다루어졌다.(~1-2k) 반면 1-stage 감지기는 이미지 내의 지역 제안 (region proposal)없이 많은 수의 후보지역(~100K)을 처리해야 한다. 저자는 클래스 불균형을 해결할 새로운 손실 함수 (loss function)를 제안했다. 이 손실함수는 cross entropy (이하 CE) loss를 유동적으로 scale한다. 이 scaling factor가 쉬운 예제 (true positive)의 loss를 0에 수렴하도록 낮추어 어려운 예제 (false positive)에 집중하도록 한다. 이름하여 Focal Loss(이하 FL, focus calculation loss의 약자가 아닐까 생각한다.)

 

그림 1: 쉬운 예제는 적은 가중치를 적용해 낮은 loss로 설정한다.

 

저자는 FL의 유용함을 입중하기 위해 RetinaNet이라고 불리는 1-stage OD를 제안한다. 이 모델은 다양한 개념(ex. Faster R-CNN, FPN 등)을 차용했다. 이 모델은 최근 best OD들의 성능을 넘었다.

그림 2: 해당 모델은 기존 OD보다 우수한 성능을 보인다.

 

2. 관련 연구 (Related works)

Two-stage Detectors

 현대 OD의 주요한 패러다임은 2-stage 접근 방식을 기반으로 한다. 첫 단계에서는 negative locations (배경)을 제거하고 두 번째 단계에서는 제안 영역을 분류한다. R-CNN계열이 해마다 진보하여 Faster R-CNN의 RPN이 탄생하였다.

One-stage Detectors

 1-stage OD는 OverFeat 모델을 시작으로 SSD 모델, 그리고 YOLO 모델이 있다. 1-stage OD는 더 큰 계산량이 필요하여 정확성이 2-stage에 비해 낮다.

Class Imbalance

 1-stage OD는 지역-제안이 없기 때문에 많은 양의 후보지역(10-100k)을 검사한다. 이는 1. 필요 없는(TP) 지역이 학습에 방해가 되어 훈련이 힘들다는 점과 2. 대량의 배경지역이 훈련을 overwhelm한다는 점이다. 일반적인 해결책은 Hard Negative Mining(OHEM 모델 등)이다.

그림 3: Fast R-CNN with OHEM

 

3. Focal Loss

1-stage에서 클래스 불균형(1:10000)을 해결하기 위해 FL를 제안한다. FL은 CE를 변형하였다.

 

$CE(p,y)=\left\{\begin{matrix}
-\log (p) & \text{if}\;y=1 \\
-\log (1-p) & \text{otherwise} \\
\end{matrix}\right.$

 

$P_t=\left\{\begin{matrix}
p & \text{if}\;y=1 \\
1-p & \text{otherwise} \\
\end{matrix}\right.$

 

$CE(p,y)=CE(p_t)=-\log (p_t)$

 

3.1 Balanced Cross Entropy

 클래스 불균형을 해결하는 일반적인 방법은 weighting factor $\alpha$를 도입하는 것이다. 이 loss는 간단한 CE 확장 버전이다.

 

$CE(p,y)=-\alpha _t\log (p_t)$

 

3.2 Focal Loss Definition

  $\alpha$-balance는 객체/배경 샘플 구분에 좋으나 easy/hard 샘플 구분에는 적절하지 않다. 그래서 우리는 easy 샘플에는 가중치를 낮추고 hard negative에 집중한다. CE에 추가할 modulating factor는 $(1-p_t)^{\lambda}$이다. 가 0이면 CE이고 실험 결과 최적의 는 2이다. 예시로 기존 대비해서 람다가 2이면 $p_t$ = 0.9의 loss값은 100배 줄어든다.

 

$FL(p_t)=-(1-p_t)^\lambda \log (p_t)$

 

 현실적으로 저자는 FL에 $\alpha$-balance를 사용하였다.

 

$FL(p_t)=-\alpha _t (1-p_t)^\lambda \log (p_t)$

 

4. RetinaNet Detector

 RetinaNet은 backbone 네트워크와 두 개의 서브네트워크로 이루어져 있다. backbone은 off-the-self(or pre-trained) CNN을 사용한다. backbone에서 나온 특징맵 (feature map)은 subnet입력으로 사용된다. 첫 번째 subnet은 classification을, 두 번째 subnet은 bounding box(이하 bbox) regression을 수행한다.

그림 4: 전체 구조 (Overall architecture)

 

Feature Pyramid Network Backbone

 Feature Pyramid Network(이하 FPN)는 일반적인 CNN에 top-down pathway와 lateral connections를 추가한 구조이다. 그 결과 단일 해상도 입력 이미지에서 다양한 크기의 특징맵 피라미드 (feature pyramid)를 만들 수 있다. 각각의 피라미드 계층 (pyramid level)은 다양한 크기의 객체를 찾을 수 있게 도와준다. 저자는 ResNet 구조의 마지막에 FPN을 추가하였다. 기존 FPN과의 차이는 $P_2$를 사용하지 않고,$P_6, P_7$이 추가되었다.

Anchors

 고정된 anchor box를 위해 $P_3 ~ P_7$ 피라미드에 $32^2$크기부터 $512^2$크기의 앵커 박스를 가진다. 각 픽셀에 해당하는 앵커 박스는 9종류로 aspect ratio [1:2, 1:1, 2:1]과 size $2^0, 2^{ \frac{1}{3}}, 2^{ \frac{2}{3}}$을 가진다.  각 anchor는 $k$(# of classes) x $A$(bbox)개의 dimension으로 할당된다. 해당 방식은 Faster R-CNN의 RPN을 따른다. anchor에서 k개의 classes 중 한 개의 클래스를 예측하면 one-hot vector로 표시한다. ground truth(이하 GT)와의 IoU에서 0.5이상이면 positive로 [0.4, 0.5)이면 negative로, 나머지는 무시한다. bbox는 GT와 prediction의 offset으로 계산한다.

Classification Subnet

 작은 fully convolutional network(이하 FCN)인 classification subnet은 픽셀별로 A개의 anchors에서 물체의 존재 여부와 K개의 classes 중 하나를 예측한다. 5개의 pyramid level이 각각 subnet에 입력으로 주어진 후, 마지막 출력은 $(H \times W \times 4A)$이다.

Box Regression Subnet

 classification subnet과 동일한 subnet이 동시에 5개의 pyramid level을 input으로 받아, anchor box와 인근의 GT box와의 relative offest(절대좌표가 아닌 상대좌표)을 계산하여 $(H \times W \times 4A)$의 output을 도출한다.

 

4.1 Inference and Training

Inference

 저자는 이미지에서 얻은 피라미드 계층당 1k개의 top-scoring prediction을 사용한다. 그리고 이들은 마지막에 합쳐지고 최종 예측을 위해 0.5 임계값의 non-maximum suppresion(이하 NMS)을 수행한다.

Focal Loss

 저자는 FL을 분류 subnet output의 loss로서 이용한다. 에서 잘 작동하며 일 때 가장 좋은 성능을 보인다. total FL은 이미지당 all ~ 100k anchors의 loss 합을 구한다음, GT box로 할당된(positive) anchor의 수로 normalize한다.

그림 4: 다양한 λ값에 따른 positive/negative samples에 대한 loss의 누적 분포 함수

 

5. 번외: 용어 설명

Foreground-to-background 문제

  객체 감지(OD)의 “전경-배경 문제”는 이미지 또는 비디오 프레임에서 전경(관심 객체)과 배경(비객체 영역)을 정확하게 구별하는 문제를 의미합니다. 물체가 포함된 영역을 올바르게 식별하는 것이 정확한 물체 위치 파악, 분류 및 전반적인 감지 성능을 위해 필수적이기 때문에 이는 물체 감지의 중요한 측면입니다.

Class imbalance

  현실 데이터에는 클래스 불균형 (class imbalance) 문제가 자주 있다. 어떤 데이터에서 각 클래스 (주로 범주형 반응 변수) 가 갖고 있는 데이터의 양에 차이가 큰 경우, 클래스 불균형이 있다고 말한다. 예를 들어, 병원에서 질병이 있는 사람과 질병이 없는 사람의 데이터를 수집했다고 하자. 일반적으로 질병이 있는 사람이 질병이 없는 사람에 비해 적다. 비단 병원 데이터뿐 아니라 대부분의 “현실 데이터”에 클래스 불균형 문제가 있다.

Anchor

  2-stage OD 의 RPN과 1-stage OD의 신경망에 적용되는 사전 정의된 경계 상자 세트

Mining

  객체 감지(OD)의 맥락에서 “마이닝”은 객체 감지 모델의 성능을 훈련하거나 개선하기 위해 데이터세트의 특정 예나 샘플을 선택하거나 우선순위를 지정하는 프로세스를 의미한다. 마이닝은 모델의 정확성 향상, 클래스 불균형 처리, 어렵거나 유익한 예제에 초점을 맞추는 등 OD의 다양한 과제와 목표를 해결하는 데 중요한 역할을 한다.

 

6. Focal Loss Pytorch 코드

import torch
import torch.nn as nn
import torch.nn.functional as F


class FocalLoss(nn.Module):
    def __init__(self, alpha=[1.0, 1.0, 1.0, 1.0], gamma=2, reduction='mean'):
        super(FocalLoss, self).__init__()
        self.alpha = torch.tensor(alpha).cuda()
        self.gamma = gamma
        self.reduction = reduction

    def forward(self, inputs, targets):
        # CrossEntropyLoss 계산
        CE_loss = F.cross_entropy(inputs, targets, reduction='none')
        pt = F.softmax(inputs, dim=1)[range(len(targets)), targets]
        at = self.alpha[targets.long()]

        # Focal Loss 계산
        FC_loss = at * (1 - pt) ** self.gamma * CE_loss

        # reduction 방식에 따라 반환
        if self.reduction == 'mean':
            return FC_loss.mean()
        elif self.reduction == 'sum':
            return FC_loss.sum()
        else:
            return FC_loss

 

  내가 하던 task가 4진 분류여서 $\alpha$를 네 개로 설정하였다. 일반적으로 전경/배경이면 2진분류로 생각해도 좋을 것 같다.

 

7. RetinaNet- ICCV 2017 oral session video

https://www.youtube.com/watch?v=44tlnmmt3h0

 

영상 내용

  OD에서 2-stage detector가 1-stage detector보다 정확성은 높으나 속도가 느리다. 1-stage detector의 속도를 가지면서 2-stage detector의 정확성을 가진 OD 모델을 구현하였다.

  1. Dense object detection: 객체의 공간을 더 잘 커버하기 위해 더 많은 경계상자가 있을 때 더 나은 성능을 얻는다. 이로 인한 단점으로 class imbalance 문제가 발생한다. 대부분의 bbox는 foreground가 아니라 background이다. 많은 쉬운 sample들이 CE train을 방해할 수 있는 주된 원인이다. 10만개의 쉬운 예제 x 0.1 loss = 10,000 loss 100개의 어려운 예제 x 2.3 loss = 230 loss
  2. 쉬운 예제의 손실값을 줄이기 위한 focal loss func와 alpha-balanced CE를 사용하였다.