def post_processing_mc_dropout_ensembles(self, input_im):
        """
        This function produces results using multiple runs of MC dropout, through fusion before or after
        the non-maximum suppression step.

        Args:
            input_im (list): an input im list generated from dataset handler.

        Returns:
            result (instances): object instances

        """
        if self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES_DROPOUT.BOX_MERGE_MODE == 'pre_nms':
            return self.post_processing_standard_nms(input_im)
        else:
            outputs_dict = self.model(
                input_im,
                return_anchorwise_output=False,
                num_mc_dropout_runs=self.num_mc_dropout_runs)
            n_fms = len(self.model.in_features)
            outputs_list = [{
                key: value[i * n_fms:(i + 1) *
                           n_fms] if value is not None else value
                for key, value in outputs_dict.items()
            } for i in range(self.num_mc_dropout_runs)]

            # Merge results:
            results = [
                inference_utils.general_standard_nms_postprocessing(
                    input_im,
                    self.retinanet_probabilistic_inference(input_im,
                                                           outputs=outputs),
                    self.model.test_nms_thresh,
                    self.model.max_detections_per_image)
                for outputs in outputs_list
            ]

            # Append per-ensemble outputs after NMS has been performed.
            ensemble_pred_box_list = [
                result.pred_boxes.tensor for result in results
            ]
            ensemble_pred_prob_vectors_list = [
                result.pred_cls_probs for result in results
            ]
            ensembles_class_idxs_list = [
                result.pred_classes for result in results
            ]
            ensembles_pred_box_covariance_list = [
                result.pred_boxes_covariance for result in results
            ]

            return inference_utils.general_black_box_ensembles_post_processing(
                input_im, ensemble_pred_box_list, ensembles_class_idxs_list,
                ensemble_pred_prob_vectors_list,
                ensembles_pred_box_covariance_list, self.model.test_nms_thresh,
                self.model.max_detections_per_image,
                self.cfg.PROBABILISTIC_INFERENCE.AFFINITY_THRESHOLD)
    def post_processing_mc_dropout_ensembles(self, input_im):
        """
        This function produces results using monte-carlo dropout ensembles.

        Args:
            input_im (list): an input im list generated from dataset handler.

        Returns:
            result (instances): object instances
        """
        if self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.BOX_MERGE_MODE == 'pre_nms':
            # In generalized rcnn models, association cannot be achieved on an anchor level when using
            # dropout as anchor order might shift. To overcome this problem, the anchor statistics function
            # is used to perform the association and to fuse covariance
            # results.
            return self.post_processing_output_statistics(input_im)
        else:
            outputs_list = self.model(
                input_im,
                return_anchorwise_output=False,
                num_mc_dropout_runs=self.num_mc_dropout_runs)

            # Merge results:
            results = [
                inference_utils.general_standard_nms_postprocessing(
                    input_im,
                    self.generalized_rcnn_probabilistic_inference(
                        input_im, outputs=outputs), self.test_nms_thresh,
                    self.test_topk_per_image) for outputs in outputs_list
            ]

            # Append per-ensemble outputs after NMS has been performed.
            ensemble_pred_box_list = [
                result.pred_boxes.tensor for result in results
            ]
            ensemble_pred_prob_vectors_list = [
                result.pred_cls_probs for result in results
            ]
            ensembles_class_idxs_list = [
                result.pred_classes for result in results
            ]
            ensembles_pred_box_covariance_list = [
                result.pred_boxes_covariance for result in results
            ]

            return inference_utils.general_black_box_ensembles_post_processing(
                input_im,
                ensemble_pred_box_list,
                ensembles_class_idxs_list,
                ensemble_pred_prob_vectors_list,
                ensembles_pred_box_covariance_list,
                self.test_nms_thresh,
                self.test_topk_per_image,
                self.cfg.PROBABILISTIC_INFERENCE.AFFINITY_THRESHOLD,
                is_generalized_rcnn=True,
                merging_method=self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.
                BOX_FUSION_MODE)
