生物识别中评价标准:FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET、ROC曲线的理解和实际应用(python实现)

您所在的位置:网站首页 eer文件 生物识别中评价标准:FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET、ROC曲线的理解和实际应用(python实现)

生物识别中评价标准:FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET、ROC曲线的理解和实际应用(python实现)

2024-06-13 20:50| 来源: 网络整理| 查看: 265

做了一些补充,把各个标准的理解整理了一下,也把代码部分补充了。 Will Yip 2020.7.26

生物识别中评价标准 1. 对于FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET曲线的理解 FAR(False Acceptance Rate):误识率 注意,这里指的是类间的匹配结果,本该匹配错误但识别为正确的比例,计算公式如下: F A R = N F A N I R A × 100 % FAR=\frac{NFA}{NIRA}\times 100\% FAR=NIRANFA​×100% 式中,NIRA指类间匹配的总次数,NFA指错误接受的次数FRR(False Rejection Rate):拒识率 这里 指的是类内的匹配结果,本该匹配正确但识别为错误的比例,计算公式如下: F R R = N F R N G R A × 100 % FRR=\frac{NFR}{NGRA}\times 100\% FRR=NGRANFR​×100% 式中,NGRA指类内匹配的总次数,NFR指错误拒绝的次数FMR(False Match Rate):错误匹配率 其实很好理解,FMR就是识别错了(这个是前提),但是系统判定为正确的比例 这个评价标准在国标里面,如果没有特别指明,默认跟FMR=FAR,这一点很关键。FNMR(False Non-Match Rate):错误不匹配率 FNMR是识别对了(这个是前提),但是系统判定为错误的比例。 这个评价标准在国标里面,如果没有特别指明,默认跟FNMR=FRR,这一点很关键。EER(Equal Error Rate):等错误率 指的是FAR(FMR)和FRR(FNMR)两条曲线的交点,对应的那个阈值(threshold),取值范围0-1,但实际上很少会出现FAR(FMR)和FRR(FNMR)完全相等的情况,一般会在一个很小的误差范围内认为在这个阈值上FAR(FMR)和FRR(FNMR)相等。具体可以看稍后代码中的情况。 在这里插入图片描述

具体可以参考部分中的英文ppt,更加具体,后面的两个标准FNIR、FPIR大同小异,跟FAR、FRR差不多,下次用到再补充。

DET(Detection Error Tradeoff)曲线: 显示的是拒识率(FRR) 和 误识率(FAR)随着阈值(threshold)变化时两者所产生的变化。 横轴为误识率(FAR),纵轴为拒识率(FRR),图像的弧线越靠近左下角说明分类的性能越好。ROC(receiver operating characteristic curve)曲线: 这个曲线就很有历史了,二战就开始用了,用来分析雷达信号接收机(receiver)的信号检测性能。 把DET 曲线上下翻转即可得到ROC曲线,因此横轴和纵轴刚好跟DET曲线相反。 图像的弧线越靠近左上角说明分类的性能越好。 2. 实际应用(python实现) FAR & FRR & DET & ROC 曲线 和计算 ERR 数据保存的形式如下: class_in [0.6835004, 0.901112, 0.7841303, ...] class_each [0.2197524, 0.113668742, 0.4682101, ...]

第一行代表表示类内的匹配结果,第二行表示类间的匹配结果。 每个数字代表的是匹配的confidence,如果要调用的话,还是根据自己数据的保存形式来做读取部分的工作,下面的代码是根据上述的数据保存形式写的,请知悉。 代码如下:

# -*-coding:utf-8-*- import numpy as np import matplotlib.pyplot as plt ############################ 根据实际情况修改 #################################### ############################################################################### f=open('/home/will/In_N_each_log20200723.txt','r') s = f.read() s1 = s.split('\n') s1.pop(2) class_in = s1[0].split('class_in ') class_in.pop(0) class_in = class_in[0][1:-1].split(', ') #去掉一头一尾的中括号,然后分割 class_in = [float(i) for i in class_in] class_each = s1[1].split('class_each ') class_each.pop(0) class_each = list(class_each[0][1:-1].split(', ')) class_each = [float(i) for i in class_each] ############################################################################### FRR = [] #FNMR FAR = [] #FMR thresld = np.arange(0.1, 0.9, 0.01) # 生成模型阈值的等差列表 eer = 1 for i in range(len(thresld)): frr = np.sum(class_in thresld[i]) / len(class_each) FAR.append(far) if (abs(frr - far)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3