faster-rcnn
faster-rcnn loss主要分爲兩個部分RPN的loss和fast-rcnn部分的loss:
1.rpn loss
分爲兩個部分,其中cls就是BCE loss,而reg用的是smooth L1 loss
爲什麼使用這種loss,文章中的說法是對異常點更加魯棒,x大於1之後,梯度都是常量了。這邊要注意的就是,他並不是對(x,y,w,h)原值進行迴歸,(x,y)使用對應的b-box進行了normalize,(w,h)也是用b-box對應的參數相除之後求對數。我的理解是做歸一化後,達到同一尺度,可以加快訓練或者提升訓練效果。
2.faster-rcnn loss
基本上跟rpn的loss差不多,要注意的就是rpn分類只分前後景,這邊會分所有類別。
還有個想說的就是:
rpn在feature map 的同一個位置上,不同的anchors都用相同的feature,而在fast-rcnn部分,會根據proposals的size去做roipooling。
yolov3
yolo這邊除了v1,v2和v3都沒有在論文裏面把loss具體寫出來,這邊主要根據源碼詳述一下yolov3的loss。
這邊迴歸的loss就比較粗糙,直接是sum square error,雖然w,h加了個root,但是loss還是對小物體不友好。
關於V3的loss,我這邊大概描述一下,具體的可參考:https://blog.csdn.net/weixin_42078618/article/details/85005428
其中t是我們的預測值,b是我們的目標值。
但是根據源碼,(x,y)的預測值更像是sigmoid(t),而不是t。
各個loss
xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[..., 0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh - raw_pred[..., 2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) + (1 - object_mask) * K.binary_crossentropy(object_mask, raw_pred[..., 4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[..., 5:], from_logits=True)
比較奇怪的就是xy_loss爲什麼會用交叉熵,我的理解就是xy經過sigmoid也縮放到了0-1,所以可以。
wh_loss就是square loss。
置信度就是一個BCE。
分類loss就是多個BCE(因爲是多個二分類,文章中說使用softmax並沒有產生一個比較好的結果,我覺得還有可能是V2中9000多類不互斥吧)。
SSD
基本上跟faster-rcnn一致吧,沒什麼特別的改動。smoothL1加softmax