Before Review
오랜만에 object detection 관련 주제로 Review를 다루게 됐습니다.
사실 방학때 이제 비디오팀 논문 작업을 위해서 비디오 관련 논문을 읽는 것도 중요하지만 , 당장 다음주 부터 하계 URP가 시작될 것이고 이에 대비해 Detection 관련 기억을 다시 되살려보고자 Detection 관련 논문을 읽게 됐습니다.
Focal Loss 같은 경우는 제가 URP를 진행할 때 PD 개선 방향으로 간단하게 알아만 봤던 주제인데 , 이번 Review를 통해서 기존의 One-Stage Detector가 가지고 있던 문제점들이 어떤 식으로 개선이 됐는 지 파악할 수 있게 되었습니다.
Review 시작하도록 하겠습니다.
Introduction
이 논문이 발표되는 시기에는 R-CNN 계열의 two-stage detector가 정확도 측면에서는 좋은 성능들을 보여주고 있었습니다. 이와 대비해서 one-stage detector는 two stage detector와 비교했을 때는 더 빠르고 간단한 구조를 보여주지만 , two-stage에 비해서는 낮은 정확도를 보여주고 있었습니다.
본 논문에서는 one-stage detector의 정확도가 낮은 이유를 극단적인 foreground – background class imbalance 문제로 인해 발생한다 라고 주장하고 있습니다.
이 imbalance 문제가 무엇이냐면 쓸모없는 background box들이 one stage detector에는 너무 많다는 점입니다.
이러한 box들이 너무 많아서 학습 과정을 압도해버리는 점이 one stage detector의 문제라고 얘기하고 있습니다.
이러한 점을 해결하기 위해서 본 논문에서는 Cross-Entropy Loss를 조금 수정하는 방식으로 접근하고 있는 데 , 핵심 아이디어는 분류가 얼마나 잘 되는지에 따라서 가중치를 부여해 학습을 진행하는 것입니다.
뒷 부분에서 자세히 설명하겠지만 , 결국 이러한 방식은 좀 더 hard negative한 sample들에 더 높은 가중치를 줘서 , 집중적으로 학습 시키고 , easy negative들이 (background) 학습을 overwhelm 하는 상황을 방지해준다고 합니다. 사실 , 여기 까지 읽어 봤을 때는 뭔가 hard negative mining으로도 충분히 해결가능한 것이 아닌가 라는 의문이 들긴 하지만 계속 해서 읽어보도록 하겠습니다.
참고로 이러한 방식을 평가하기 위해 Retinanet이라는 Feature Pyramid Network(FPN) 계열의 새로운 Detector를 설계했다고 합니다.
정리하자면 본 논문에서는 Two – stage Detector와 견줄만한 혹은 능가하는 One – Stage Detector를 고려하고 싶었고 , 이 상황을 타개하기 위해 Class – Imbalance라는 문제를 정의했으며 , 이러한 문제점을 해결할 수 있는 Focal Loss를 도입해 One Stage Detector를 가지고 SOTA를 찍었다는 것이 본 논문의 Contribution이라고 합니다.
Class Imbalance
사실 , two-stage Detector에 대해서는 아는 게 별로 없어서 , 본 논문에서 서술하고 있는 Two-Stage Class Imbalance 문제에 대해서는 잘 이해를 하지 못했습니다.
단순하게 내용만 받아들인다면 , two-stage Detector의 Selective Search , EdgeBoxes , DeepMask , RPN 등등의 구조는 candidate object의 위치수를 빠르게 좁힘으로써 , background sample들의 필터링이 많이 이루어진다고 합니다.
이와 반대로 One-Stage Detector 같은 경우는 우선 candidate box들을 많이 만들어내야 하다 보니 , 이러한 점으로 인해 BackGround sample들이 많이 생성되고 Class-Imbalance 문제가 심해지게 됩니다.
그래서 앞에서 살짝 언급했다시피 , 본 논문에서는 이러한 상황을 타개하기 위한 새로운 Loss 함수를 도입합니다.
이 새로운 Loss함수는 잘 분류되는 case에 대해서는 Loss를 0으로 수렴시키면서 영향력을 약화시키고 , 좀 더 어려운 case에 대해서 집중적으로 다루도록 해주는 Loss입니다.
사실 본 논문에서 제시하는 Focal Loss의 정확한 형태를 따라하는 것은 중요한 것이 아니고 , 위에서 설명한 아이디어를 적용할 수 있는 형태라면 비슷한 결과를 얻어낼 수 있다고 합니다.
그렇다면 이제 , 계속해서 언급했던 Focal Loss가 무엇인지 알아보도록 하겠습니다.
Focal Loss
아까 Introduction 부분에서 Class Imbalance 문제는 Hard Negative mining으로도 해결가능한 거 아닌가라는 의문을 가졌는 데 , Focal Loss 도입부에서 이러한 언급이 간단하게 나와있습니다.
Class Imbalance 문제를 Hard Negative Mining으로도 해결할 수 있지만 , Focal Loss를 도입하면 자연스럽게 Hard Negative Mining을 적용시켜주는 방식이라 , 좀 더 좋은 접근 방식으로 소개하고 있는 것 같습니다. 사실 아직까지는 느낌이 확 오지는 않아서 후에 Experiments 부분을 읽을 때 Focal Loss를 도입했을 때와 , 도입하지 않고 Hard Negative mining만 적용했을 때의 실험결과가 있다면 주의깊게 볼 필요가 있을 것 같습니다.
- Binary Cross Entropy Loss
y에 해당하는 값은 1 , -1 값 둘 중 하나이며 , p 는 모델이 class label을 y=1 이렇게 예측할 확률입니다.
Binary Classification이므로 다음과 같이 p_{t} 라는 값을 정의할 수 있습니다.
y = 1 일때 P , 그게 아니라면 1 – P 이런식으로 베르누이 시행으로 표기할 수 있습니다.
결국에는 아래와 같이 BCE Loss를 다음과 같이 표기할 수 있습니다.
이렇게 고안된 BCE Loss 같은 경우는 p_{t} > 0.5 인 즉 , 쉽게 분류할 수 있는 sample들이 만들어 내는 Loss값이 꽤 있다고 합니다. 본 논문에서는 이렇게 표현하고 있습니다.
” One notable property of this loss, which can be easily seen in its plot, is that even examples that are easily clas- sified (pt ≫ .5) incur a loss with non-trivial magnitude. When summed over a large number of easy examples, these small loss values can overwhelm the rare class. “
우리는 이러한 쉬운 Sample 들을 무시하고 싶기 때문에 이들이 만들어내는 Loss를 0으로 설계하고 싶은 상황이고 다음과 같은 Scaling 과정을 통해 Focal Loss가 정의 됩니다.
- Focal Loss Definition
이해하는 것은 제가 계속해서 언급했던 아이디어만 상기시키고 있다면 단번에 이해할 수 있는 내용입니다.
- Easy sample이라면 학습에 별로 도움이 안되는 친구이고 우리는 이녀석의 Loss를 0으로 보내버리고 싶다.
- Hard sample이라면 어려운 예제로 집중적으로 학습해야하는 대상으로써 이녀석의 Loss를 키움으로 써 중점적으로 다루고 싶다.
이러한 개념이 (1-p_{t})^{\gamma } 여기에 녹아져 있습니다.
p_{t} 이녀석이 크다는 의미는 분류가 쉬운 예제이므로 (1-p_{t})^{\gamma } 값은 작아지게 되므로 Loss는 0에 가까워지게 됩니다.
반대로 p_{t} 이녀석이 작다는 의미는 분류가 어려운 예제이므로 (1-p_{t})^{\gamma } 값은 작아지게 되므로 Loss는 기존값보다 커지게 됩니다.
딱 원하는 상황이 나오게 됐습니다. 이러한 메커니즘으로 극단적으로 쉬운 예제들은 Loss가 거의 0으로 수렴하게 되며 , Gradient들이 전달되지 않게 되므로 학습에 영향을 주지 않습니다.
그래프를 확인했을 때 파란색 그래프(\gamma =0) 인 그래프가 기존 Cross Entropy Loss에 해당하며 , well-classified example들 쉬운 예제들에 대해서도 Loss값이 꽤나 존재하는 것을 확인할 수 있고
다른 그래프들 Focal Loss가 적용된 그래프들은 well classified example들에 대해서는 Loss값이 거의 없는 것을 확인할 수 있습니다.
Focal Loss는 이렇게 간단하게 알아 볼 수 있었습니다. 이제 본 논문에서 고안된 RetinaNet에 대해서 간단하게 알아보고 Experiment들을 살펴보도록 하겠습니다.
RetinaNet Detector
본 논문에서 Focal Loss를 평가하기 위해 고안된 RetinaNet은 Foward 과정에서는 ResNet을 사용하고 있으며 Backbone으로는 FPN 구조를 사용하고 있습니다.
FPN 구조가 무엇인지 기억이 잘 안나서 찾아봤는 데 간단히 설명드리면 , 상단 layer의 feature map과 하단 layer의 feature map들을 skip connection을 통해 multi-scale detection task를 수행해주는 구조라고 보시면 되겠습니다.
그림을 확인하시면 이해에 더욱 도움이 될 것 같습니다.
FPN 구조에 대해서 잘 알고 있었다면 본 Network를 이해하는 데 큰 어려움은 없을거라 생각이 듭니다.
그리고 Classification 과 Bounding Box Regression에 대한 각각의 Subnet으로 나뉘게 됩니다.
Experiments
먼저 그래프를 확인해보면 다음과 같은 데 살펴보자면
x 축은 inference time으로 클수록 빠르다는 의미이며 , y축은 COCO AP로 정확도로 생각하시면 되겠습니다.
한눈에 알 수 있듯이 , 본 Paper에서 제안한 RetinaNet이 다른 Two-stage Detector 보다도 더 높은 정확도와 빠른 속도를 챙기면서 SOTA를 달성했음을 확인할 수 있습니다.
Table로도 구체적인 성능을 확인할 수 있으며 역시나 SOTA를 달성하고 있습니다.
참고로 최적의 \gamma 와 \alpha 은 실험을 통해 찾았다고 합니다.
제가 확인해보고 싶었던 실험 결과도 Reporting이 되어 있더라구요 바로 Hard Negative mining vs Focal Loss입니다.
결론 부터 말하면 Focal Loss를 도입하는 게 더 성능이 좋다고 합니다.
OHEM은 online hard example mining의 준말로 , 다양한 조건으로 OHEM을 진행했을 때와 Focal Loss를 사용했을 때 성능을 비교해봐도 Focal Loss가 더 좋은 성능을 보여주고 있습니다.
개념적으로는 둘 다 비슷한거 같지만 , 본 논문에서 강조하는 둘의 차이점은 다음과 같습니다.
Focal Loss는 easy sample들의 영향력을 줄이는 것이지 , 아예 제외 시켜버리는 것은 아닙니다. 하지만 OHEM은 easy example들에 대해서는 제외를 시켜버리는 구조로써 이러한 차이점이 있다고 합니다.
Conclusion
URP에서 궁금해 했던 Focal Loss에 대해서 다뤄보게 된 리뷰였으며 추가적으로 Detection에 대한 간단한 복습까지 할 수 있었습니다. Focal Loss를 살펴본 결과 간단한 아이디어 이면서도 좋은 Performance를 보여주는 것을 확인할 수 있었습니다.
Focal Loss 같은 경우는 github 이런 곳에 공개된 소스코드도 많다 보니 시간 날 때 SSD에 적용해서 성능이 어느정도 나오는 지 파악해보는 것도 좋을 것 같습니다.
좋은 리뷰 감사합니다. 덕분에 평소에 궁금해하던 Hard Negative Mining 과 Focal Loss의 차이를 명확하게 알 수 있었습니다.
질문이 하나 있는데, Experiments 부분 “x 축은 inference time으로 클수록 빠르다는 의미”라고 하셨는데…
클수록 느리다는 것 아닌가요 …?
아, 그리고 마지막 결론에서 말씀하신 것처럼 “Focal Loss 같은 경우는 공개된 소스코드가 많다”고 하셨으니,
하계 URP가 시작되기 전에 Hard Negative Mining 과 Focal Loss의 성능 차이에 대한 베이스라인을 잡아주시면 좋을 것 같네요 ㅎㅎ !