예제 #3
0
    def post_processing_ensembles(self, input_im, model_dict):
        """
        This function produces results using multiple runs of independently trained models, through fusion before or after
        the non-maximum suppression step.

        Args:
            input_im (list): an input im list generated from dataset handler.
            model_dict (dict): dictionary containing list of models comprising the ensemble.
        Returns:
            result (instances): object instances

        """
        if self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.BOX_MERGE_MODE == 'pre_nms':
            outputs_list = []

            for model in model_dict:
                outputs = model(input_im, return_anchorwise_output=True)
                outputs_list.append(outputs)

            outputs = self.retinanet_probabilistic_inference(
                input_im, ensemble_inference=True, outputs_list=outputs_list)
            return inference_utils.general_standard_nms_postprocessing(
                input_im, outputs, self.model.test_nms_thresh, self.model.max_detections_per_image)
        else:
            outputs_list = []
            for model in model_dict:
                self.model = model
                outputs_list.append(
                    self.post_processing_standard_nms(input_im))

            # Merge results:
            ensemble_pred_box_list = []
            ensemble_pred_prob_vectors_list = []
            ensembles_class_idxs_list = []
            ensembles_pred_box_covariance_list = []
            for results in outputs_list:
                # Append per-ensemble outputs after NMS has been performed.
                ensemble_pred_box_list.append(results.pred_boxes.tensor)
                ensemble_pred_prob_vectors_list.append(results.pred_cls_probs)
                ensembles_class_idxs_list.append(results.pred_classes)
                ensembles_pred_box_covariance_list.append(
                    results.pred_boxes_covariance)

            return inference_utils.general_black_box_ensembles_post_processing(
                input_im,
                ensemble_pred_box_list,
                ensembles_class_idxs_list,
                ensemble_pred_prob_vectors_list,
                ensembles_pred_box_covariance_list,
                self.model.test_nms_thresh,
                self.model.max_detections_per_image,
                self.cfg.PROBABILISTIC_INFERENCE.AFFINITY_THRESHOLD,
                merging_method=self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.BOX_FUSION_MODE)
    def post_processing_standard_nms(self, input_im):
        """
        This function produces results using standard non-maximum suppression. The function takes into
        account any probabilistic modeling method when computing the results.

        Args:
            input_im (list): an input im list generated from dataset handler.

        Returns:
            result (instances): object instances

        """
        outputs = self.generalized_rcnn_probabilistic_inference(input_im)

        return inference_utils.general_standard_nms_postprocessing(
            input_im, outputs, self.test_nms_thresh, self.test_topk_per_image)
예제 #5
0
    def post_processing_standard_nms(self, input_im):
        """
        This function produces results using standard non-maximum suppression. The function takes into
        account any probabilistic modeling method when computing the results. It can combine aleatoric uncertainty
        from heteroscedastic regression and epistemic uncertainty from monte-carlo dropout for both classification and
        regression results.

        Args:
            input_im (list): an input im list generated from dataset handler.

        Returns:
            result (instances): object instances

        """
        outputs = self.retinanet_probabilistic_inference(input_im)

        return inference_utils.general_standard_nms_postprocessing(
            input_im, outputs, self.model.test_nms_thresh, self.model.max_detections_per_image)
예제 #6
0
    def post_processing_mc_dropout_ensembles(self, input_im):
        if self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.BOX_MERGE_MODE == 'pre_nms':
            raise NotImplementedError
        else:
            # Merge results:
            results = [
                inference_utils.general_standard_nms_postprocessing(
                    input_im, self.detr_probabilistic_inference(input_im),
                    self.test_nms_thresh, self.test_topk_per_image)
                for _ in range(self.num_mc_dropout_runs)
            ]

            # Append per-ensemble outputs after NMS has been performed.
            ensemble_pred_box_list = [
                result.pred_boxes.tensor for result in results
            ]
            ensemble_pred_prob_vectors_list = [
                result.pred_cls_probs for result in results
            ]
            ensembles_class_idxs_list = [
                result.pred_classes for result in results
            ]
            ensembles_pred_box_covariance_list = [
                result.pred_boxes_covariance for result in results
            ]

            return inference_utils.general_black_box_ensembles_post_processing(
                input_im,
                ensemble_pred_box_list,
                ensembles_class_idxs_list,
                ensemble_pred_prob_vectors_list,
                ensembles_pred_box_covariance_list,
                self.test_nms_thresh,
                self.test_topk_per_image,
                self.cfg.PROBABILISTIC_INFERENCE.AFFINITY_THRESHOLD,
                is_generalized_rcnn=True,
                merging_method=self.cfg.PROBABILISTIC_INFERENCE.ENSEMBLES.
                BOX_FUSION_MODE)