3DMAD数据集的使用方法

2023-10-31 10:31
文章标签 数据 使用 方法 3dmad

本文主要是介绍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数据集的使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/314724

相关文章

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一