OULU数据集用于anti-spoofing的测试,里面包含了打印攻击、回放攻击等一些攻击类型,想要具体了解OULU的数据概况的学者们,请读下OULU的原文,本人就不在这里详述了。OULU原文链接如下:OULU数据集 PDF版原文

在用OULU对你设计的模型进行指标测试时,需要注意的一点是:你需要在OULU提供的四个协议上分别进行测试,OULU的前两个协议文件分别只有一个训练txt文件,而后两个协议则分别包含了6个训练文件,dev,test文件在这四个协议中也是如此!这四个协议是作者分别针对不同的攻击环境来进行设置的,具体如下:

OULU的四个协议
        协议名 含义
P1 评估在背景与光照上的泛化能力(未知的光照与背景变化的泛化能力)
P2 对不同类型的打印和视频攻击进行训练和测试,来评估泛化能力(未知的攻击介质的泛化能力)
P3 对图像捕获设备的类型进行泛化评估
P4 结合P1-P3上的所有变化,来评估泛化能力

借此机会,我把SIW数据集的三个测试协议也放上,感兴趣的学者们可以了解下:

SIW的三个协议
协议名 含义
P1 评估对姿势和表情变化的泛化能力
P2 评估在不同回放攻击设备上的泛化能力
P3 通过在专门包含重放攻击或打印攻击视频的数据集上进行

一些研究者在OULU数据集上的测试结果:

上图第一列代表的是测试协议名,第二列代表模型名字,其中协议3与协议4中值代表“均值±方差”;

在用OULU的四个协议对你的模型测试时,切记,千万不要直接用求出来的TN,TP,FN,FP来直接求APCER,BPCER,ACER,这样的测试方式是不对的,本人一开始就是用这样的方式来求APCER这些指标的,结果发现测出来的指标出奇的好,后来是通过读OULU那篇原论文才发现,这样得测试方式是不对的!害,白白地让我瞎折腾了将近2个月,泪奔!

对于正确的测试方法,原文是这样写的:

它的大致意思就是:APCER与BPCER依赖于一个决策阈值,development集(可以理解为一个验证集)作为一个分离的验证集运行,用于调节模型的参数,并预测阈值以供测试集使用;也就是说:由验证集development set得到一个阈值threshold,而测试集利用验证集得到的这个threshold进行APCER,BPCER的指标测试

用代码的表示上述的测试方式如下:

#创建一个用于验证集测试的类变量
pad_meter_val = PADMeter()
#图像送入模型
output,_ = model(img)
#预测概率
class_output = nn.functional.softmax(output, dim=1)
#测量TP,TN,FP,FN
pad_meter_val.update(target.cpu().data.numpy(),class_output.cpu().data.numpy())
#求eer,阈值thr
pad_meter_val.get_eer_and_thr()
#用阈值thr求hter,apcer,bpcer
pad_meter_val.get_hter_apcer_etal_at_thr(pad_meter_val.threshold)
#用阈值thr求acc
pad_meter_val.get_accuracy(pad_meter_val.threshold)
####################################################
#创建一个用于测试集测试的类变量
pad_meter_test = PADMeter()
#图像送入模型
output,_ = model(img)
#预测概率
class_output1 = nn.functional.softmax(output, dim=1)
#得到TP,TN,FP,FN
pad_meter_test.update(target.cpu().data.numpy(),class_output1.cpu().data.numpy())
#在验证集得到的阈值下,测量测试集的hter,apcer等指标
pad_meter_test.get_hter_apcer_etal_at_thr(pad_meter_val.threshold)
#验证集得到的阈值下,测量测试集的acc指标
pad_meter_test.get_accuracy(pad_meter_val.threshold)

PADMeter()类封装的一些具体实现细节如下:

