天天看点

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))