https://sites.google.com/qq.com/chalearnfacespoofingattackdete/contest-details
数据集官方获取网站
网友总结
https://blog.csdn.net/baidu_40840693/article/details/89060374
网友的FeatherNets论文笔记
https://blog.csdn.net/u014640980/article/details/89473862
创新点
提出轻量级网络Feather:
thin CNN stem——计算代价小;
提出流模块——比GAP(Global Average Pooling)精确度更高;
设计了一种新的融合分类器体系结构,将从多模态数据(depth 和 IR 数据)中学习到的多模型进行组合和级联;
成就
仅用depth image进行训练,0.00168 ACER, 0.35M parameters and 83M FLOPS;
in the Face Anti-spoofing Attack Detection Challenge@CVPR2019 and
got the result of 0.0013(ACER), 0.999(TPR@FPR=10e-2),
0.998(TPR@FPR=10e-3) and 0.9814(TPR@FPR=10e-4).
数据集 MMFD
原理
真实人脸的depth image是不均匀的,攻击人脸的depth image是平面的
由于网上找到的数据集资源并没有val文件夹,通过对比发现val数据集中的图片是从test数据集中选取的图片,于是自己制作了val数据集。如下所示:
1 # coding: utf-8 2 from pathlib import Path #从pathlib中导入Path 3 import os 4 import fileinput 5 6 import shutil 7 rgb = open('./rgb_train.txt','a') 8 pwd = os.getcwd() +'/'# the val data path 训练集的路径 9 test_pwd = '/home/tay/Videos/Anti_spoofing/Face_anti_spoofing/datasets/CASIA-SURF/Testing/' 10 dst_pwd = '/home/tay/Videos/Anti_spoofing/Face_anti_spoofing/Val/' 11 for line in fileinput.input("val_public_list.txt"): 12 list = line.split(' ') 13 print('list[0]', list[0]) 14 # print('list[0] is', list[0].split('.jpg')[0].split('/')[-1]) 15 print('list[1] is', list[1]) 16 print('list[2] is', list[2]) 17 # print('rgb is', pwd + list[0].split('.jpg')[0]+ '_tr' + '.jpg') 18 # rgb.write(pwd +list[0]+' ') 19 # depth.write(pwd +list[1]+' ') 20 # ir.write(pwd +list[2]+' ') 21 #src = test_pwd +'/'+ list[0].split('Val/')[-1]+' ' 22 #dst = list[0].split('/')[-2] 23 if os.path.exists(os.path.join(dst_pwd, list[0].split('/')[-2])): 24 shutil.copy(test_pwd + list[0].split('Val/')[-1], os.path.join(dst_pwd, list[0].split('/')[-2])) 25 else: 26 os.makedirs(os.path.join(dst_pwd, list[0].split('/')[-2])) 27 shutil.copy(test_pwd + list[0].split('Val/')[-1], os.path.join(dst_pwd, list[0].split('/')[-2])) 28 29 if os.path.exists(os.path.join(dst_pwd, list[1].split('/')[-2])): 30 shutil.copy(test_pwd + list[1].split('Val/')[-1], os.path.join(dst_pwd, list[1].split('/')[-2])) 31 else: 32 os.makedirs(os.path.join(dst_pwd, list[1].split('/')[-2])) 33 shutil.copy(test_pwd + list[1].split('Val/')[-1], os.path.join(dst_pwd, list[1].split('/')[-2])) 34 35 if os.path.exists(os.path.join(dst_pwd, list[2].split('/')[-2])): 36 shutil.copy(test_pwd + list[2].split('Val/')[-1], os.path.join(dst_pwd, list[2].split('/')[-2])) 37 else: 38 os.makedirs(os.path.join(dst_pwd, list[2].split('/')[-2])) 39 shutil.copy(test_pwd + list[2].split('Val/')[-1], os.path.join(dst_pwd, list[2].split('/')[-2])) 40 # rgb.write(test_pwd + list[0].split('Val/')[-1]+' ') 41 # rgb.write(test_pwd + list[1].split('Val/')[-1]+' ') 42 # rgb.write(test_pwd + list[2].split('Val/')[-1]+' ') 43 # shutil.copy(local_img_name+'/'+new_obj_name, path+'/'+new_obj_name) #shutil.copy(src, dst) src是要复制的图像的文件路径,dst是将要复制到的路径 44 45 # rgb.close()