FRR(False Rejection Rate)和FAR(False Acceptance Rate)是用来评估指纹识别算法性能的两个主要参数。

FRR通俗叫法是拒真率的意思,标准称谓是 FNMR(False Non-Match Rate 不匹配率)。可以通俗的理解为“把应该相互匹配成功的指纹当成不能匹配的指纹”的概率。

Equal Error Rate , 这个在说话人识别,说话人确认中最常用的评价标准,是一种使错误接受率(nontarget_is_target / (target_is_target + nontarget_is_target)) 和 错误拒绝

率(target_is_nontarget / (target_is_nontarget + nontarget_is_nontarget))的一个相对平衡点阈值点,然后这个阈值点可以作为实际使用阶段的固定的阈值。

如 得分非 -170----A-------threshold ------B------- +100    按理来说 A 中都是nontarget, B中都是target。 如果在A 中出现了target 就是错误拒绝了,如果在B 中出现了

nontarget  就是错误接收了

FAR一般称为认假率,其标准称谓是FMR(False Match Rate 错误匹配率)。FMR是用来评估指纹识别算法性能的最重要参数。可以通俗的理解为“把不应该匹配的指纹当成匹配

的指纹”的概率。

FAR是随阈值增大而减小的,FRR是随阈值增大而增大的。因此它们一定有交点。这个点是在某个阈值下的FAR与FRR等值的点。习惯上用这一点的值来衡量算法的综合性能。

对于一个更优的指纹算法,希望在相同阈值情况下,FAR和FRR都越小越好。

把FAR和FRR曲线都向下平移。同时相交点ERR也向下平移。所以EER值越小的时候,表示算法的整体性能越高。

----- 2017.3.06更新---- 
Equal Error Rate , 这个在说话人识别,说话人确认中最常用的评价标准,是一种使错误接受率(nontarget_is_target / (target_is_target + nontarget_is_target)) 和 错误拒绝率(target_is_nontarget / (target_is_nontarget + nontarget_is_nontarget))的一个相对平衡点阈值点,然后这个阈值点可以作为实际使用阶段的固定的阈值。 
还记得trials文件嘛,还记得没有cvs文件自己伪造trials文件嘛, 还记得不明白为什么要制造50%或者80%的nontarget嘛,就是为了要计算EER。所以在伪造trials文件的时候,最好是分布均匀,也就是要涉及到每一个人,每一个人都要有一定数量的nontarget,其实也可以每个人对其他所有人都做一个nontarget,到底是取一部分还是所有的这个我也不确定,等验证过后再更新(记得验证)。

-->先说一些EER的计算: 
false reject and false accept. Clearly, the false reject rate and the false accept rate depend on the threshold. When the two rates are equal, the common value is called equal error rate (EER).

什么是false reject(用fr表示), 就是本来应该accept 的结果 reject了: 
FR = target_is_nontarget / (target_is_nontarget + nontarget_is_nontarget) 
而false accept(用fa表示),就是本来应该reject的结果accept了: 
FA = nontarget_is_target / (target_is_target + nontarget_is_target) 
当E(fr) = E(fa) = E 时, E即 EER的值。 
-->维基百科ROC曲线 https://zh.wikipedia.org/wiki/ROC曲线 
--> 然后看一下kaldi源码: 
eer=compute-eer <(python local/prepare_for_eer.py $trials local/scores_gmm_${num_components}_${x}_${y}/plda_scores) 2> /dev/null
单独运行: 
python local/prepare_for_eer.py data/test/trials exp/scores_gmm_2048_ind_female/plda_scores 
结果:

-30.99115 target
-28.06169 target
-17.78868 target
-87.6428 nontarget
-74.32495 nontarget
-74.18333 nontarget
-5.662024 target
-7.832421 target
-26.46083 target
-74.93365 nontarget
-86.17784 nontarget
-50.90917 nontarget
-26.51904 target
-14.09044 target
...
#Ki就是上面的lines流, 把没用的代码全都删掉,可以去看kaldi的源码while (std::getline(ki.Stream(), line)) {std::vector<std::string> split_line;SplitStringToVector(line, " \t", true, &split_line);BaseFloat score;if (split_line[1] == "target")target_scores.push_back(score);else if (split_line[1] == "nontarget")nontarget_scores.push_back(score);else KALDI_ERR << "blablabla"}BaseFloat threshold;#定义一个threshold,两个list: target_scores, nontarget_scoresBaseFloat eer = ComputeEer(&target_scores, &nontarget_scores, &threshold);KALDI_LOG << "Equal error rate is " << (100.0 * eer)<< "%, at threshold " << threshold;std::cout.precision(4);std::cout << (100.0 * eer);return 0;