import math
import numpy as np
from sklearn.metrics import roc_curve, accuracy_score
from sklearn.metrics import roc_auc_score
from torch import nnclass PADMeter(object):"""Presentation Attack Detection Meter"""def __init__(self):self.reset()def reset(self):self.label = np.ones(0)self.output = np.ones(0)self.threshold = Noneself.grid_density = 10000def update(self, label, output):#一般取softmax之后,第1维度上的第1列数据if len(output.shape) > 1 and output.shape[1] > 1:output = output[:, 1]elif len(output.shape) > 1 and output.shape[1] == 1:output = output[:, 0]#拼接,将新的数据拼接到已有的后方self.label = np.hstack([self.label, label])self.output = np.hstack([self.output, output])def get_tpr(self, fixed_fpr):fpr, tpr, thr = roc_curve(self.label, self.output)tpr_filtered = tpr[fpr <= fixed_fpr]if len(tpr_filtered) == 0:self.tpr = 0.0self.tpr = tpr_filtered[-1]def eval_stat(self, thr):pred = self.output >= thrTN = np.sum((self.label == 0) & (pred == False))FN = np.sum((self.label == 1) & (pred == False))FP = np.sum((self.label == 0) & (pred == True))TP = np.sum((self.label == 1) & (pred == True))if TN + FP == 0:TN += 0.0001if TP + FN == 0:TP += 0.0001return TN, FN, FP, TPdef get_eer_and_thr(self):thresholds = []Min, Max = min(self.output), max(self.output)for i in range(self.grid_density + 1):thresholds.append(Min + i * (Max - Min) / float(self.grid_density))min_dist = 1.0min_dist_stats = []for thr in thresholds:TN, FN, FP, TP = self.eval_stat(thr)far = FP / float(TN + FP)frr = FN / float(TP + FN)dist = math.fabs(far - frr)if dist < min_dist:min_dist = distmin_dist_stats = [far, frr, thr]# for exceptionif len(min_dist_stats) >= 2:self.eer = (min_dist_stats[0] + min_dist_stats[1]) / 2.0self.threshold = min_dist_stats[2]else:self.eer = 0.5self.threshold = 0.5def get_hter_apcer_etal_at_thr(self, thr=None):if thr is None:self.get_eer_and_thr()thr = self.thresholdTN, FN, FP, TP = self.eval_stat(thr)far = FP / float(TN + FP)frr = FN / float(TP + FN)fpr = FP / float(FP + TN)tpr = TP / float(TP + FN)fpr1, tpr1, _ = roc_curve(self.label, self.output, pos_label=1)# print(type(fpr),fpr.shape,fpr.size())# TPR@FPR=e-2# tpr1 = np.array(tpr)# fpr1 = np.array(fpr)# print(type(fpr1), fpr1.shape,len(fpr1))# print(fpr1)score_1 = tpr1[np.where(fpr1 >= 0.01)[0][0]]# TPR@FPR=e-3score_2 = tpr1[np.where(fpr1 >= 0.001)[0][0]]# TPR@FPR=e-4score_3 = tpr1[np.where(fpr1 >= 0.0001)[0][0]]self.TN = TNself.FN = FNself.FP = FPself.TP = TPself.apcer = farself.bpcer = frrself.acer = (self.apcer + self.bpcer) / 2.0self.hter = (far + frr) / 2.0self.fpr = fprself.tpr = tprself.score1 = score_1self.score2 = score_2self.score3 = score_3try:self.auc = roc_auc_score(self.label, self.output)except ValueError:passdef get_accuracy(self, thr=None):if thr == None:self.get_eer_and_thr()thr = self.thresholdTN, FN, FP, TP = self.eval_stat(thr)self.accuracy = accuracy = float(TP + TN) / len(self.output)

到此就结束了,在此祝各位学者科研顺利!

