1. 程式人生 > >tensorflow+faster rcnn程式碼理解(三):損失函式構建

tensorflow+faster rcnn程式碼理解(三):損失函式構建

前面兩篇部落格已經敘述了基於vgg模型構建faster rcnn的過程:

tensorflow+faster rcnn程式碼理解(一):構建vgg前端和RPN網路

tensorflow+faster rcnn程式碼解析(二):anchor_target_layer、proposal_target_layer、proposal_layer

 faster rcnn的Loss分為4部分:

1. RPN class loss

構成RPN分類損失的輸入如下,採用softmaxloss:

  • rpn_cls_score_reshape:訓練過程中anchor預測為前景或者背景的分數
  • rpn_label:anchor被標註的類別,前景or背景
# RPN, class loss
rpn_cls_score = tf.reshape(self._predictions['rpn_cls_score_reshape'], [-1, 2]) #rpn_cls_score = (17100,2)
rpn_label = tf.reshape(self._anchor_targets['rpn_labels'], [-1])  #rpn_label = (17100,)
rpn_select = tf.where(tf.not_equal(rpn_label, -1)) #將不等於-1的labels選出來(也就是正負樣本選出來),返回序號
rpn_cls_score = tf.reshape(tf.gather(rpn_cls_score, rpn_select), [-1, 2]) #同時選出對應的分數
rpn_label = tf.reshape(tf.gather(rpn_label, rpn_select), [-1]) #選出對應的label
rpn_cross_entropy = tf.reduce_mean(
                    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=rpn_cls_score, labels=rpn_label))

2. RPN bbox loss

構成RPNbbox迴歸損失的輸入如下,採用SmoothL1Loss:

  • rpn_bbox_pred:訓練過程中預測的anchor偏移量
  • rpn_bbox_targets:anchor與gt實際的偏移量
  • rpn_bbox_inside_weights:anchor內權重
  • rpn_bbox_outside_weights:anchor外權重
# RPN, bbox loss
rpn_bbox_pred = self._predictions['rpn_bbox_pred']
rpn_bbox_targets = self._anchor_targets['rpn_bbox_targets']
rpn_bbox_inside_weights = self._anchor_targets['rpn_bbox_inside_weights']
rpn_bbox_outside_weights = self._anchor_targets['rpn_bbox_outside_weights']

rpn_loss_box = self._smooth_l1_loss(rpn_bbox_pred, rpn_bbox_targets, rpn_bbox_inside_weights,
rpn_bbox_outside_weights, sigma=sigma_rpn, dim=[1, 2, 3])

3. RCNN class loss

構成RCNN分類損失的輸入如下,採用softmaxloss:

  • cls_score:訓練過程中fast rcnn部分rois被預測的類別
  • labels:rois被標註的類別,屬於哪一類
# RCNN, class loss
cls_score = self._predictions["cls_score"]
label = tf.reshape(self._proposal_targets["labels"], [-1])

cross_entropy = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
                logits=tf.reshape(cls_score, [-1, self._num_classes]), labels=label))

4 RCNN bbox loss

構成RCNNbbox迴歸損失的輸入如下,採用SmoothL1Loss:

  • bbox_pred:訓練過程中fast rcnn部分rois預測的偏移量
  • bbox_targets:rois與gt實際的偏移量
  • bbox_inside_weights:rois內權重
  • bbox_outside_weights:rois外權重
# RCNN, bbox loss
bbox_pred = self._predictions['bbox_pred'] #(128,12)
bbox_targets = self._proposal_targets['bbox_targets'] #(128,12)
bbox_inside_weights = self._proposal_targets['bbox_inside_weights']#(128,12)
bbox_outside_weights = self._proposal_targets['bbox_outside_weights']#(128,12)

loss_box = self._smooth_l1_loss(bbox_pred, bbox_targets, bbox_inside_weights, bbox_outside_weights)