本文主要是介绍3DMAD数据集的使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.介绍
3DMAD(3D Mask Attack Database)是一个用于面部假冒攻击检测的数据集,由欧洲联盟第七框架计划资助,由意大利PRA Lab和University of Sassari共同创建。3DMAD数据集在面部假冒攻击检测领域得到了广泛应用,它可以用于验证算法的鲁棒性和通用性,从而提高生物识别系统的安全性和可靠性。其数据集链接:http://www.idiap.ch/dataset/3dmad。当然,也有其他的方式可以获得,这里就不提了。
说明一下,这个数据集恶心的地方就是他的文件是HDF5格式,其提供的解码代码利用的是BOB库,该库只能在Mac系统或者linux系统下使用,不支持windows,而且他的代码只能一个一个解码HDF5文件,不能以一个文件夹为单位进行解码。作者画了一个上午和下午配置BoB库,最终失败。最后,无奈,只能自己写解码代码……(其他bloc也都是基于BOB库解析的,宝宝心里苦呀)
2.数据集目录
数据集的结构如图所示。
备注:其中前五个文件是我解压后的所得到的的,重要的是后面六个文件。
3.解析HDF5文件
最恶心的点就是他要解析HDF5文件。相比于其他数据集直接给出视频,他还要解析,……无语。
这里,本作者利用h5py库重新编写了一个解析代码,如果你的虚拟环境中没有h5py文件的话,可以利用conda install h5py或者pip install h5py来安装这个库。以下给出代码。
使用教程:利用命令行,输入convert.py -path [path] -e
其中,convert.py是这个代码所在的py文件的名称,这个应该不用细讲吧。
[path]是你要解析HDF5文件所在的文件夹,比如作者这边是“D:/3DMAD/seesion01/Data”
-e 是否要提取面部的关键点,不过作者偷懒,代码中是有的,但是没有调试过,需要读者自己调试一下。
例子:convert.py -path D:/3DMAD/seesion01/Data -e
import os
import numpy
import cv2
import argparse
import h5pyparser = argparse.ArgumentParser(description='Convert HDF5 files to videos for visualization purposes.')
parser.add_argument('-path', metavar='path', type=str,help='path to the directory containing HDF5 files to be converted')
parser.add_argument('-e', '--eyes', action='store_true', help='mark eye positions in the RGB video')
args = parser.parse_args()# List all HDF5 files in the given directory
hdf5_files = [os.path.join(args.path, f) for f in os.listdir(args.path) if f.endswith('.hdf5')]for hdf5_file in hdf5_files:try:# Read the data from HDF5 filef = h5py.File(hdf5_file, 'r')depth_data = f['Depth_Data'][:]depth_data = numpy.transpose(depth_data, (0, 2, 3, 1))color_data = f['Color_Data'][:]color_data = numpy.transpose(color_data, (0, 2, 3, 1))# if args.eyes:# eye_pos = f['Eye_Pos'][:]# for i in range(0, color_data.shape[0]):# cv2.drawMarker(color_data[i, :, :, :], (int(eye_pos[i, 0]), int(eye_pos[i, 1])), (0, 0, 255), cv2.MARKER_CROSS, 20)# cv2.drawMarker(color_data[i, :, :, :], (int(eye_pos[i, 2]), int(eye_pos[i, 3])), (0, 0, 255), cv2.MARKER_CROSS, 20)# Set up the output filenames and video writershead, tail = os.path.split(hdf5_file)depth_file = os.path.join(head, tail.split('.')[0] + '_D.avi')color_file = os.path.join(head, tail.split('.')[0] + '_C.avi')depth_video = cv2.VideoWriter(depth_file, cv2.VideoWriter_fourcc(*'XVID'), 30,(depth_data.shape[2], depth_data.shape[1]), False)color_video = cv2.VideoWriter(color_file, cv2.VideoWriter_fourcc(*'XVID'), 30,(color_data.shape[2], color_data.shape[1]), True)# Convert and write the frames to video filesfor i in range(0, color_data.shape[0]):# depth_frame = numpy.right_shift(depth_data[i, :, :], 3).astype(numpy.uint8)depth_frame = depth_data[i, :, :, :].astype(numpy.uint8)color_frame = color_data[i, :, :, :]# Write frames to video filesdepth_video.write(depth_frame)color_video.write(color_frame)# print(color_frame.shape)depth_video.release()color_video.release()print("Depth video is saved in %s." % depth_file)print("Color video is saved in %s." % color_file)f.close()except IOError:print("The given file cannot be read.")
4.效果图
其中,C代表的是RGB图,D表示的是深度图
5.标签文件
我查看了很多的bloc,他们好像都没有指出这个数据集的标签文件是什么,所以我仔细的查看了一下,发现Session01和Session02都是真实的人脸,Session03是虚假的人脸的。该信息可以在documentation/1.docx中查看。
英语好的大佬可以在评论区翻译一下,作者英文水平太差了,就不翻译了。
6.未解决的问题
1.作者只提取了其中的视频,没有提取其他的信息。
2.最后合成视频的时候,可能编码会有画质的损耗,这个希望大家能提一下意见帮我一起解决。
3.源文件一般都是150MB,而作者提取出来的RGB图片只有几百KB,我还是挺疑惑,不知道为啥差别那么大。希望大家能发表一下意见,是不是作者哪里出现问题了。
7.总结
总之,3DMAD数据集还是比较恶心的,相比于其他数据集。希望作者的努力可以帮助后面的学习者少走一点弯路吧。可能我写的代码还有一点问题,也希望大家能够提出来,共同进步。
这篇关于3DMAD数据集的使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!