Example #1
0
 def __call__(self, pred_keypoint_logits, pred_instances):
     # just return the keypoint heatmap for now,
     # there will be option to call HeatmapMaxKeypointOp
     output = alias(pred_keypoint_logits, "kps_score")
     if all(isinstance(x, InstancesList) for x in pred_instances):
         assert len(pred_instances) == 1
         if self.use_heatmap_max_keypoint:
             device = output.device
             output = torch.ops._caffe2.HeatmapMaxKeypoint(
                 to_device(output, "cpu"),
                 pred_instances[0].pred_boxes.tensor,
                 should_output_softmax=True,  # worth make it configerable?
             )
             output = to_device(output, device)
             output = alias(output, "keypoints_out")
         pred_instances[0].pred_keypoints = output
     return pred_keypoint_logits
Example #2
0
 def __call__(self, pred_mask_logits, pred_instances):
     """ equivalent to mask_head.mask_rcnn_inference """
     if all(isinstance(x, InstancesList) for x in pred_instances):
         assert len(pred_instances) == 1
         mask_probs_pred = pred_mask_logits.sigmoid()
         mask_probs_pred = alias(mask_probs_pred, "mask_fcn_probs")
         pred_instances[0].pred_masks = mask_probs_pred
     else:
         mask_rcnn_inference(pred_mask_logits, pred_instances)
Example #3
0
    def __call__(self, fastrcnn_outputs, score_thresh, nms_thresh,
                 topk_per_image):
        """ equivalent to FastRCNNOutputs.inference """
        assert isinstance(fastrcnn_outputs.proposals, Boxes)
        input_tensor_mode = fastrcnn_outputs.proposals.tensor.shape[1] == 5

        class_logits = fastrcnn_outputs.pred_class_logits
        box_regression = fastrcnn_outputs.pred_proposal_deltas
        class_prob = F.softmax(class_logits, -1)

        assert box_regression.shape[1] % 4 == 0
        cls_agnostic_bbox_reg = box_regression.shape[1] // 4 == 1

        device = class_logits.device

        im_info = (torch.Tensor(
            [[sz[0], sz[1], torch.Tensor([1.0])]
             for sz in fastrcnn_outputs.image_shapes]).to(device) if
                   not input_tensor_mode else fastrcnn_outputs.image_shapes[0])

        rois_n4 = fastrcnn_outputs.proposals.tensor
        device, dtype = rois_n4.device, rois_n4.dtype
        if not input_tensor_mode:
            batch_ids = cat(
                [
                    torch.full((b, 1), i, dtype=dtype, device=device)
                    for i, b in enumerate(fastrcnn_outputs.num_preds_per_image)
                ],
                dim=0,
            )
            rois = torch.cat([batch_ids, rois_n4], dim=1)
        else:
            rois = fastrcnn_outputs.proposals.tensor

        roi_pred_bbox, roi_batch_splits = torch.ops._caffe2.BBoxTransform(
            to_device(rois, "cpu"),
            to_device(box_regression, "cpu"),
            to_device(im_info, "cpu"),
            weights=fastrcnn_outputs.box2box_transform.weights,
            apply_scale=True,
            rotated=False,
            angle_bound_on=True,
            angle_bound_lo=-90,
            angle_bound_hi=90,
            clip_angle_thresh=1.0,
            legacy_plus_one=False,
        )
        roi_pred_bbox = to_device(roi_pred_bbox, device)
        roi_batch_splits = to_device(roi_batch_splits, device)

        nms_outputs = torch.ops._caffe2.BoxWithNMSLimit(
            to_device(class_prob, "cpu"),
            to_device(roi_pred_bbox, "cpu"),
            to_device(roi_batch_splits, "cpu"),
            score_thresh=float(score_thresh),
            nms=float(nms_thresh),
            detections_per_im=int(topk_per_image),
            soft_nms_enabled=False,
            soft_nms_method="linear",
            soft_nms_sigma=0.5,
            soft_nms_min_score_thres=0.001,
            rotated=False,
            cls_agnostic_bbox_reg=cls_agnostic_bbox_reg,
            input_boxes_include_bg_cls=False,
            output_classes_include_bg_cls=False,
            legacy_plus_one=False,
        )
        roi_score_nms = to_device(nms_outputs[0], device)
        roi_bbox_nms = to_device(nms_outputs[1], device)
        roi_class_nms = to_device(nms_outputs[2], device)
        roi_batch_splits_nms = to_device(nms_outputs[3], device)
        roi_keeps_nms = to_device(nms_outputs[4], device)
        roi_keeps_size_nms = to_device(nms_outputs[5], device)
        if not self.tensor_mode:
            roi_class_nms = roi_class_nms.to(torch.int64)

        roi_batch_ids = cat(
            [
                torch.full((b, 1), i, dtype=dtype, device=device)
                for i, b in enumerate(
                    int(x.item()) for x in roi_batch_splits_nms)
            ],
            dim=0,
        )

        roi_class_nms = alias(roi_class_nms, "class_nms")
        roi_score_nms = alias(roi_score_nms, "score_nms")
        roi_bbox_nms = alias(roi_bbox_nms, "bbox_nms")
        roi_batch_splits_nms = alias(roi_batch_splits_nms, "batch_splits_nms")
        roi_keeps_nms = alias(roi_keeps_nms, "keeps_nms")
        roi_keeps_size_nms = alias(roi_keeps_size_nms, "keeps_size_nms")

        results = InstancesList(
            im_info=im_info,
            indices=roi_batch_ids[:, 0],
            extra_fields={
                "pred_boxes": Boxes4or5(roi_bbox_nms),
                "scores": roi_score_nms,
                "pred_classes": roi_class_nms,
            },
        )

        if not self.tensor_mode:
            results = InstancesList.to_d2_instances_list(results)
            batch_splits = roi_batch_splits_nms.int().tolist()
            kept_indices = list(
                roi_keeps_nms.to(torch.int64).split(batch_splits))
        else:
            results = [results]
            kept_indices = [roi_keeps_nms]

        return results, kept_indices