Other|生物识别中评价标准(FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET、ROC曲线的理解和实际应用(python实现))
做了一些补充,把各个标准的理解整理了一下,也把代码部分补充了。
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
)相等。具体可以看稍后代码中的情况。
文章图片
FNIR
、FPIR
大同小异,跟FAR
、FRR
差不多,下次用到再补充。DET(Detection Error Tradeoff)曲线
:
显示的是拒识率(FRR) 和 误识率(FAR)随着阈值(threshold)变化时两者所产生的变化。 横轴为误识率(FAR),纵轴为拒识率(FRR),图像的弧线越靠近左下角说明分类的性能越好。ROC(receiver operating characteristic curve)曲线
:
这个曲线就很有历史了,二战就开始用了,用来分析雷达信号接收机(receiver)的信号检测性能。
把DET 曲线上下翻转即可得到ROC曲线,因此横轴和纵轴刚好跟DET曲线相反。
图像的弧线越靠近左上角说明分类的性能越好。
- FAR & FRR & DET & ROC 曲线 和计算 ERR
数据保存的形式如下:
class_in [0.6835004, 0.901112, 0.7841303, ...]
class_each [0.2197524, 0.113668742, 0.4682101, ...]
【Other|生物识别中评价标准(FAR、FRR、EER、FMR、FNMR、FNIR、FPIR、DET、ROC曲线的理解和实际应用(python实现))】第一行代表表示类内的匹配结果,第二行表示类间的匹配结果。
每个数字代表的是匹配的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_in)
FRR.append(frr)far = np.sum(class_each > thresld[i]) / len(class_each)
FAR.append(far)if (abs(frr - far) < 0.02):# frr和far值相差很小时认为相等
eer = abs(frr + far) / 2
# DET曲线
plt.plot(FAR, FRR, 'b-', linewidth=3, label='Global')# ROC曲线
plt.plot(FRR,FAR, 'b-', linewidth=3, label='Global')# FRR和FAR随阈值的变化曲线
#plt.plot(thresld, FRR, 'r-', label='FRR')
#plt.plot(thresld, FAR, 'b-', label='FAR')plt.grid(True)
plt.legend(loc=1, fontsize = '10')
plt.ylabel('False Rejection (in %)', fontsize = 10) # 横坐标轴的标题
plt.xlabel('False Acceptance (in %)', fontsize = 10) # 纵坐标轴的标题
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.show()
print('EER: ', eer)
效果图:
稍后补充,结果还在跑
- FMR & FNMR 曲线
如果没有特别指明FMR和FNMR,则:- FMR = FAR
- FNMR = FRR
https://blog.csdn.net/colourful_sky/article/details/72830640
https://blog.csdn.net/huashui2009120/article/details/78483051
https://blog.csdn.net/u011501388/article/details/78334996
https://zhuanlan.zhihu.com/p/99085220
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理