본문 바로가기

개발/딥러닝

[논문 구현] SSD: Single Shot MultiBox Detector 로스 구현

 

 

우선 이 전에 만든 AnchorBox 레이어는 제거해 주도록 하겠습니다. 로스를 계산할 때 필요할 줄 알았는데 로스를 계산할 때가 아니라 데이터 전처리 단계에서 진행하는 것이 훨씬 좋을 것 같네요. 각각의 anchorbox마다 양성인지 아닌지, 양성이면 어떤 객체인지 IOU를 기반으로 전부 작성해 주고 loss를 계산해 줍니다.

 

이제 로스를 구현해 보겠습니다.

논문에서는 smoothL1 로스를 사용했습니다.

 

로스는 다음과 같이 생겼습니다. -0.5 ~ 0.5까지는 $\frac {x^2}{2}$, 나머지는 $\left\vert x \right\vert - 0.5$ 를 사용합니다. 모든 곳에서 미분 가능하게 하기 위해서인 것 같습니다.

아래와 같이 계산합니다. tf.를 사용해 줘야 나중에 학습이 가능합니다. 그냥 if문으로 하면 학습이 안됩니다.

 

분류 문제를 풀기 위한 log loss를 정의합니다. tf.maximum은 0인 값을 없애기 위함입니다.

 

이제 로스를 계산해 봅시다. 우선 양성, 음성 상관없이 전부 각 로스를 구해줍니다.

 

각 상자가 양성인지 음성인지 분류합니다.

 

양성 로스와 음성 로스를 따로 나눠줍니다. 논문에서 음성 로스는 양성 로스의 3배 정도로 세팅했다고 하니 음성 로스 개수도 정해줍니다.

 

음성 로스 중 로스가 가장 큰 것 몇 개만 뽑아 계산해 줍니다.

 

이제 필요한 정보를 전부 더해줍니다.

 

이렇게 하면 모델을 학습시킬 수 있습니다.