下面看ComputeEer(&target_scores, &nontarget_scores, &threshold)的实现

 {#将两个都从大到小排列std::sort(target_scores->begin(), target_scores->end());std::sort(nontarget_scores->begin(), nontarget_scores->end());size_t target_position = 0,target_size = target_scores->size();for (; target_position + 1 < target_size; target_position++) {size_t nontarget_size = nontarget_scores->size(), #计算nontarget的个数#比如nontarget_size=100 ,target_size=100 这个 nontarget_n 属于[0,100], #所以nontarget_positon 从99到-1nontarget_n = nontarget_size * target_position * 1.0 / target_size; nontarget_position = nontarget_size - 1 - nontarget_n;if (nontarget_position  < 0)nontarget_position = 0;#所以当nontarget_position 小于 target_position 的值的时候if ((*nontarget_scores)[nontarget_position] <(*target_scores)[target_position])break;}*threshold = (*target_scores)[target_position];BaseFloat eer = target_position * 1.0 / target_size;return eer;
}
要理解这个函数的实现,其实在compute-eer里边还是一行注释:
ComputeEer computes the Equal Error Rate (EER) for the given scoresand returns it as a proportion beween 0 and 1.If we set the threshold at x, then the target error-rate is theproportion of target_scores below x; and the non-target error-rateis the proportion of non-target scores above x.  We seek athreshold x for which these error rates are the same; thiserror rate is the EER.We compute this by iterating over the positions in target_scores: 0, 1, 2,and so on, and for each position consider whether the cutoff could be here.For each of these position we compute the corresponding position innontarget_scores where the cutoff would be if the EER were the same.For instance, if the vectors had the same length, this would be positionlength() - 1, length() - 2, and so on.  As soon as the value at thatposition in nontarget_scores at that position is less than the value fromtarget_scores, we have our EER.
下面拿一个例子用python简单模拟一下:
#coding: utf-8
'''
首先计算这一步,将target的得分和nontarget的得分文件
python local/prepare_for_eer.py data/test/trials exp/scores_gmm_2048_ind_female/plda_scores > scores
'''
target_scores = []
nontarget_scores = []
f = open('scores').readlines()
#将两个数组读出来
for line in f:splits = line.strip().split(' ')if splits[1] == 'target':target_scores.append(eval(splits[0]))else:nontarget_scores.append(eval(splits[0]))#排序,从小到大排序
target_scores = sorted(target_scores)
nontarget_scores = sorted(nontarget_scores)print target_scorestarget_size = len(target_scores)
target_position = 0
for target_position in range(target_size):nontarget_size = len(nontarget_scores)nontarget_n = nontarget_size * target_position * 1.0 / target_sizenontarget_position = int(nontarget_size - 1 - nontarget_n)if nontarget_position < 0:nontarget_position = 0if nontarget_scores[nontarget_position] < target_scores[target_position]:print "nontarget_scores[nontarget_position] is",  nontarget_position, nontarget_scores[nontarget_position]print "target_scores[target_position] is",  target_position, target_scores[target_position]breakthreshold = target_scores[target_position]
print "threshold is --> ",  threshold
eer = target_position * 1.0 / target_size
print "eer is --> ",  eer

今天突然又想到一个问题,如果不用plda来计算score, 不管是余弦距离也好或者是其他的也好只要有分数,都可以用这个脚本”compute-eer score-file(target/nontarget score)”来计算EER.

怎么计算阈值怎么画EER曲线,找到平衡点,另一篇博客: 
http://blog.csdn.net/zjm750617105/article/details/60503253

