- [16′ CVPR] YOLO v1 : You Only Look Once: Unified, Real-Time Object Detection
- [17′ CVPR] YOLO v2 : YOLO9000: Better, Faster, Stronger
- [17′ ICCV] RetinaNet : Focal Loss for Dense Object Detection
- [18′ arxiv] YOLO v3
- [20′ arxiv] YOLO v4: Optimal Speed and Accuracy of Object Detection
1. 들어가며
이번 글에서는 Object Detection 분야에서 중요한 문제 중 하나인 Class Imbalance 문제와 이를 해결하기 위한 Focal Loss에 대해 깊이 있게 알아보려 합니다. Object Detection에서 Class Imbalance는 큰 도전 과제 중 하나이며, 이를 해결하지 않으면 모델의 성능이 크게 저하될 수 있습니다. 본 글에서는 이 문제를 근본적으로 해결할 수 있는 Focal Loss에 대해 자세히 설명하고자 합니다.
1장에서는 Object Detection과 Class Imbalance의 관계를 명확히 이해할 수 있도록 설명하였습니다. 여기서는 왜 이 문제가 중요한지, 그리고 이 문제가 모델에 어떤 영향을 미치는지 쉽게 이해할 수 있도록 설명하였습니다. 2장에서는 Balanced Cross Entropy를 소개하며, 이 방법의 한계를 통해 Focal Loss의 필요성을 느낄 수 있도록 설명했습니다.
3장에서는 본격적으로 Focal Loss에 대해 깊이 있게 다룹니다. 이는 Class Imbalance 문제를 효과적으로 해결할 수 있는 방법으로, 본 글에서는 이를 수식과 함께 자세히 설명하였습니다. 4장에서는 파이썬을 통해 Focal Loss를 직접 구현하는 방법을 소개하였습니다. 이를 통해 여러분은 Focal Loss에 대해 더욱 깊이 있는 이해를 할 수 있을 것입니다.
본 글의 가장 큰 특징은 바로 초보자의 입장에서도 쉽게 이해할 수 있도록 설명하면서도, 핵심 원리를 정확하게 이해할 수 있도록 수식을 통한 설명을 제공한다는 점입니다. 이를 통해 여러분은 Focal Loss와 관련된 깊이 있는 지식을 쉽게 습득할 수 있을 것입니다.
Object Detection, 그리고 Focal Loss의 세계는 광대하고 복잡할 수 있습니다. 하지만 본 글을 통해 여러분은 이 분야의 중요한 개념과 기법을 명확하게 이해할 수 있을 것입니다. 시작해 보겠습니다!
2. Object Detection과 Class Imbalance의 관계
먼저 Object Detection과 Class Imbalance의 관계에 대해서 살펴보도록 하겠습니다.
2-1. Object Detection이 Class Imbalance 문제인 이유
Object Detection 모델은 크게 2 stage 방법과 1 stage 방법으로 구분합니다. 각 방법별로 어떤 순서를 통해 물체를 탐지하는지를 따라가 보며 왜 Object Detection이 Class Imbalance 문제인지를 생각해 보겠습니다.
2-1-1. 2Stage Object Detection
먼저 2 stage Object Detection 방법의 작동 순서를 생각해 보겠습니다.
위 그림은 2 stage Object Detection 방법의 동작 순서를 나타낸 그림입니다. 두 가지 단계로 구성된 모습을 볼 수 있습니다.
첫 번째 단계는 Region Proposal 단계입니다. 이 단계는 입력으로 들어온 이미지에 대해 ‘물체가 있을 법 한 지역’을 찾아내는 단계입니다. Region Proposal 단계는 Selective Search 같은 딥러닝이 아닌 방법을 사용하는 경우도 있고, 딥러닝 모델을 사용하여 수행하는 경우도 있습니다.
두 번째 단계는 이렇게 찾아낸 ‘물체가 있을 법 한 지역’에 있는 물체가 무엇인지 구분하는 단계입니다. 이 단계는 보통 CNN에 잘라낸 영역의 이미지를 넣어 Classification을 수행하는 방법으로 수행합니다.
이제 Region Proposal의 결과를 ‘물체’인지, ‘배경’인지를 구분해야 하는 모델의 입장에서 생각해 보겠습니다. ‘물체가 있을 법 한 지역’을 1000개 찾도록 설정했다고 가정해 보겠습니다. 위의 강아지와 고양이가 있는 그림에서 Region Proposal 네트워크는 1000가지의 bounding box를 제안하겠죠. 이 1000개의 bounding box 중 실제 물체 (강아지, 고양이)가 포함되어 있고, 따라서 모델이 물체라고 학습해야 하는 bounding box는 몇 개 정도 될까요?
대략 10개 정도라고 가정해 보겠습니다. 그럼 990개의 bounding box는 배경이고, 10개의 bounding box만 물체인 상황입니다. 이 말은 학습 단계에서 각각의 bounding box에 대해 ‘물체’인지 ‘배경’인지를 구분하도록 학습해야 하는 모델의 입장에서는 2개의 클래스 (물체 / 배경)가 상당히 imbalance 한, 즉 class imbalance 한 상황이라는 의미입니다.
2-1-2. 1Stage Object Detection
이번에는 1 stage Object Detection의 상황을 생각해 보겠습니다.
위 그림은 1 stage Object Detection 모델의 동작 순서를 나타낸 그림입니다. 2 stage 방법과 달리 Region Proposal 단계가 없는 모습을 볼 수 있습니다. 단지 입력 이미지를 CNN을 사용하여 feature map을 추출한 뒤 각 feature 마다 bounding box의 상세 위치, 물체의 여부, 클래스의 종류를 예측하고 있네요. 2개의 단계를 1단계로 통합했기에 보통 1 stage Object Detection 모델은 속도가 빠르다는 장점이 있습니다. 하지만 Region Proposal 단계가 없기에 feature map을 구성하고 있는 (width x height)의 feature 각각에 대해 물체의 존재 여부를 계산해야 한다는 단점이 있습니다.
그럼 1 stage Object Detection 방법도 배경과 물체의 비율이 어떻게 되는지 생각해 보겠습니다.
먼저 두 가지를 가정하겠습니다.
첫 번째로 CNN으로 추출한 feature map이 13x13xChannel의 사이즈를 갖습니다.
두 번째로 13×13개의 feature는 각각 5개의 anchor box를 갖습니다.
이때 한 개의 이미지당 모델이 생각해야 하는 bounding box는 총 13x13x5개입니다. 이 중에서 실제로 물체를 포함하고 있다고 학습해야 하는 bounding box는 마찬가지로 10개 내외가 될 겁니다. 따라서 모델의 입장에서는 2 stage 방법과 마찬가지로 835개의 배경과 10개의 물체를 동시에 학습해야 하는 class imbalance 한 문제가 됩니다.
2-2. Class Imbalance 상황이 Object Detection 모델에 미치는 영향
그런데 Class Imbalance 한 상황이 왜 문제가 된다는 걸까요? 어쨌든 학습 데이터 개수는 충분하니 그냥 학습하면 안 되는 걸까요?
2-2-1. Object Detection 모델 입장에서 생각해보기
1 stage Object Detection 모델이 bounding box에 대해 ‘물체인지/배경인지’를 학습하는 상황을 한번 상상해 보겠습니다. 각각의 bounding box에 대해 모델은 Cross Entropy Loss를 사용하여 ‘물체’인지 ‘배경’인지를 구분하도록 학습해 보겠습니다. 이때 어떠한 상황이 펼쳐질지 상상해 보기 위해 Cross Entropy Loss가 어떻게 생겼는지 다시 한번 살펴볼게요.
위 그림은 입력값(p)에 따른 Cross Entropy Loss 값을 나타낸 그래프입니다. 입력값은 모델이 예측한 해당 클래스의 확률값에 해당합니다. 그림을 보면 모델이 정답을 잘 예측할수록 (물체를 물체라고 판단/배경을 배경으로 판단) Loss를 적게 받는 모습입니다. 반대로 모델이 정답을 못 예측할수록 (물체를 배경이라고 판단/배경을 물체로 판단) Loss를 많이 받는 모습입니다.
그런데, 모델이 정답을 잘 예측한다는 것은 무슨 의미일까요? 어떠한 문제에 대해 모델이 정답을 잘 예측할까요?
모델이 아무것도 모르는 학습 초기 상황을 생각해 봅시다. 모델에게 1000개의 bounding box에 대해 ‘물체’/’배경’을 맞춰야 하는 문제가 주어지겠죠. 모델 입장에서는 아직 아무것도 모르니 랜덤으로 대답을 할 겁니다. 그러고 나서 정답을 보니 990개는 배경이고 10개는 물체라고 하네요. 그럼 모델이 어떻게 생각할까요? ‘일단 배경이라고 대답하는 게 훨씬 유리하겠네.’라고 생각하겠죠? 따라서 다음 시험부터 모델은 일단 주어지는 bounding box 문제에 대해 ‘배경’이라고 대답할 겁니다. 그리고 그렇게만 대답해도 실제로 대부분의 문제를 맞히게 될 거고요. 따라서 모델의 입장에서 배경은 ‘쉬운 문제’, 물체는 ‘어려운 문제’가 될 겁니다.
2-2-2. Cross Entropy Loss 입장에서 생각해보기
자, 그럼 다시 Cross Entropy Loss 그래프를 보며 문제 상황을 정리해 보겠습니다.
먼저 Object Detection 모델 입장에서 배경은 쉬운 문제에 해당합니다. 따라서 정답을 쉽게 맞힐 거고, loss를 적게 받을 겁니다. 또한 문제의 개수는 엄청 많다는 특징을 갖고 있습니다.
반면 물체는 어려운 문제에 해당하죠. 정답을 잘 못 맞힐 것이기 때문에 큰 loss를 받을 것이고, 문제의 개수는 적다는 특징을 갖고 있습니다.
그럼 실제로 모델이 받는 loss가 어떨지 상상해 보겠습니다. 한 개의 이미지에서 물체의 bounding box는 1개라고 가정하겠습니다. 또 이때 받는 loss는 10이라고 가정하겠습니다. 정답을 전혀 못 맞혀서 10이라는 엄청 큰 loss를 받은 상황이네요. 반면 배경의 bounding box는 1000개라고 가정할게요. 대신 정답을 거의 맞히기 때문에 bounding box당 받는 loss는 0.1이라고 가정하겠습니다. 그럼 물체가 받는 loss의 총합은 1개x10으로 총 10이 될 겁니다. 반면 배경이 받는 loss의 총합은 1000개x0.1로 100이 될 거고요.
2-2-3. 정리
이 상황을 정리하면 다음과 같습니다.
이러한 상황은 Object Detection 모델 입장에서 봤을 때 크게 두 가지의 문제를 갖고 있습니다.
첫 번째는 학습의 비효율성입니다. 대부분의 학습 샘플이 너무 쉬운 문제라 모델 입장에서는 배울 게 없는 문제인 거죠. 열심히 공부해 보겠다고 문제지는 10권이 넘게 풀었는데, 대부분이 너무 쉬운 문제라 실력은 하나도 안 늘어나는 상황인 겁니다.
두 번째는 모델이 학습을 할 수 없다는 것입니다. 그나마 10권의 문제지에서 간간히 어려운 문제가 나오기는 하는데요. 문제는 모델 입장에서는 이런 문제는 공부 안 해도 99점을 받고 있는 상황이라, 굳이 더 노력해서 어려운 문제를 공부하지 않게 된다는 거죠. 위의 예시에서 배경에서 나오는 loss가 100이고 물체에서 나오는 loss가 10인데, 굳이 물체를 학습하려고 안 하겠죠.
여기까지 내용을 정리해 보면 다음과 같습니다. Object Detection 문제는 Class Imbalance 문제에 해당합니다. Class Imbalance 상황은 대부분이 쉬운 문제라 모델 입장에서는 어려운 문제를 학습하지 않게 된다는 문제가 있습니다. 정작 공부해야 하는 문제는 어려운 문제 (배경이 아닌, 물체를 찾는 것)인데 말이죠.
2-3. 기존 Object Detection 모델들이 Class Imbalance에 대처하는 방법
물론 기존의 Object Detection 모델들도 이러한 문제를 인지하고 있었고, 나름대로 이에 대한 대처방안도 있었습니다.
2 stage Object Detection 모델의 경우는 우선 Region Proposal 자체가 Class Imbalance 상황을 완화해 주는 효과가 있습니다. 이는 Region Proposal 기능이 없는 1 stage Object Detection 모델의 경우 모든 위치에 대해 물체/배경을 판별해야 함을 생각해 보면 이해할 수 있습니다. 또한 학습 단계에서 배경에 해당하는 bounding box는 무시하고 물체와 배경의 비중을 1:3 등으로 강제로 맞춰서 학습해 주곤 합니다.
1 stage Object Detection 모델 같은 경우 Hard Negative Sampling 방법 등을 사용합니다. 쉽게 말해, 너무 쉬운 배경 문제는 제외시켜 준다는 거죠.
하지만 이러한 방법들은 딥러닝 모델 입장에서는 자연스럽지 않습니다. 사람이 개입해서 학습 데이터, 난이도 등을 조절해줘야 하는 방법이니까요. 따라서 사람의 개입 없이 딥러닝 모델이 자체적으로 Class Imbalance 상황에 대처하게 하는 방법이 필요합니다. RetinaNet 논문에서는 이러한 철학을 바탕으로 1 stage Object Detection 모델을 효과적으로 학습할 수 있는 방법인 Focal Loss를 제안합니다.
3. Balanced Cross Entropy
바로 Focal Loss를 살펴보기 전에, 먼저 같이 상상해 보겠습니다. Cross Entropy Loss를 어떻게 변형하면 Object Detection의 Class Imbalance 상황에 적합하게 만들 수 있을까요? 지금 문제 상황을 다시 한번 떠올려보죠.
아주 간단하게 생각하면 문제는 이렇습니다. ‘작은 loss는 개수가 너무 많아서 다 합하면 너무 큰 값이 되고, 큰 loss는 개수가 너무 적어서 다 합해도 값이 너무 작은 상황. 따라서 작은 loss가 나오는 문제만 학습하려고 함.’
그럼 단순하게 이런 아이디어를 낼 수 있겠네요.
‘작은 loss들에는 작은 가중치를 곱해서 적당한 값으로 내려주고, 큰 loss들에는 큰 가중치를 곱해서 적당한 값으로 올려주자.’ 수식으로 표현하면 아주 간단하게 이렇게 수정된 Cross Entropy Loss로 만들어주면 되겠네요.
이때의 가중치는 어떻게 정해주면 될까요? 지금까지의 논리 흐름대로라면 빈도수의 역수로 정해주면 밸러스가 맞을 겁니다. 이렇게 빈도수의 역수에 해당하는 가중치를 곱해서 클래스 간 밸런스가 맞도록 수정해 준 Cross Entropy Loss Function을 Balanced Cross Entropy Loss라고 합니다.
4. Focal loss
하지만 문제는 아직도 해결되지 않았습니다. Balanced Cross Entropy Loss를 사용하여 학습이 진행된다고 상상해 보겠습니다. 학습 초기에는 우리의 의도대로 학습이 잘 진행될 겁니다. 빈도수의 역수로 가중치를 곱해 클래스 간 밸런스를 맞춰줬으니까요.
4-1. 문제 상황
그런데, 학습이 중간정도 진행이 된 상황을 상상해 보죠. 이제는 제법 물체에 대해서도 잘 맞추는 모델이 되었을 겁니다. 그런데, 이렇게 되면 우리가 Balanced Cross Entropy Loss에게 맞춰준 상황이 달라지게 됩니다. 원래 물체 bounding box에 대해서는 큰 loss가 나오는 상황을 가정해서 밸런스를 맞춰줬는데, 갑자기 작은 loss가 나오게 되면서 밸런스가 다시 무너지는 상황이 돼버린 거죠.
위 상황을 정리하면 다음과 같습니다.
이렇게 되면 물체로부터 나오는 loss의 총합이 다시 작아지게 되고, 모델은 다시 물체에 대해 학습을 안 하는 문제가 벌어지게 됩니다.
4-2. 해결 방법
자, 그럼 이 문제는 어떻게 개선해 주면 좋을까요? 생각해 보면 Balanced Cross Entropy의 시도는 좋았지만, 빈도수의 역수로 가중치를 곱해준다는 아이디어에 문제가 있었습니다. 빈도수는 학습 진행상황과 관계없이 고정되어 있잖아요. 우리는 모델의 학습 상태에 따라, 즉 ‘문제의 난이도’에 따라 달라지는 가중치가 필요합니다. 정확히는 물체의 난이도에 비례하는 가중치가 필요하죠. 왜냐하면 쉬운 문제는 덜 학습하고, 어려운 문제에만 집중하도록 유도해줘야 하니까요.
따라서 Balanced Cross Entropy Loss를 이렇게 수정해 줄 수 있습니다.
가중치 𝛼가 1-p로 변경된 모습을 볼 수 있습니다. 즉 난이도에 비례하도록 세팅해 주었습니다. (p가 1에 가까울수록 쉬운 문제, 작은 가중치) 또 𝛾가 승수로 곱해져 있는데요. 이는 Focusing parameter로, 우리의 의도를 얼마나 더 강하게 반영할지를 결정하는 변수라고 생각하면 됩니다. 이렇게 난이도에 비례하는 가중치를 곱해준 Cross Entropy Loss를 Focal Loss라고 합니다.
4-3. 실험 결과
Focal Loss는 어떤 효과가 있는지 RetinaNet 논문에서 제시한 Loss 그래프를 통해 비교해 보겠습니다.
먼저 파란색 그래프는 𝛾가 0인, 즉 일반적인 Cross Entropy Loss를 의미합니다. 나머지 빨간색, 주황색, 보라색, 초록색 그래프는 𝛾값에 따른 Focal Loss를 의미합니다. 결과를 보면 Focal Loss 그래프가 Cross Entropy Loss보다 아래에 깔려있는 모습을 볼 수 있습니다. 이는 특히 쉬운 문제들 (p가 큰 상황)에서 받아야 하는 loss를 효과적으로 낮춰주는 모습을 볼 수 있습니다. 반면 어려운 문제들 (p가 작은 상황)에서는 다시 급격하게 값이 치솟으며 큰 loss를 받는 모습을 볼 수 있습니다. 또한 𝛾의 효과에 대해서도 알 수 있습니다. 𝛾가 클수록 그래프가 아래에 깔리는 모습을 볼 수 있습니다. 이는 ‘𝛾가 클수록 Focal Loss의 효과가 커진다.’라고 해석할 수 있습니다.
5. 파이썬 구현
이번 챕터에서는 Focal Loss를 파이썬을 사용하여 직접 구현해보겠습니다.
5-1. Import Module
먼저 필요한 Module들을 Import 해줍니다.
import torch
import torch.nn as nn
import torch.nn.functional as F
5-2. Focal Loss Class 정의하기
다음으로 Focal Loss Class를 정의하겠습니다. Focal Loss는 기본적으로 Cross Entropy Loss로 구성되어 있으며 Label에 따라 가중치를 적용하는 방법입니다. 이 부분을 forward 함수에서 확인할 수 있습니다.
class FocalLoss(nn.Module):
def __init__(self, alpha=1.0, gamma=2.0):
super(FocalLoss, self).__init__()
self.alpha = alpha
self.gamma = gamma
def forward(self, inputs, targets):
ce_loss = F.cross_entropy(inputs, targets, reduction='none')
pt = torch.exp(-ce_loss)
focal_loss = self.alpha * (1 - pt)**self.gamma * ce_loss
return focal_loss.mean()
5-3. 사용하기
이렇게 정의한 Focal Loss는 다음과 같이 사용할 수 있습니다.
# Example usage
criterion = FocalLoss(alpha=1.0, gamma=2.0)
6. 의의
다음으로 Focal Loss의 의의에 대해 정리해보겠습니다.
첫 번째 의의는 Class Imbalance 상황에 효과적으로 대처할 수 있는 Loss를 제안했다는 점입니다. Focal Loss는 불균형한 클래스 분포를 가진 데이터셋에서 모델 성능을 향상시키기 위해 고안되었습니다. 일반적인 분류 문제에서는 각 클래스의 샘플 수가 대략적으로 균등하지만, 실제 문제에서는 그렇지 않은 경우가 많습니다. Focal Loss는 이러한 불균형을 해결하기 위해 손실 함수에 가중치를 부여합니다.
두 번째 의의는 어려운 샘플에 집중하는 방법을 제안했다는 점입니다. Focal Loss는 잘못 분류된 샘플에 더 많은 가중치를 부여하여, 모델이 어려운 샘플에 더 집중하도록 만듭니다. 이는 모델이 쉬운 샘플에 너무 많은 주의를 기울이는 것을 방지하고, 전체적으로 더 높은 성능을 달성할 수 있게 합니다.
이 두 가지 의의는 Focal Loss가 단순히 분류 문제를 해결하는 것을 넘어, 불균형한 클래스 분포와 어려운 샘플에 대한 문제를 효과적으로 해결하는 중요한 기술적 발전이라고 할 수 있습니다. 이로 인해 Focal Loss는 객체 탐지, 의료 이미징 등 다양한 분야에서 널리 사용되고 있습니다.
7. 정리
지금까지 Object Detection와 Class Imbalance의 관계부터 시작해서 Cross Entropy Loss의 한계, Balanced Cross Entropy의 도입과 한계, Focal Loss 방법까지 살펴봤습니다.
이에 대한 내용을 정리해 보겠습니다.
먼저 Cross Entropy Loss는 Class Imbalance 상황에서는 힘을 발휘하지 못합니다. 쉬운 문제에서는 작은 loss를 받지만 그 개수가 많아 loss의 총합은 크고, 어려운 문제에서는 큰 loss를 받지만 그 개수가 적어 loss의 총합은 작습니다. 따라서 모델이 쉬운 문제에만 집중하여 학습해 정작 학습해야 하는 어려운 문제는 학습이 안되기 때문이죠.
그래서 제안된 방법이 Balanced Cross Entropy Loss입니다. 이는 Cross Entropy Loss에 빈도수에 반비례하는 가중치를 곱해준 Loss Function입니다. 빈도수가 적은 문제의 개수가 적은 게 문제이니, 큰 가중치를 곱해서 밸런스를 맞춰주자는 아이디어였죠. 이러한 방법은 학습 초기에는 효과를 발휘합니다. 하지만 학습이 진행됨에 따라 어려운 문제에서 받는 loss가 작아지면서 다시 밸런스가 무너진다는 문제가 있죠.
그래서 제안된 방법이 이번 글의 주제인 Focal Loss입니다. Focal Loss는 빈도수가 아닌 문제의 난이도에 따라 다른 Loss를 적용하자는 것이 핵심 아이디어입니다. 난이도가 어려우면 큰 가중치를, 쉬우면 적은 가중치를 적용해 어려운 문제에 더 집중하도록 만들어주자는 것이죠. 아주 간단한 아이디어이지만 Focal Loss는 Class Imbalance 문제에 아주 효과적으로 대처하는 Loss Function 중 하나입니다. 이후 Class Imbalance 연구에도 큰 영향을 주었습니다.
8. 마치며
이렇게 Focal Loss에 대한 여행을 마치며, 이 글이 여러분에게 도움이 되었기를 바랍니다. 본 글에서는 Object Detection과 Class Imbalance 문제를 근본적으로 이해하고, 이를 해결하기 위한 Focal Loss에 대해 깊이 있게 탐구하였습니다. Balanced Cross Entropy의 한계를 넘어, Focal Loss를 통해 어려운 샘플에 집중하는 방법을 제안하였으며, 이를 파이썬으로 구현하는 방법까지 상세히 안내하였습니다.
본 글은 초보자의 입장에서 쉽게 접근할 수 있도록 구성되어 있으며, 수식과 함께 정확한 이해를 돕기 위해 노력하였습니다. 이를 통해 여러분은 Focal Loss의 본질을 깊이 있게 이해할 수 있을 것입니다. 또한, 본 글을 통해 여러분은 Class Imbalance 문제를 효과적으로 해결할 수 있는 다양한 방법에 대해 학습하였습니다.
하지만 여기서 끝이 아닙니다. Focal Loss와 관련된 다양한 연구와 기법이 계속해서 발표되고 있습니다. 여러분은 본 글을 바탕으로 이 분야의 최신 연구를 계속해서 탐구하고, 더욱 효과적인 방법을 찾아 나아갈 수 있습니다. 여러분의 지속적인 학습과 연구를 응원합니다!
유익한 내용이였고 이해가 쉽게되는 설명에 매우 감사를 표합니다.
저는 지금 세그멘테이션 로스를 공부중이지만 대부분의 로스펑션이
객체 탐지에서 출발했다는 것을 한번 더 생각해봐야겠네요
맞아요! Segmentation이든 Object Detection이든 Input Image로부터 서론 다른 특성을 추출하기 위해 Architecture 구조가 분화되었을뿐, 핵심 내용은 동일합니다!