栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

基于python对LivDet数据集处理记录(TXT和NPY文件的处理)
  • 保存数据集的位置及图片名称信息
    • 需要用到的工具
      • 以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_2015TrainingCrossMatchFake,这文件夹里面就有一些分类,name就选定了具体哪个分类下的图像,例如Body,Double,所以一开始采用拼接的方式。

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

接下来需要生成一个实验者身份的文件。先简单介绍一下,本次实验所采用的是LivDet2015-CrossMatchFakeBody 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)

最终得到的结果是:

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

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

防火防盗防诈骗

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037234.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号