在anti-spoofing中,在OULU数据集上求APCER,BPCER,ACER上的一个注意事项相关推荐

  1. MMaction2中自定义AVA数据集(在window上实现)

    针对视频处理和数据集文件--在window上操作 一.视频的处理 1.1ffmpeg安装 1.1.1ffmpeg环境变量的配置 1.2视频准备 1.3git安装 1.4切割视频 1.5在window中 ...

  2. 目标检测中特征融合技术(YOLO v4)(上)

    目标检测中特征融合技术(YOLO v4)(上) 论文链接:https://arxiv.org/abs/1612.03144 Feature Pyramid Networks for Object De ...

  3. 如何在Keras中训练大型数据集

    https://www.toutiao.com/a6670173759829180936/ 在本文中,我们将讨论如何使用Keras在不适合内存的大数据集上训练我们的深度学习网络. 介绍 深度学习算法优 ...

  4. sklearn库中的标准数据集及基本功能

    [sklearn库] sklearn是scikit-learn的简称,是一个基于Python的第三方模块.sklearn库集成了一些常用的机器学习方法,在进行机器学习任务是,并不需要实现算法,只需要简 ...

  5. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) run_glue.py微调脚本代码 python命令执行run ...

  6. 【沃顿商学院学习笔记】商业分析——Customer Analytics:05 营销中的新兴数据集:营销科学的未来 EMERGING DATA SETS IN MARKETING

    商业进阶--营销科学的未来 本章主要从当今营销领域的五大分析应用领域:数据Data.探索数据Data Explorer.预测模型Predictive Model.优化Optimization和决策De ...

  7. java中rjust,Defects4j数据集的使用

    Defects4j数据集是14年由Michael D. Ernst老师及其合作者一起发布的Java运行时缺陷数据集,近年来已经被广泛应用在相关研究中,如近期就有这些论文用到了这个数据集: Chen, ...

  8. 根据文件夹中的图片数据集生成.txt文件标签

    文章目录 前言 数据集格式 Python实现 注意事项 前言 深度学习中的与图片有关的任务,如图像识别,图像分类,目标检测,图像分割等,在准备图片数据集时,图片的序号和标签往往是由.txt文件获取的. ...

  9. 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?

    写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...

最新文章

  1. 理解和配置Out of memory: Kill process
  2. 【译】An Intro to TrueBit: A Scalable, Decentralized Computational Court.
  3. ClassLoader的常用方法及获取方法
  4. .NET(c#) 移动APP开发平台 - Smobiler(1)
  5. 赋能零售成长型企业营销增长,云徙「数盈·新营销中台」发布
  6. 2020年母婴消费洞察报告
  7. JavaWeb项目 打开首页就跳转debug模式的解决方法
  8. 物流行业企业报表开发指南
  9. windows下的route print [转]
  10. Git常用命令及场景
  11. 实现网站二维码扫描登录
  12. Scrum板与Kanban如何抉择?prwnfivgd板与按照pgvhzd
  13. Nginx学习笔记(反向代理搭建集群)
  14. 事件研究法与其应用(2)---Excel实操步骤
  15. 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
  16. 蚂蚁电竞ANT27VQ电子竞技显示器重磅来袭
  17. java-net-php-python-jspm综合彩妆店管理系统查重PPT计算机毕业设计程序
  18. The Pilots Brothers' refrigerator开灯问题
  19. 【H5+ Quick-cocos2dx整合】之iOS 四 协调H5+和Quick-Cocos2dx之间工作
  20. OJ-3084 返回指针的函数

热门文章

  1. 快手主播怎么引流?直播带货将面向多样化发展
  2. 生存分析统计方法选择,可以避免的一些坑
  3. LeetCode42题动态规划 - 接雨水
  4. 实时音视频聊天中的延时问题一篇就够,低延时场景及优化
  5. 转自猎豹移动CEO傅盛:深度学习是什么?
  6. 小米浏览器禁用java_2019-03-11 小米散招面试-Java后台实习
  7. 【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI
  8. 安卓客户端微博登陆(文件不存在 C8998)
  9. 安全运维 | 八大运维监控平台及选型推荐
  10. 用HTML实现旋转地球,使用CSS3和贴图实现的旋转的蓝色地球