NaverBoost Camp 4기/[P stage] Object Detection

[P stage][obj det] Focal loss 와 Cross Entropy에 관하여

쫑쫑JJONG 2022. 11. 26. 06:30
728x90

 

Focal loss가 무엇인지 어떻게 구성이 되었는지를 판단하기 위해

class를 뜯어보았다

 

hyperparameter는 크게 gamma랑 alpha가 있는 것 같다

Cross Entropy Vs  Focal Loss

  • 위 그래프는  가 0 ~ 5 까지 변화할 때의 변화를 나타내며 일 때, Cross Entropy Loss와 같고 가 커질수록 Easy Example에 대한 Loss가 크게 줄어들며 Easy Example에 대한 범위도 더 커집니다.
  • 위 그래프를 통하여 Focal Loss의 속성을 크게 3가지 분류할 수 있습니다.
  • ① 잘못 분류되어  가 작아지게 되면 도 1에 가까워지고  또한 커져서 Loss에 반영됩니다.
  •  가 1에 가까워지면 은 0에 가까워지고 Cross Entropy Loss와 동일하게  값 또한 줄어들게 됩니다.
  •   에서  focusing parameter 라고 하며 Easy Example에 대한 Loss의 비중을 낮추는 역할을 합니다.

https://gaussian37.github.io/dl-concept-focal_loss/

 

Focal Loss (Focal Loss for Dense Object Detection) 알아보기

gaussian37's blog

gaussian37.github.io

 

cross entropy를 쓰려고 한것 이 문제일까 싶어서

Focal loss를 사용하되, 최대한 cross entropy 처럼 만들기 위해 gamma값을 0으로 두고 학습시작

alpha가 어떤 것을 나타내는 건지를 파악을 하지 못하여서 그대로 두었다

(추가로 실험군 고정을 위함도 있음)

학습이 돌아가면서 alpha의 역할이 무엇인지를 찾아보자

(weight 관련 hyperparameter라고 하는데.,,, 흠)

 

train 을 끝내고 inference를 돌려서 json 파일을 만든 다음

git add , git commit을 진행하였다 

 

결과를 비교해 보자 

실험군 : classification의 focal loss의 gamma 값 (0 vs 2 )

다음 결과를 비추어 보았을 때

loss cls를 gamma 2 focal loss를 두었을 때와 CrossEntropy로 두었을 때의 중간 값으로 gamma 0 focal loss가 그려지는 것을 확인할 수 있었다.

하지만 이는 loss_cls을 바꿨을 뿐인데 왜 loss_bbox가 영향을 받는지는 여전히 설명이 불가능하다

 

validation에 대한 mAP를 살펴 보면 gamma 2와 약간의 차이가 있지만 그래프의 모양이

focal loss끼리 유사한 것을 확인할 수 있다.

 

다음 2차 실험을 위해 Focal loss에 관하여 공부를 더 진행해 보았다

 

https://amaarora.github.io/2020/06/29/FocalLoss.html

 

What is Focal Loss and when should you use it?

In this blogpost we will understand what Focal Loss and when is it used. We will also take a dive into the math and implement it in PyTorch. Where was Focal Loss introduced and what was it used for? So, why did that work? What did Focal Loss do to make it

amaarora.github.io

 focal loss의 hyperparameter를 공부하기 위해 위의 링크를 참고

r = 0 을 넣으면 확실하게 Cross -Entropy와 동일한 것을 알 수 있었다

근데 왜 그래프의 모양이 조금 다를까

(전체 개형이 매우 유사한 것으로 보아 alpha는 진폭에 영향을 주는 것이 아닐까 추측을 하였다)

위 사이트에서 엄밀한 Focal loss의 정의를 얻게 되어서 궁금증이 해결이 되었다

 

 rare class에 대해 high weight를 주는 부분이 a 때문인 것 같았다

 

가설

rare class에 high weight를 준다? -> rare class의 검출 확률을 높이는 이유가 이것 때문 아닐까

https://github.com/umbertogriffo/focal-loss-keras/issues/1

다음에서 idea를 얻을 수 있었다

설명하길 alpha의 역활은 진폭을 늘린다기 보다는 slightly improve 할 수 있도록 도와준다고 한다

(이 설명으로 alpha값을 왜 1보다 작은 값을 사용하는지를 알 수 있었다)

 

그러면 본론적인 문제

원소 수가 적은 paper class가 많이 검출되는 문제를 어떻게 해결할 수 있을까?

 

위의 gamma 2, gamma 0, cross Entropy를 적용한 그래프를 비교를 해보았을때

성능은 확실히 Focal loss를 사용하는 것이 좋다

하지만 위의 문제를 해결하기 위해서는 gamma가 아닌 alpha를 줄여야하지 않을까 라는 생각을 하였다

절반으로 줄여서 2차 실험을 진행하여 보자

alpha : 0.25 -> 0.125

실험군 세팅
기대가 되게하네

실제로도 classification쪽 train/loss가 꽤 많이 내려간 것을 볼 수 있다!!! (뿌듯!!)

 

Training을 돌리면서 계속 궁금했던 문제

왜 classification을 건드렸는데 bbox가 바뀔까에 대한 정답을 찾아보자

=> 생각보다 이유는 쉬울 거같은데 Bbox head 안에 있는 loss_cls를 건드려서 아닐까 (1 stage??)

https://velog.io/@heaseo/Focalloss-%EC%84%A4%EB%AA%85

위 블로그를 통해 지금 사용하고 있는 swin dyhead는 1 stage 구조를 가진 것이 아닌가 생각을 하였고

 

model = dict(
    type='ATSS',
    ...........
        init_cfg=dict(type='Pretrained', checkpoint=pretrained)),
        
    neck=[
        ......
    ],
    bbox_head=dict(
        .......
        loss_centerness=dict(
            type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)),
   
   # training and testing settings
    train_cfg=dict(
        ...........
        debug=False),
    test_cfg=dict(
        .......
        nms=dict(type='nms', iou_threshold=0.5),
        max_per_img=100))

 

가정 1

실제로 모델의 구조가 다음과 같이 head 부분이 한개 밖에 존재하지 않으므로 1 stage 구조임을 유추해 볼 수 있다

=> 정확한 내부구조는 아직 파악을 하지 못하였지만 1 stage 구조여서 loss_cls가 bbox에 영향을 준 것 같다.

class를 잘못 분류하면 학습된 class별로 묶을 것이고(종이 -> 철) 이 과정에서 bbox의 위치나 크기가 변화할 것이다.

 

가정 2

loss_cls 가 바뀌면 전체 loss가 바뀌고 Backpropogation이 진행이되면 bbox_loss도 변화할 것이다

 

둘중에 뭘까...... 둘다 아닐 수도 있음...

 

일단 1 stage라는 것은 찾았다.

 

 

 

 

추가정보

pre trained data로 학습된 모델을 가져와서

우리의 data로 돌릴 때 Warm-up을 사용하는 것이 좋다

(아무래도 data가 다르니깐 Gradient가 초반에 엄청 크게 나오기 때문에 lr을 천천히 올려주는 것이 좋을 듯)

 

 

728x90