faster rcnn代码解读参考
:https://github.com/adityaarun1/pytorch_fast-er_rcnn
https://github.com/jwyang/faster-rcnn.pytorch
最后一个环节就是需要串联loss
def faster_rcnn_loss(self):
'''
rpn_cls_score: [batch, feat_h, feat_w ,(num_anchors * 2)]
rpn_labels : [batch, 1,num_anchors*feat_height, feat_width]
:return:
'''
# [batch , feat_w , 2, num_anchors*feat_h]->[batch , num_anchors*feat_h,feat_w , 2]
self.rpn_loss_cls = 0
self.rpn_loss_bbox = 0
self.rcnn_loss_cls = 0
self.rcnn_loss_bbox = 0
self.loss = 0
self.rpn_labels = self.rpn_labels.to(self.rpn_cls_score_reshape.device).long()
batch = self.rpn_labels.shape[0]
rpn_cls_score_reshape = self.rpn_cls_score_reshape.view(batch, -1, 2)
rpn_label_reshape = self.rpn_labels.view(batch, -1)
rpn_keep = Variable(rpn_label_reshape.view(-1).ne(-1).nonzero().view(-1))
rpn_cls_score_reshape = torch.index_select(rpn_cls_score_reshape.view(-1, 2), 0, rpn_keep)
rpn_label_reshape = torch.index_select(rpn_label_reshape.view(-1), 0, rpn_keep.data)
# classification loss
# print(self.rpn_cls_score.shape,self.rpn_labels.shape)
'''
rpn_cls_score : [batch, 256, 2]
rpn_labels : [batch, 256]
'''
self.rpn_loss_cls = F.cross_entropy(rpn_cls_score_reshape, rpn_label_reshape)
# bounding box regression L1 loss
# print(self.rpn_bbox_pred.is_cuda, self.rpn_bbox_targets.is_cuda, self.rpn_bbox_inside_weights.is_cuda, self.rpn_bbox_outside_weights.is_cuda)
self.rpn_bbox_targets = self.rpn_bbox_targets.to(self.rpn_bbox_pred.device)
self.rpn_bbox_inside_weights = self.rpn_bbox_inside_weights.to(self.rpn_bbox_pred.device)
self.rpn_bbox_outside_weights = self.rpn_bbox_outside_weights.to(self.rpn_bbox_pred.device)
self.rpn_loss_bbox = smooth_l1_loss(self.rpn_bbox_pred, self.rpn_bbox_targets, self.rpn_bbox_inside_weights, self.rpn_bbox_outside_weights,sigma=3.0,
dim=[1, 2, 3])
# classification loss
self.rcnn_labels = self.rcnn_labels.to(self.rcnn_cls_score.device).long()
rcnn_labels_reshape = self.rcnn_labels.view(-1)
rcnn_cls_score_reshape = self.rcnn_cls_score.view(-1,self.nclasses)
self.rcnn_loss_cls = F.cross_entropy(rcnn_cls_score_reshape, rcnn_labels_reshape)
# bounding box regression L1 loss
self.rcnn_loss_bbox = smooth_l1_loss(self.rcnn_bbox_pred, self.rcnn_bbox_targets, self.rcnn_bbox_inside_weights, self.rcnn_bbox_outside_weights)
self.loss = self.rpn_loss_cls + self.rpn_loss_bbox + self.rcnn_loss_cls + self.rcnn_loss_bbox
return self.rpn_loss_cls, self.rpn_loss_bbox, self.rcnn_loss_cls, self.rcnn_loss_bbox, self.loss
这里的loss涉及到一些reshape,让人头疼,说实话我也没仔细看。
另外就是在实际的训练过程中,请注意一些Python编写变量需要包一层Variable,因为需要求导么。