LFW人脸图像数据集是一个大型的人脸数据集,经常用于做人脸识别算法的衡量或比赛,其人脸图像来自网络,且在下载的图像包中要已经全部按照人名分别放在对应文件夹里了,这一点挺方便的。
按人名分类好的人脸图像
LFW不像CelebA一样有具体的戴眼镜与否等标签,不过官方也给出了一个txt文件,记录了各个人分别有多少张人脸图像,因此如果要做人脸识别的测试,可以筛选出有多张人脸图像的人的文件夹来做测试。
首先我们把上面的记录了所有人名及对应图像数的txt保存起来,然后用python代码去遍历该txt,找到那些图像大于一张的人,保存到另一个txt中:
代码语言:javascript复制import os
f = open("nameAndNum.txt")
newTxt = "imgMoreThanOne.txt"
newf = open(newTxt, "a ")
lines = f.readlines()
print (len(lines))
num = 1
newNum = 0
for line in lines:
array = line.split()
if (int(array[1]) > 1):
new_context = array[0] ' ' array[1] 'n'
newf.write(new_context)
newNum = newNum 1
num = num 1
if (num % 1000 == 0): print("%d / %d"%(num, len(lines)))
print ("There are %d lines in %s" % (newNum, newTxt))
f.close()
newf.close()
做法就是简单的遍历,找到数量值,判断大于1就存到新txt中去,因为LFW数据集有五千多个人,所以我们每遍历1000张就输出一下,聊作进度条。
筛选完后会发现有1680个人含有两张以上的图像,和官网给出的数据一致。
接着,就需要去移动文件夹了:
代码语言:javascript复制# _*_ coding:utf-8 _*_
import os
import shutil
f = open("imgMoreThanOne.txt")
line = f.readline()
list = os.listdir("./")
num = 0
while line:
for i in range(0, len(list)):
fileName = os.path.basename(list[i])
array = line.split()
if (len(array) < 1): break
if (fileName == array[0]):
oldname= "./" fileName
newname="./多张图像的人/" fileName
shutil.move(oldname, newname)
line = f.readline()
num = num 1
if (i % 500 == 0): print(i)
line = f.readline()
print ("共移动%d个文件夹"%num)
f.close()
这里的做法是大循环遍历txt中每一行,对于每一行的人,在文件夹中进行寻找,如果找到了,则在txt中看下一行,文件夹中的指针也不回退,直接往下找,因为本身文件夹都是按照和txt中同样的顺序排列的,两个指针可以同步往下走,节省时间。
那为什么还要外套一个大while循环遍历txt呢?因为我在一开始的时候只同步推进两个指针找,发现时不时出现找不到txt中的人名文件夹的情况,但实际上文件夹似乎确实在,可能是编码之类的问题导致没识别成功,但这很麻烦,总是移动几个文件夹就停了,而且除非你打印出来,不然你也不知道是哪个没找到,即使打印出来了,要在那么多文件夹里找也是件挺麻烦的事。我的解决方案就是,找不到就算了,跳过,继续找下一个,这样一来虽然会损失一些人,但是可以一移到底,不用老是停下来。
最终我成功筛选除了1500多个人,也够了。