LFW人脸数据集筛选有多张图的人

LFW人脸图像数据集是一个大型的人脸数据集,经常用于做人脸识别算法的衡量或比赛,其人脸图像来自网络,且在下载的图像包中要已经全部按照人名分别放在对应文件夹里了,这一点挺方便的。

按人名分类好的人脸图像

LFW不像CelebA一样有具体的戴眼镜与否等标签,不过官方也给出了一个txt文件,记录了各个人分别有多少张人脸图像,因此如果要做人脸识别的测试,可以筛选出有多张人脸图像的人的文件夹来做测试。

首先我们把上面的记录了所有人名及对应图像数的txt保存起来,然后用python代码去遍历该txt,找到那些图像大于一张的人,保存到另一个txt中:

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个人含有两张以上的图像,和官网给出的数据一致。

接着,就需要去移动文件夹了:

# _*_ 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多个人,也够了。


查看作者首页

你可能感兴趣的:(LFW人脸数据集筛选有多张图的人)