【声纹识别】 EER相关推荐

  1. 全球权威声纹识别竞赛斩获双料冠军 网易AI Lab智能技术领先国际

    允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 中国力量,又双叒夺冠了. 这一次,是在全球规模最大.最全面的语音顶会INTERSPEECH 2020上. 挑战比拼内容,则是当前语音研究领域 ...

  2. 中国AI又夺一冠!依图刷榜全球声纹识别挑战赛,刷新纪录,大比分夺魁

    鱼羊 发自 凹非寺 量子位 出品 | 公众号 QbitAI 中国军团,继续刷新全球AI各项竞赛. 这一次,是全球声纹识别竞赛:这一次,是独角兽依图. VoxCeleb说话人识别挑战赛,简称VoxSRC ...

  3. 同盾“声纹识别建模大赛”首榜揭晓,成绩已达工业级一流水平!

    近期,由同盾科技主办,同盾大学.科赛网承办的"声纹识别建模大赛"自8月1日正式启动初赛以来,在高校以及社会各界得到热烈关注,目前大赛已经取得了阶段性成果.截止到当前,已有320多人 ...

  4. python声纹识别_【kaldi学习.4】Aishell V1(说话人识别、声纹识别)中的run.sh详解...

    下面打算用aishell来做声纹识别,在做声纹识别之前,肯定是要对run.sh这个文件做个深入的了解,才可以继续往下走,接下来会记录如何修改run.sh去运行自己的数据,而不是手动输入自己的数据... ...

  5. [深度学习概念]·声纹识别技术简介

    声纹识别技术简介 声纹识别,也称作说话人识别,是一种通过声音判别说话人身份的技术.从直觉上来说,声纹虽然不像人脸.指纹的个体差异那样直观可见,但由于每个人的声道.口腔和鼻腔也具有个体的差异性,因此反映 ...

  6. 声纹识别(说话人识别)技术

    说话人识别(Speaker Recognition,SR),又称声纹识别(Voiceprint Recognition,VPR),顾名思义,即通过声音来识别出来"谁在说话",是根据 ...

  7. 说话人识别(声纹识别)综述

    目录 声纹识别背景介绍 声纹识别组成 数据 特征 模型 评价指标 声纹识别目前的挑战 参考文献 声纹识别背景介绍 声纹识别,也称作说话人识别,是一种通过声音判别说话人身份的技术.在现实生活中声纹识别的 ...

  8. python声纹识别_声纹识别算法、资源与应用(二)

    <声纹识别·资源篇> 1. Kaldi 最流行的语音技术研究平台,没有之一.代码运行鲁棒性强.架构良好,便于算法修改.定制.如果你是高校科研人员,工程实现能力有限,那么没关系,你只要懂点S ...

  9. 声纹识别开源工具 ASV-Subtools

    今天非常荣幸有机会在Speechhome语音技术研讨会上分享我们团队在开源项目上的一些工作.今天我分享的主题是声纹识别开源工具ASV-Subtools. 今天我分享的主要有5个部分的内容,分别是背景介 ...

  10. 同盾科技声纹识别建模大赛

    赛事简介 本次"同盾科技声纹识别建模大赛"立足于选拔出色AI人才,致力于打造"智能风控",为高潜力人才与高增长行业建立起精准对接的桥梁.此次同盾联合科赛.希尔贝 ...

最新文章

  1. oracle 判断11位数字,45个非常有用的 Oracle 查询语句小结
  2. tensorflow安装后在 pychram中 使用测试 找不到 tensorflow 模块的问题解决
  3. python中的format方法和int方法
  4. CodeForces 444C 节点更新求变化值的和
  5. (43) 讨论和通知
  6. python类的成员没有访问控制限制_Python 访问限制 private public的详细介绍
  7. vue可缓存的单页面多标签页
  8. 禁止跨域_新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境
  9. 制作windows7系统的U盘启动盘
  10. Java调用cplex求解泊位分配模型_CPLEX约束问题
  11. 自学笔记----三极管
  12. 诊断实验评估指标-灵敏度(sensitivity)特异度(specificity)准确度(accuracy)
  13. 计算机内存不足黑屏怎么办,win10内存不足会黑屏怎么办
  14. Vue学习笔记04(关键字搜索)
  15. 苹果电脑打印A4纸上纸盒的细线很浅
  16. myeclipse中光标突然变粗的解决方法
  17. 零数科技创新金融案例入选《2022全球区块链创新应用示范案例集》
  18. 用C语言编辑得到的利息,存款利息的计算 有1000元,想存5年,可按以下5种办法存:...
  19. 企业微信消息推送卡片按钮互动的使用
  20. java程序员在交接别人的工作时如何保证顺利交接?

热门文章

  1. 画动漫人物眼睛怎么上色
  2. C语言实现乘方运算---m的n次方(附完整源码)
  3. 手把手教你学习Solidity|Solidity开发【一】
  4. C语言两分钟倒计时小程序
  5. LaTeX中各种常用盒子的使用总结
  6. 一个完整的网站建设需要哪些流程?
  7. 【Excel神技】之 下拉列表
  8. 数据库去重,group by、distinct、rowid的用法,oracle和mysql如何数据去重保留一条
  9. 2015年9月10日
  10. AdaBoost算法-课堂笔记