Exemplo n.º 1
0
        def loss(self, proposal_classes: Tensor, proposal_transformers: Tensor,
                 gt_proposal_classes: Tensor, gt_proposal_transformers: Tensor,
                 batch_size, batch_indices) -> Tuple[Tensor, Tensor]:
            proposal_transformers = proposal_transformers.view(-1, self.num_classes, 4)[torch.arange(end=len(proposal_transformers), dtype=torch.long), gt_proposal_classes]
            transformer_normalize_mean = self._transformer_normalize_mean.to(device=gt_proposal_transformers.device)
            transformer_normalize_std = self._transformer_normalize_std.to(device=gt_proposal_transformers.device)
            gt_proposal_transformers = (gt_proposal_transformers - transformer_normalize_mean) / transformer_normalize_std  # scale up target to make regressor easier to learn

            cross_entropies = torch.empty(batch_size, dtype=torch.float, device=proposal_classes.device)
            smooth_l1_losses = torch.empty(batch_size, dtype=torch.float, device=proposal_transformers.device)

            for batch_index in range(batch_size):
                selected_indices = (batch_indices == batch_index).nonzero().view(-1)

                cross_entropy = F.cross_entropy(input=proposal_classes[selected_indices],
                                                target=gt_proposal_classes[selected_indices])

                fg_indices = gt_proposal_classes[selected_indices].nonzero().view(-1)
                smooth_l1_loss = beta_smooth_l1_loss(input=proposal_transformers[selected_indices][fg_indices],
                                                     target=gt_proposal_transformers[selected_indices][fg_indices],
                                                     beta=self._proposal_smooth_l1_loss_beta)

                cross_entropies[batch_index] = cross_entropy
                smooth_l1_losses[batch_index] = smooth_l1_loss

            return cross_entropies, smooth_l1_losses
Exemplo n.º 2
0
    def loss(self, anchor_objectnesses: Tensor, anchor_transformers: Tensor,
             gt_anchor_objectnesses: Tensor, gt_anchor_transformers: Tensor,
             batch_size: int, batch_indices: Tensor) -> Tuple[Tensor, Tensor]:
        cross_entropies = torch.empty(batch_size,
                                      dtype=torch.float,
                                      device=anchor_objectnesses.device)
        smooth_l1_losses = torch.empty(batch_size,
                                       dtype=torch.float,
                                       device=anchor_transformers.device)

        for batch_index in range(batch_size):
            selected_indices = (
                batch_indices == batch_index).nonzero().view(-1)

            cross_entropy = F.cross_entropy(
                input=anchor_objectnesses[selected_indices],
                target=gt_anchor_objectnesses[selected_indices])

            fg_indices = gt_anchor_objectnesses[selected_indices].nonzero(
            ).view(-1)
            smooth_l1_loss = beta_smooth_l1_loss(
                input=anchor_transformers[selected_indices][fg_indices],
                target=gt_anchor_transformers[selected_indices][fg_indices],
                beta=self._anchor_smooth_l1_loss_beta)

            cross_entropies[batch_index] = cross_entropy
            smooth_l1_losses[batch_index] = smooth_l1_loss

        return cross_entropies, smooth_l1_losses
Exemplo n.º 3
0
        def loss(self, proposal_classes: Tensor, proposal_transformers: Tensor,
                 gt_proposal_classes: Tensor, gt_proposal_transformers: Tensor,
                 batch_size, batch_indices) -> Tuple[Tensor, Tensor]:

            # proposal_classes@(bn*128,num_cls)
            # proposal_transformers@(bn*128,4*num_cls)
            # gt_proposal_classes@(128,)
            # gt_proposal_transformers@(bn*128,4*num_cls)
            # batch_size 通常为1,因此batch_indices就是1*128个0

            #由于proposal_transformers对于所有num_cls都生成了4个变换,总计有4*num_cls个预测变换,这里要根据 gt_proposal_classes 只选择有label的预测变换,因此:
            #proposal_transformers:(bn*128,84)-->(bn*128,4)
            proposal_transformers = proposal_transformers.view(
                -1, self.num_classes, 4
            )[torch.arange(end=len(proposal_transformers), dtype=torch.long),
              gt_proposal_classes]
            #对 gt_proposal_transformers 进行正则化处理
            transformer_normalize_mean = self._transformer_normalize_mean.to(
                device=gt_proposal_transformers.device)
            transformer_normalize_std = self._transformer_normalize_std.to(
                device=gt_proposal_transformers.device)
            gt_proposal_transformers = (
                gt_proposal_transformers - transformer_normalize_mean
            ) / transformer_normalize_std  # scale up target to make regressor easier to learn

            cross_entropies = torch.empty(batch_size,
                                          dtype=torch.float,
                                          device=proposal_classes.device)
            smooth_l1_losses = torch.empty(batch_size,
                                           dtype=torch.float,
                                           device=proposal_transformers.device)

            for batch_index in range(batch_size):
                #batch_indices@(bn*128)
                #由于bn常取1,因此下面的selected_indices相当于选择整个批
                selected_indices = (
                    batch_indices == batch_index).nonzero().view(-1)

                #1.使用交叉熵计算pc和gpc之间的损失
                cross_entropy = F.cross_entropy(
                    input=proposal_classes[selected_indices],
                    target=gt_proposal_classes[selected_indices])

                #2.使用smooth_l1计算前景pt和gpt之间的损失
                fg_indices = gt_proposal_classes[selected_indices].nonzero(
                ).view(-1)
                smooth_l1_loss = beta_smooth_l1_loss(
                    input=proposal_transformers[selected_indices][fg_indices],
                    target=gt_proposal_transformers[selected_indices]
                    [fg_indices],
                    beta=self._proposal_smooth_l1_loss_beta)

                cross_entropies[batch_index] = cross_entropy
                smooth_l1_losses[batch_index] = smooth_l1_loss

            return cross_entropies, smooth_l1_losses
