如何计算身份验证设备的FAR和FRR? (我假设使用的是生物识别技术)。否则,他们对该主题的任何统计数据都很容易获得?
答案 0 :(得分:13)
生物识别系统可以在两种模式下工作,在评估过程中必须区分:验证和识别。
在验证模式下,用户会显示其身份,并且生物识别设备会验证身份是否匹配(想象您去了海关,并且您使用面部图像呈现您的身份证,该官员会验证您的真实面部和身份证上的图像)。
在识别模式中,在开始时不会做出身份假设,并且必须与所有模板进行比较(例如,杀手在犯罪现场留下他的指纹然后警察用他的指纹识别他 - 没有假设是他们只使用获得的指纹,并将其与数据库中的所有指纹进行比较。
因此有必要区分这两种情况,因为识别通常要求更高。
让我们假设您正在评估生物识别系统的验证模式。 想象一下生物识别系统,它将所有身份验证尝试从区间[0,1]中分配出来。 0表示不匹配,1表示完全匹配。显然,如果您将阈值设置为0,则允许所有真正的用户,但所有冒名顶替者也被录取。另一方面,如果您将阈值设置为1,则不允许任何人进入。因此,对于实际使用,您通常将阈值设置在介于两者之间。这可能会导致并非所有真正的用户都被录取,并且一些冒名顶替者被录取。如您所见,有两种错误率: FAR (错误接受率)和 FRR (错误拒绝率)。
FAR计算为冒名顶替分数超过阈值的一小部分。
FRR计算为真实分数低于您的阈值的一小部分。
示例:我们有一个指纹系统。为了评估任何生物识别系统的性能,我们需要收集一个数据库。假设我们已经这样做了,数据库由10个合法用户(USER_1-USER_10)组成,每个用户提供他的手指10次(10x10 =总共100个图像)。让我们假设,单个图像足以用于模板创建。您选择一个用户(例如USER_1)和一个他的指纹图像并创建模板。您用来验证指纹的其余图像,您将获得9个真实分数。您用作冒名顶替者的其他用户的所有图像,您将获得90个冒名顶替者分数。您为所有图像和所有用户重复模板生成,总共可获得900个真实分数和9000个冒名顶替分数。 这些分数通常用于生成所谓的ROC曲线,以选择最佳阈值来缓解您的问题。如果您选择了阈值,则可以使用上述定义计算FAR和FRR。
让我们假设,我们选择了0.7和100个冒名顶替分数超过阈值,50个真实分数低于阈值。
因此FAR = 1.1%,FRR = 5.6%。
答案 1 :(得分:0)
FAR和FRR始终针对特定人群进行计算。这是使用FAR和FRR衡量绩效的缺点之一,除非您有比较的一致人口。
例如,如果我的人口由我和另外两个人组成,那么我接受错误接受的可能性非常低,可能是0%和我的错误拒绝率,只要我能够可靠地捕获可用样本也是如此非常低,可能是0%,如果没有数据库大小的上下文,这将是非常令人印象深刻的。
为准确测试系统,我建议您了解该特定类型的身份验证的标准。例如,在指纹匹配中,NIST具有用于测量不同算法的图像数据库。有许多算法都是针对该数据库进行测量的,因此您可以将苹果与苹果进行比较。如果您没有跨算法的相同数据库,那么您将苹果与橙子进行比较,如果这是有意义的。
答案 2 :(得分:0)
如果您正在寻找工具或自动化软件来完成工作,则可以使用带有RT-tool软件的matlab。
mathworks.com提供了很好的源内容,这些内容易于理解并且易于修改
答案 3 :(得分:0)
FAR = FP / (FP + TN)
FRR = FN / (FN + TP)
地点:
FAR
:错误接受率FRR
:错误拒绝率TP
:真阳性FP
:误报TN
:正负FN
:误报答案 4 :(得分:0)
要计算 FAR/FRR 曲线,您可以使用:
def curve_frr_far(
targets, #list of 0 and 1
genuine_probabilities,
genuine_label = 0 # 0 or 1
):
sort_idxs = genuine_probabilities.argsort()
targets = targets[sort_idxs]
genuine_probabilities = genuine_probabilities[sort_idxs]
far = []
frr = []
thresholds = []
len_genuines = (targets == genuine_label).sum()
len_spoofs = (targets != genuine_label).sum()
len_targets = len(targets)
th = 0.0
fa = len_spoofs
fr = 0
thresholds.append(th)
far.append(fa/len_spoofs)
frr.append(fr/len_genuines)
for index in range(len_targets):
genuine_p = genuine_probabilities[index]
label = targets[index]
if label == genuine_label:
fr += 1
else:
fa -= 1
if genuine_p != th:
th = genuine_p
far.append(fa/len_spoofs)
frr.append(fr/len_genuines)
thresholds.append(th)
if th != 1.0:
th = 1.0
fa = 0
fr = len_genuines
far.append(fa/len_spoofs)
frr.append(fr/len_genuines)
thresholds.append(th)
return thresholds, frr, far