如何计算失败的接受率和错误识别率?

时间:2015-05-28 10:21:44

标签: security authentication biometrics

如何计算身份验证设备的FAR和FRR? (我假设使用的是生物识别技术)。否则,他们对该主题的任何统计数据都很容易获得?

5 个答案:

答案 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 calculation

FRR calculation

因此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