def compute_loss(self, objectness, pred_bbox_deltas, labels, regression_targets):
        sampled_pos_inds, sampled_neg_inds = self.fg_bg_sampler(labels)
        sampled_pos_inds = torch.where(torch.cat(sampled_pos_inds, dim=0))[0]
        sampled_neg_inds = torch.where(torch.cat(sampled_neg_inds, dim=0))[0]

        sampled_inds = torch.cat([sampled_pos_inds, sampled_neg_inds], dim=0)

        objectness = objectness.flatten()

        labels = torch.cat(labels, dim=0)
        regression_targets = torch.cat(regression_targets, dim=0)

        box_loss = det_utils.smooth_l1_loss(pred_bbox_deltas[sampled_pos_inds], regression_targets[sampled_pos_inds],
            beta = 1/9, size_average = False) / (sampled_inds.numel())

        objectness_loss = F.binary_cross_entropy_with_logits(objectness[sampled_inds], labels[sampled_inds])

        return objectness_loss, box_loss
Пример #2
0
def fastrcnn_loss(class_logits, box_regression, labels, regression_targets):
	# type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]
	"""
	Computes the loss for Faster R-CNN.

	Arguments:
		class_logits (Tensor)
		box_regression (Tensor)
		labels (list[BoxList])
		regression_targets (Tensor)

	Returns:
		classification_loss (Tensor)
		box_loss (Tensor)
	"""

	labels = torch.cat(labels, dim=0)
	regression_targets = torch.cat(regression_targets, dim=0)

	classification_loss = F.cross_entropy(class_logits, labels)

	# get indices that correspond to the regression targets for
	# the corresponding ground truth labels, to be used with
	# advanced indexing
	sampled_pos_inds_subset = torch.nonzero(labels > 0).squeeze(1)
	labels_pos = labels[sampled_pos_inds_subset]
	N, num_classes = class_logits.shape
	box_regression = box_regression.reshape(N, -1, 4)

	box_loss = det_utils.smooth_l1_loss(
		box_regression[sampled_pos_inds_subset, labels_pos],
		regression_targets[sampled_pos_inds_subset],
		beta=1 / 9,
		size_average=False,
	)
	box_loss = box_loss / labels.numel()

	return classification_loss, box_loss
Пример #3
0
    def compute_loss(self, objectness, pred_bbox_deltas, labels,
                     regression_targets):
        # type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]
        """
        Arguments:
            objectness (Tensor)
            pred_bbox_deltas (Tensor)
            labels (List[Tensor])
            regression_targets (List[Tensor])

        Returns:
            objectness_loss (Tensor)
            box_loss (Tensor)
        """

        sampled_pos_inds, sampled_neg_inds = self.fg_bg_sampler(labels)
        sampled_pos_inds = torch.where(torch.cat(sampled_pos_inds, dim=0))[0]
        sampled_neg_inds = torch.where(torch.cat(sampled_neg_inds, dim=0))[0]

        sampled_inds = torch.cat([sampled_pos_inds, sampled_neg_inds], dim=0)

        objectness = objectness.flatten()

        labels = torch.cat(labels, dim=0)
        regression_targets = torch.cat(regression_targets, dim=0)

        box_loss = det_utils.smooth_l1_loss(
            pred_bbox_deltas[sampled_pos_inds],
            regression_targets[sampled_pos_inds],
            beta=1 / 9,
            size_average=False,
        ) / (sampled_inds.numel())

        objectness_loss = F.binary_cross_entropy_with_logits(
            objectness[sampled_inds], labels[sampled_inds])

        return objectness_loss, box_loss