Exemplo n.º 4
0
        def loss(self, proposal_classes, proposal_transformers,
                 gt_proposal_classes, gt_proposal_transformers, batch_size,
                 batch_indices):
            '''
            Only take the loss from the correct class from the bounding box regressor
            scale up target to make regressor easier to learn
            '''
            proposal_transformers = proposal_transformers.view(
                -1, self.num_classes,
                4)[torch.arange(len(proposal_transformers)),
                   gt_proposal_classes]
            transformer_normalize_mean = self._transformer_normalize_mean.to(
                device=gt_proposal_transformers.device)
            transformer_normalize_std = self._transformer_normalize_std.to(
                device=gt_proposal_transformers.device)
            gt_proposal_transformers = (
                gt_proposal_transformers -
                transformer_normalize_mean) / transformer_normalize_std

            cross_entropies = torch.empty(batch_size,
                                          dtype=torch.float,
                                          device=proposal_classes.device)
            smooth_l1_losses = torch.empty(batch_size,
                                           dtype=torch.float,
                                           device=proposal_transformers.device)

            for batch_index in range(batch_size):
                selected_indices = (
                    batch_indices == batch_index).nonzero().view(-1)
                cross_entropy = F.cross_entropy(
                    input=proposal_classes[selected_indices],
                    target=gt_proposal_classes[selected_indices])
                #                print(selected_indices)
                #                print(gt_proposal_classes)
                fg_indices = gt_proposal_classes[selected_indices].nonzero(
                ).view(-1)
                #                print('fg_indices',fg_indices)
                # with torch.no_grad():
                smooth_l1_loss_ = beta_smooth_l1_loss(
                    input=proposal_transformers[selected_indices][fg_indices],
                    target=gt_proposal_transformers[selected_indices]
                    [fg_indices],
                    beta=self._proposal_smooth_l1_loss_beta)
                #print(smooth_l1_loss_custom)
                #print(proposal_transformers[selected_indices][fg_indices])
                #print(gt_proposal_transformers[selected_indices][fg_indices])
                #smooth_l1_loss_ = smooth_l1_loss(input=proposal_transformers[selected_indices][fg_indices],target=gt_proposal_transformers[selected_indices][fg_indices])
                #print(smooth_l1_loss_)
                cross_entropies[batch_index] = cross_entropy
                smooth_l1_losses[batch_index] = smooth_l1_loss_

            return cross_entropies, smooth_l1_losses
Exemplo n.º 5
0
    def loss(self, anchor_objectnesses: Tensor, anchor_transformers: Tensor,
             gt_anchor_objectnesses: Tensor, gt_anchor_transformers: Tensor,
             batch_size: int, batch_indices: Tensor) -> Tuple[Tensor, Tensor]:

        cross_entropies = torch.empty(batch_size,
                                      dtype=torch.float,
                                      device=anchor_objectnesses.device)
        smooth_l1_losses = torch.empty(batch_size,
                                       dtype=torch.float,
                                       device=anchor_transformers.device)

        for batch_index in range(batch_size):
            #一批一批计算误差.
            #这里因为通常batch_size==1,所以batch_indices总是等与batch_index.相当于对于这唯一的一批是个全选的效果.
            selected_indices = (batch_indices == batch_index).nonzero().view(
                -1)  #(256,).

            #1.使用交叉熵函数计算ao与gao之间损失
            #因为后景对应的label是0,前景对应的label是1,所以ao的第一列(除去batch内索引列)是后景,第二列是前景.
            cross_entropy = F.cross_entropy(
                input=anchor_objectnesses[selected_indices],
                target=gt_anchor_objectnesses[selected_indices])

            #对于transformer只计算前景:由nonzero计算出前景的索引
            #2.使用smooth_l1函数计算前景变换at与gat之间的损失
            fg_indices = gt_anchor_objectnesses[selected_indices].nonzero(
            ).view(-1)  #(fg_n,)
            smooth_l1_loss = beta_smooth_l1_loss(
                input=anchor_transformers[selected_indices][fg_indices],
                target=gt_anchor_transformers[selected_indices][fg_indices],
                beta=self._anchor_smooth_l1_loss_beta)

            cross_entropies[batch_index] = cross_entropy
            smooth_l1_losses[batch_index] = smooth_l1_loss

        return cross_entropies, smooth_l1_losses