基于Python对LivDet数据集进行处理(TXT和NPY文件的处理)


笔者在对论文进行复现的过程中,没看懂作者给出的代码,以为是无法运行的,因为在代码当中有很多txt文件,但是下载代码的时候并没找到这种文件,后来才发现这种txt文件是需要自己生成的,这是用来记录图片信息的(包括图片名以及自行打上的标签)。因此写下来记录一下这个过程,方便以后的复现。
复现论文:DeFraudNetEnd2End Fingerprint Spoof Detection using Patch Level Attention

本文参考:
pytorch加载自己的图片数据集的两种方法

保存数据集的位置及图片名称信息

需要用到的工具

本文需要用到以下python的包:
os
numpy
opencv
glob

以TXT文本的形式保存数据

在文中,一共需要生成3份txt文件,包括:指纹类型(真指纹,或是假指纹的材料),传感器类型以及实验者身份(一个实验者可能会有多个指纹图像)。这里以指纹类型为例:

def make_txt(path1,name):
    true_path = os.path.join(path1,name)       #选择好文件路径
    data = os.listdir(true_path)               #读取该路径中的文件,我用的是图片数据集,读到的就是每张图片的名字
    f = open(true_path+'/'+'image_type_classes.txt','w') #以改写的方式打开该txt文件(如果不存在就会自动创建一个)
    for line in data:
        f.write(name+'\n')    #因为本次举例为指纹类型,所以传参的时候name就写指纹类型,比如body double啥之类的
    f.close()

其中,使用os.path.join的方式将两个字符串拼接起来形成一个新的路径,因为在LivDet数据集里面,各种训练集,测试集,材料等等都是分好了的,例如path1选择了LivDet_2015\Training\CrossMatch\Fake,这文件夹里面就有一些分类,name就选定了具体哪个分类下的图像,例如Body,Double,所以一开始采用拼接的方式。

这个txt文件最终会在true_path里面。

接下来需要生成一个实验者身份的文件。先简单介绍一下,本次实验所采用的是LivDet2015-CrossMatch\Fake\Body Double文件下的,大概观察了一下,发现每个实验者会留下三个指纹(会有例外,一开始我看一共有494个文件的时候人都傻了,毕竟494也不是3的倍数,结果发现其中一个人的指纹少了一个,气死了,白花了一个下午)。最终编写程序如下:

def make_identity_txt(path1):
    data = os.listdir(path1)  #老规矩,先导入文件内的图像数据
    limit = len(data)  #获得循环迭代次数
    f = open(path1+'/'+'image_name_classes.txt','w')   #创建一个txt文件并以写入形式打开
    num = 1   #记录在txt文件里的实验者身份,1号为初始实验者
    for i in range(limit):    #把所有图片过一遍
        if int(data[i][11])%3 != 0:    #经过观察发现,图片名字的第12位代表了某个人的指纹编号,所以如果是3的话,才说明这个人的信息结束了
            print(int(data[i][11]))    #找那个缺少的指纹信息用的,实际用的时候可以删掉这一行
            f.write(str(num)+'\n')     #写入实验者编号
        else:
            f.write(str(num)+'\n')     #写入实验者编号
            num+=1     #该实验者数据采集完成,换下一个
    f.close()     #open的形式打开文件的话, 必须要写这一个把它关掉

上面这个代码是我自己写的,没参考啥,所以看起来比较冗杂也比较菜,希望以后复习的时候能有点比较高级的写法。

以NPY的形式保存数据

除此之外,本文献中还包含了一些npy文件,介绍一下,npy文件是numpy专用的二进制文件,因此在读取的时候需要用到numpy库。(这个NPY真的是磨了我好久)

原文中需要3份NPY文件,一个是图片文件本身,一个是记录live/fake,最后一个是Required for Fingerprint authentication(我没看懂这个是啥意思),这里以图片本身为例子记录一下生成过程。
这个过程中我觉得的一个难点是如何把多张图片生成一个NPY文件,我搜索的时候,大多数博客写的是单一一张图片的方式,后来用了一下glob这个包。直接上代码,

def open_images(dict):  #打开图片文件的代码
    img_path = glob(dict)   #遍历整个路径下的文件
    return np.array([cv.imread(img1,0) for img1 in img_path])   #这里我在imread后面加了一个参数0,代表以灰度图的形式打开图片文件

def make_npy(path1):   #这里就正儿八经生成NPY文件了
    imgs = open_images(path1)   #把上面那个函数调用一下
    os.chdir('F:/datasets/LivDet/LivDet_2015/Training/CrossMatch/Fake')   #这句话的意思是把工作路径切换一下,我写这个主要是因为我不知道NPY保存到哪了哈哈哈哈哈,写一下这个,就保存到这个路径了,网上都说在C盘的User/Administrator,不过我是真的没找到,索性直接把工作路径搬过来
    np.save("images.npy",imgs)   #这就是保存了,用np.save语句,第一个参数是你保存的文件名字,第二个参数就是你要保存啥东西

嘶,这么乍一看好像也挺简单的,接下来测试一下,

def open_npy(npyfile):
    return (np.load(npyfile))  np.load后面的参数就是你想读取的文件

res = open_npy('F:/datasets/LivDet/LivDet_2015/Training/CrossMatch/Fake/images.npy')
print(res)

最终得到的结果是:
NPY读取结果
我感觉结果没啥问题,毕竟只能显示这么多数字,这个数据集最边边的元素确实是白色,所以显示255没啥毛病,到这里就算是成功了。

接下来会记录整个论文的复现过程,具体的应用会在复现中写出来。

防火防盗防诈骗

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值