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的时候,这就是匹配失败。
代码实现:
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))