faster-rcnn、yolov3和ssd loss總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章