- 保存数据集的位置及图片名称信息
- 需要用到的工具
- 以TXT文本的形式保存数据
- 以NPY的形式保存数据
笔者在对论文进行复现的过程中,没看懂作者给出的代码,以为是无法运行的,因为在代码当中有很多txt文件,但是下载代码的时候并没找到这种文件,后来才发现这种txt文件是需要自己生成的,这是用来记录图片信息的(包括图片名以及自行打上的标签)。因此写下来记录一下这个过程,方便以后的复现。
复现论文:DeFraudNetEnd2End Fingerprint Spoof Detection using Patch Level Attention
本文参考:
pytorch加载自己的图片数据集的两种方法
本文需要用到以下python的包:
os
numpy
opencv
glob
在文中,一共需要生成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没啥毛病,到这里就算是成功了。
接下来会记录整个论文的复现过程,具体的应用会在复现中写出来。
防火防盗防诈骗