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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF