コード例 #1
0
ファイル: model_wrapper.py プロジェクト: MatejVitek/EyeZ-v1
    def evaluate(self,
                 gallery,
                 probe,
                 evaluation=None,
                 impostors=None,
                 plot=None,
                 verbose=1,
                 save=None,
                 use_precomputed=False,
                 **kw):
        """
		Evaluate wrapped model

		:param iterable gallery: List of gallery samples
		:param iterable probe: List of probe samples
		:param evaluation: Existing Evaluation to update. If None, new Evaluation will be created.
		:type  evaluation: Evaluation or None
		:param impostors: Dataset for impostor verification attempts in evaluation. If None, full G/P testing will be used.
		:type  impostors: Dataset or None
		:param plot: Plotting function, taking a tuple (x, y, figure). If None, will not plot.
		:type  plot: Callable or None
		:param int verbose: Verbosity level
		:param save: File to save distance matrix info to
		:type  save: str or None
		:param bool use_precomputed: Whether to load saved distance matrix info. If True, should also pass save name.
		:param kw: Keyword arguments to pass to :py:evaluation.compute_error_rates

		:return: Evaluation updated with newly computed metrics
		:rtype:  Evaluation
		"""

        self._verbose = verbose
        if not evaluation:
            evaluation = Evaluation()

        # Load dist_matrix and imp_matrix info
        if use_precomputed and save and os.path.isfile(save):
            self._print(f"Reading info from {save}.")
            with open(save, 'rb') as f:
                dist_matrix = pickle.load(f)
                imp_matrix = pickle.load(f)
                g_classes = pickle.load(f)
                p_classes = pickle.load(f)
                imp_classes = pickle.load(f)

        # Compute dist_matrix and imp_matrix info
        else:
            dist_matrix, imp_matrix = self.dist_and_imp_matrix(
                gallery, probe, impostors)
            g_classes = self.classes(gallery)
            p_classes = self.classes(probe)
            imp_classes = self.classes(impostors)

        # Save dist_matrix and imp_matrix info
        if save and not (use_precomputed and os.path.isfile(save)):
            self._print(f"Saving info to {save}.")
            dir = os.path.dirname(save)
            if dir and not os.path.isdir(dir):
                os.makedirs(dir)
            with open(save, 'wb') as f:
                pickle.dump(dist_matrix, f)
                pickle.dump(imp_matrix, f)
                pickle.dump(g_classes, f)
                pickle.dump(p_classes, f)
                pickle.dump(imp_classes, f)

        # Get FAR and FRR
        far, frr, threshold = evaluation.compute_error_rates(
            dist_matrix,
            g_classes,
            p_classes,
            impostor_matrix=imp_matrix,
            impostor_classes=imp_classes,
            **kw)

        # EER
        eer = evaluation.update_eer()
        self._print(f"EER: {eer}")
        if plot:
            plot(threshold, far, figure='EER')
            plot(threshold, frr, figure='EER', label=None)

        # AUC
        auc = evaluation.update_auc()
        self._print(f"AUC: {auc}")
        if plot:
            plot(far, 1 - frr, figure='ROC Curve')
            plot(far, 1 - frr, figure='Semilog ROC Curve')

        # VER@1FAR and [email protected]
        ver1far = evaluation.update_ver1far()
        self._print(f"VER@1FAR: {ver1far}")
        ver01far = evaluation.update_ver01far()
        self._print(f"[email protected]: {ver01far}")

        return evaluation