faster rcnn代码解读(十)faster_rcnn_loss

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,因为需要求导么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值