3DMAD数据集的使用方法

本文介绍了3DMAD数据集,一个用于面部假冒攻击检测的资源,以及其特有的HDF5文件格式问题。由于不支持Windows和缺乏批量解码功能,作者提供了使用h5py库编写的Python代码来解析HDF5文件并转换为视频。文章还提及了数据集的结构、标签信息以及未解决的问题,如信息提取不完整和视频质量损耗等。
摘要由CSDN通过智能技术生成

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 h5py

parser = 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 file
        f = 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 writers
        head, 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 files
        for 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 files
            depth_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数据集还是比较恶心的,相比于其他数据集。希望作者的努力可以帮助后面的学习者少走一点弯路吧。可能我写的代码还有一点问题,也希望大家能够提出来,共同进步。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值