天天看點

FAR和FRR評價函數

1.FRR:錯誤拒接率(False Reject rate)。

文字定義:錯誤拒絕率,把同一個人的圖檔對當成不同的人圖檔對的機率。

其中:errorCount是指比對失敗的次數,totalCount是指同一個人的比對次數。

也就是說,假設我們定義比對的時候設定的門檻值為threshold,當兩兩比對的時候的相似度值為value。

在理想情況下,同一個人的比對相似度value>threshold總是成立的。在現實中,當value<threshold的時候,這就是比對失敗。

是以,errorCount就是totalCount中value<threshold的次數。

2.FAR:表示錯誤接受的比例(False Accept Rate)

文字定義:與FRR相反的是,表示的是把不同人認為是同一個人的機率。

也就是理想情況下,不同人的比對相似度value<threshold總是成立的。在現實中,當value>threshold的時候,這就是比對失敗。

FAR和FRR評價函數

代碼實作:

import numpy as np
import os
from time import time
from sklearn import svm
from sklearn.multiclass import OneVsRestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from skimage import io
from string import digits
from PIL import Image
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt
from scipy import interp
import matplotlib.pyplot as plt
import pandas as pd
import keras
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.utils import shuffle

def train_model(model,X_train,Y_train,X_test,Y_test):
    model.fit(X_train, Y_train,
              batch_size=10,
              epochs=1,
              validation_data=(X_test,Y_test),
              shuffle=True)
    return model

def compute_cv_cnn(model,X_train,Y_train,X_test,Y_test):
    scores = []
    model = train_model(model,X_train, Y_train,X_test,Y_test)
    predictions = model.predict_proba(X_test);
    scores.append(predictions)
    scores = np.array(scores)
    mean = np.mean(scores, axis=0)

    return mean

def unison_shuffled_copies(a, b):
    assert len(a) == len(b)
    p = np.random.permutation(len(a))
    return a[p], b[p]

def pred_approx_val(arr, treshold):
    array_np = np.copy(arr)
    low_val_indices = arr < treshold
    high_val_indices = arr >= treshold
    array_np[low_val_indices] = 0
    array_np[high_val_indices] = 1
    return array_np

def perf_measure(actual, score, treshold):
    TP = 0
    FP = 0
    TN = 0
    FN = 0

    size = len(score)
    for i in range(size):
        predArr = pred_approx_val(score[i], treshold)
        for j in range(len(score[i])):
            if(predArr[j] != actual[i][j] and predArr[j] == 1):
                FP+=1
            if(predArr[j] == actual[i][j] == 1):
                TP+=1
            if(predArr[j] != actual[i][j] and predArr[j] == 0):
                FN+=1
            if(predArr[j] == actual[i][j] == 0):
                TN+=1
    print("TP%d,FP%d,TN%d,FN%d"%(TP,FP,TN,FN))
    return TP, FP, TN, FN

def calc_far_frr(FP, FN,totalP, totalN):
    FAR = FP/float(totalP) # totalPFalse Accept Rate in percentage
    FRR = FN/float(totalN) # False Reject Rate in percentage
    return FAR, FRR

def prepare_graph_far_frr(actual, score, totalP, totalN):
    step = 1
    far = dict()
    frr = dict()
    for i in range(0, 100, step):
        TP, FP, TN, FN = perf_measure(actual, score, i/float(100))
        far[i], frr[i] = calc_far_frr(FP, FN, totalP, totalN)
    return far, frr
def plot_far_frr(far, frr):
    axisVal = np.arange(0,1.00,0.01);
    # PLOT FAR FRR
    plt.figure(1)
    lw = 2
    plt.plot(far.values(), axisVal, label='False Accept Rate', color='blue', lw=lw)
    plt.plot(axisVal, frr.values(), label='False Reject Rate', color='red', lw=lw)
#    plt.grid(ls='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('Treshold')
    plt.ylabel('Errors')
    plt.title('FAR and FRR')
    plt.legend(loc="lower right")
    FAR = []
    FRR = []
    for key,value in far.items():
        FAR.append(value)
    for key,value in frr.items():
        FRR.append(value)
    FAR = np.array(FAR)
    FRR = np.array(FRR)
    residue =  np.abs(FAR-FRR)
    residue = residue.tolist()
    min_index = residue.index(min(residue))
    EER = (FAR[min_index]+FRR[min_index])*50
    print("EER is %.2f%%"%(EER))