def _run_hoc(self, summary, sample_id, sample_input, prob): """ Run HOC search for a sample image, and then save the result to summary. Args: summary (SummaryRecord): The summary object to store the data. sample_id (int): The sample ID. sample_input (Union[Tensor, np.ndarray]): Sample image tensor in CHW or NCWH(N=1). prob (Union[Tensor, np.ndarray]): List of sample's classification prediction output, HOC will run for labels with prediction output strictly larger then HOC searcher's threshold(0.5 by default). """ if isinstance(sample_input, ms.Tensor): sample_input = sample_input.asnumpy() if len(sample_input.shape) == 3: sample_input = np.expand_dims(sample_input, axis=0) has_rec = False explain = Explain() explain.sample_id = sample_id str_mask = hoc.auto_str_mask(sample_input) compiled_mask = None for label_idx, label_prob in enumerate(prob): if label_prob > self._hoc_searcher.threshold: if compiled_mask is None: compiled_mask = hoc.compile_mask(str_mask, sample_input) try: edit_tree, layer_outputs = self._hoc_searcher.search( sample_input, label_idx, compiled_mask) except hoc.NoValidResultError: log.warning( f"No Hierarchical Occlusion result was found in sample#{sample_id} " f"label:{self._labels[label_idx]}, skipped.") continue has_rec = True hoc_rec = explain.hoc.add() hoc_rec.label = label_idx hoc_rec.mask = str_mask layer_count = edit_tree.max_layer + 1 for layer in range(layer_count): steps = edit_tree.get_layer_or_leaf_steps(layer) layer_output = layer_outputs[layer] hoc_layer = hoc_rec.layer.add() hoc_layer.prob = layer_output for step in steps: hoc_layer.box.extend(list(step.box)) if has_rec: summary.add_value("explainer", "hoc", explain) summary.record(1) self._manifest['hierarchical_occlusion'] = True
def _run_hoc(self, summary, sample_id, sample_input, prob): """ Run HOC search for a sample image, and then save the result to summary. Args: summary (SummaryRecord): The summary object to store the data. sample_id (int): The sample ID. sample_input (Union[Tensor, np.ndarray]): Sample image tensor in CHW or NCWH(N=1). prob (Union[Tensor, np.ndarray]): List of sample's classification prediction output, HOC will run for labels with prediction output strictly larger then HOC searcher's threshold(0.5 by default). """ if isinstance(sample_input, ms.Tensor): sample_input = sample_input.asnumpy() if len(sample_input.shape) == 3: sample_input = np.expand_dims(sample_input, axis=0) explain = None str_mask = hoc.auto_str_mask(sample_input) compiled_mask = None for label_idx, label_prob in enumerate(prob): if label_prob <= self._hoc_searcher.threshold: continue if compiled_mask is None: compiled_mask = hoc.compile_mask(str_mask, sample_input) try: edit_tree, layer_outputs = self._hoc_searcher.search( sample_input, label_idx, compiled_mask) except hoc.NoValidResultError: log.warning( f"No Hierarchical Occlusion result was found in sample#{sample_id} " f"label:{self._labels[label_idx]}, skipped.") continue if explain is None: explain = Explain() explain.sample_id = sample_id self._add_hoc_result_to_explain(label_idx, str_mask, edit_tree, layer_outputs, explain) if explain is not None: summary.add_value("explainer", "hoc", explain) summary.record(1) self._manifest['hierarchical_occlusion'] = True