Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >处理筛选CelebA人脸数据集

处理筛选CelebA人脸数据集

作者头像
Cloudox
发布于 2021-11-23 06:12:10
发布于 2021-11-23 06:12:10
1.1K00
代码可运行
举报
文章被收录于专栏:月亮与二进制月亮与二进制
运行总次数:0
代码可运行

CalebA人脸数据集(官网链接)是香港中文大学的开放数据,包含10,177个名人身份的202,599张人脸图片,并且都做好了特征标记,这对人脸相关的训练是非常好用的数据集。

别看只是一堆人脸,他们很贴心地做好了特征标记,也就是说,你可以找到类似下面这些标签:

更贴心的是,他们除了Google盘的下载方式,还为国内研究人员提供了百度网盘的下载链接,这在他们官方都可以找到。

不过刚进入百度网盘的文件,可能有点迷,不知道什么文件是干嘛的,也不知道怎么处理,尤其是对于新手来说,这里就总结一下。

文件含义

进入百度网盘可以看到多个文件,但是都是干什么的呢?应该下载哪个来用呢?

在动手下载之前,最好先读读README文件,里面有比较详细的描述,这里只简单介绍一下:

  • Img文件夹下是所有图片,图片又分三类文件:

其中“img_celeba.7z”文件夹是纯“野生”文件,也就是从网络爬取的没有做裁剪的图片,要解压的话需要整个文件夹一起解压;“img_align_celeba_png.7z”和“img_align_celeba.zip”是把“野生”文件裁剪出人脸部分之后的图片,其中“img_align_celeba_png.7z”是png格式的,比较大,也要整个文件夹一起解压,“img_align_celeba.zip”是jpg格式的,比较小,1G多,我采用的是这个文件,直接解压即可。

不过需要注意的是里面的图片并不是正方形的,所以如果你的网络需要方形图片输入,自己还得处理一遍,后文有这部分的代码。

图中可以看到,人脸图片的名字只是简单的编号,那肤色、发色、眼镜、性别等特征标签在哪呢,在之前的“Anno”文件夹中:

第一个“list_attr_celeba.txt”文本文件就记录了每一张图片的特征标签:

如图所示,第一行表示图片个数,第二行是特征类型,以空格分开,可以看到有超多特征,想想记录过程也真是个漫长的工作。下面的行就是每张图片的标记了,第一列是图片名,后面的每个数字对应每一个特征,1表示正例,-1表示反例。

这样我们就有了图片和特征描述了,那怎么筛选出我们要的人脸图片呢?

处理标签

假设我们要把所有人脸分成戴了眼镜的和没戴眼镜的两份集合,来训练从戴眼镜到不戴眼镜的转换。一个个地人眼去看去分类显然是不现实的,描述文件的意义就在于此。

我们可以写一份Python代码来遍历txt中每一张图片对应的“Eyeglasses”属性列,看是不是1,从而判断对应图片是否戴了眼镜。

数一数可以知道“Eyeglasses”是第16个属性,这样,我们可以读取这份属性描述txt,遍历每一行,看对应列是否是1,从而将图片名筛分到两个txt中去:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = open("list_attr_celeba.txt")
newTxt = "glass.txt"
newf = open(newTxt, "a+")
newNoTxt = "noGlass.txt"
newNof = open(newNoTxt, "a+")

line = f.readline() 
line = f.readline() 
line = f.readline() 
while line:
    array = line.split()
    if (array[0] == "000154.jpg"): print(array[16])

    if (array[16] == "-1"): 
        new_context = array[0] + '\n'
        newNof.write(new_context)
    else: 
        new_context = array[0] + '\n'
        newf.write(new_context)
    line = f.readline()

lines = len(newf.readlines()) 
print ("There are %d lines in %s" % (lines, newTxt)) 
lines = len(newNof.readlines()) 
print ("There are %d lines in %s" % (lines, newNoTxt))

f.close()
newf.close()
newNof.close()

如上代码,我们读取"list_attr_celeba.txt",并且创建两个新txt来分别存储有无戴眼镜的图片名。然后遍历每一行(跳过头两行),去判断眼镜属性是否是1,这里每一列用line.split()分隔开成数组,注意不能用line.split(" "),因为数字之间有时候是一个空格,有时候是两个空格,被坑了一下= =

当然你也可以像我一样先自己去图片集合中找一个戴了眼镜的图片,看看我们的代码是不是把对应的图片名下的1识别出来,我这里找的就是000154.jpg这张图来验证。

最后,我统计了一下有无戴眼镜的人脸的数量,结果是:

筛选图片

得到两个记录了有无戴眼镜的图片名集合txt后,我们就可以根据这个来筛选图片了。

图片共二十多万张,我们如果采用针对一个txt中每个图片名都去从头到尾到文件夹里找一次的方案,处理起来就太慢了。

这里我们采取更快速的方法,遍历文件夹中所有图片,对于遇到的每个图片名(当然,因为文件夹中不止图片,所以先判断是否是图片,也就是后缀是否是.jpg),去记录有无戴眼镜的两个txt中分别找是否包含该图片名,哪个包含,则把该图片移动到对应文件夹下去。

这里还可以优化的是,在txt中找图片名时,也不能每次要找都从头到尾找,而要记录上次找到的位置,因为图片名时按顺序排好的,所以下一张要找的图片名一定会在下面的行,而不会在之前出现过的行,这样也可以提速。

由于两个txt中行数不一致(有无戴眼镜的图片数量不同),所以要判断当一个txt全部找完后,之后就不要再去该txt中找了,更不要继续往后移动行,这样会出错的。

整体优化完成后代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import shutil

nof = open("noGlass.txt")
hasf = open("glass.txt")

noLine = nof.readline() 
hasLine = hasf.readline() 

list = os.listdir("./")
hasGo = True
noGo = True
for i in range(0, len(list)):
    imgName = os.path.basename(list[i])
    if (os.path.splitext(imgName)[1] != ".jpg"): continue

    noArray = noLine.split()
    if (len(noArray) < 1): noGo = False
    hasArray = hasLine.split()
    if (len(hasArray) < 1): hasGo = False

    if (noGo and (imgName == noArray[0])):
        oldname= "./"+imgName
        newname="./noGlass/"+imgName
        shutil.move(oldname, newname)
        noLine = nof.readline()
    elif (hasGo and (imgName == hasArray[0])):
        oldname= "./"+imgName
        newname="./hasGlass/"+imgName
        shutil.move(oldname, newname)
        hasLine = hasf.readline()

    if (i % 100 == 0): print(imgName)

nof.close()
hasf.close()

“no”开头的对应未戴眼镜相关变量,“has”开头的对应戴了眼镜相关变量。思路就是上面说的几个优化的地方了。

这样一套处理二十多万张图片的筛选移动,总共花了不到一分钟。之前未优化时,处理了两个小时还只处理了一万多张,而且是越处理越慢,显而易见,每次都要从头找的话,越到后面,不必要的从头遍历条目越多。

方形脸部截取

虽然CelebA帮我们把人脸部分裁剪出来了,但由于我要处理的网络需要方形图片,也就是宽高相等的图片,所以这里再处理一遍:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PIL import Image
import face_recognition
import os

# for (int i = 1; i <= 10; i++)
list = os.listdir("./")
for i in range(0, len(list)):
    imgName = os.path.basename(list[i])
    if (os.path.splitext(imgName)[1] != ".jpg"): continue

    image = face_recognition.load_image_file(imgName)

    face_locations = face_recognition.face_locations(image)

    for face_location in face_locations:

        # Print the location of each face in this image
        top, right, bottom, left = face_location
        # print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))

        # You can access the actual face itself like this:
        width = right - left
        height = bottom - top
        if (width > height):
            right -= (width - height)
        elif (height > width):
            bottom -= (height - width) 
        face_image = image[top:bottom, left:right]
        pil_image = Image.fromarray(face_image)
        pil_image.save('face%s'%imgName)

这份代码就是遍历文件夹中的所有图片,用face_recognition库去识别出人脸位置的上下左右坐标,基本识别得出的坐标就已经是方形的了,特殊情况下会有一个像素的误差,所以我强制对比了一次宽高,不一样就改成一样的,对裁剪的影响也不会很大。需注意的是要运行这份代码需要安装face_recognition库和PIL库,如何安装就可以直接搜索教程了。

这里我们就得到了所有高宽相等的人脸二次裁剪图片。

还要注意的一点是这里只保证了每张图片自身高宽相等,图片之间的尺寸并不一定是同样大小的。

这样,就完成了针对一个维度去做二位类处理筛选数据集的工作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/11/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LFW人脸数据集筛选有多张图的人
LFW人脸图像数据集是一个大型的人脸数据集,经常用于做人脸识别算法的衡量或比赛,其人脸图像来自网络,且在下载的图像包中要已经全部按照人名分别放在对应文件夹里了,这一点挺方便的。
Cloudox
2021/11/23
7610
LFW人脸数据集筛选有多张图的人
CNN训练与测试人脸图片分类(TensorFlow)
实验需要判断人脸是否戴了眼镜,所以参考网上的文章弄了个简单的CNN图片分类器来做戴眼镜与否的判定。
Cloudox
2021/11/23
9510
CNN训练与测试人脸图片分类(TensorFlow)
PaddlePaddle实现人脸识别系统一——人脸数据集的获取
开发人脸识别系统,人脸数据集是必须的。所以在我们开发这套人脸识别系统的准备工作就是获取人脸数据集。本章将从公开的数据集到自制人脸数据集介绍,为我们之后开发人脸识别系统做好准备。
夜雨飘零
2020/05/01
3.6K0
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
由于篇幅原因,后面一篇写各个算法背后的原理,原理背后的相关知识的了解,人脸识别项目总遇到的问题
全栈程序员站长
2022/06/26
1.6K0
基于OpenCV3实现人脸识别(实践篇)[通俗易懂]
基于OpenCv的人脸识别(Python完整代码)
采集人脸图片的方法多种多样,可以直接从网上下载数据集,可以从视频中提取图片,还可以从摄像头实时的采集图片。
全栈程序员站长
2022/06/26
7K0
基于OpenCv的人脸识别(Python完整代码)
人脸识别常用开源数据集大全
本文总结整理了10个开源的人脸识别数据集,并附有相关下载链接,希望能给大家带来一些帮助。
3D视觉工坊
2022/03/11
4.6K0
人脸识别常用开源数据集大全
深度学习之人脸识别模型--FaceNet
​ https://github.com/davidsandberg/facenet
MiChong
2020/09/24
5.3K0
深度学习之人脸识别模型--FaceNet
基于CelebA数据集的GAN模型
上篇我们介绍了celebA数据集 CelebA Datasets——Readme 今天我们就使用这个数据集进行对我们的GAN模型进行训练 首先引入一个库 mtcnn 是一个人脸识别的深度学习的库,传入一张人脸好骗,mtcnn库可以给我们返回四个坐标,用这四个坐标就可以组成一个矩形框也就是对应的人脸位置 安装方式: pip install mtcnn 教程中的用法: 下面是一个完整的实例,准备数据集 # example of extracting and resizing faces into a
Tom2Code
2023/02/14
1.4K0
基于CelebA数据集的GAN模型
StyleGAN 调整面部表情,让虚拟人脸更生动
🎈 人脸表情通过上一篇文章 StyleGAN 生成的人脸:https://cloud.tencent.com/developer/article/2242603人脸图片都是比较中规中矩的,如果能够给人脸增加一些表情的话,会让人脸显得更加的自然和逼真那么调整人脸的年龄、颜值、笑容、情绪等细节,就显得非常的重要了图片🎈 调整步骤在上一篇文章中,我们知道生成人脸是通过 main.py 这个程序其实在项目 main.py 同级目录下,还有一个 edit_photo.py 程序这个程序就是用来调整生成的人脸的表情的只
江户川码农
2023/03/21
1.1K2
StyleGAN 调整面部表情,让虚拟人脸更生动
轻松学Pytorch-自定义数据集制作与使用
大家好,这是轻松学Pytorch系列的第六篇分享,本篇你将学会如何从头开始制作自己的数据集,并通过DataLoader实现加载。本文以人脸Landmard五点的数据集标定与之制作为例来说明pytorch中如何实现自定义数据集读取与加载。
OpenCV学堂
2020/06/04
1.3K0
轻松学Pytorch-自定义数据集制作与使用
工具系列 | H5如何实现人脸识别
人脸识别技术在当下已经十分成熟,但主要在移动端和专有设备应用上较为普及,而在Web端并不多见,本着学习的目的从零实现web端的人脸登录功能。
Tinywan
2020/07/23
3.8K0
工具系列 | H5如何实现人脸识别
想要训练专属人脸识别模型?先掌握构建人脸数据集的三种绝招
雷锋网 AI 研习社按,随着深度学习的发展,很多技术已经落地,成为我们每天都能接触到的产品,人脸识别就是其中之一。人脸识别的应用范围很广,涉及上下班打卡、门禁、设备登录、机场、公共区域的监控等多个领域。
AI研习社
2018/07/26
1.4K0
想要训练专属人脸识别模型?先掌握构建人脸数据集的三种绝招
人脸生成黑科技:使用VAE网络实现人脸生成
上一节我们描述了VAE网络的数学原理,特别强调了它能把输入数据隐射到一个区域内,这种特性带来一个特点是,如果将两个不同数据输入网络得到两个区间,这两个区间要是有重合的话,我们在重合的区域内取一点让解码器进行还原,那么被还原的数据就有可能兼具两个输入数据的特点融合,就好像孩子兼具爸爸与妈妈的特征那样,这点特性在人脸生成上大有用场。
望月从良
2020/02/11
1.8K0
人脸生成黑科技:使用VAE网络实现人脸生成
【技术综述】一文道尽“人脸数据集”
这一次我将从人脸检测,关键点检测,人脸识别,人脸表情,人脸年龄,人脸姿态等几个方向整理出人脸领域有用的数据集清单,不全也有9成全吧。
用户1508658
2019/07/26
2.1K0
python+shell 备份 csdn 博客文章
前面,我们将所有的博客文章全部备份下来了。但是,博客当中的那些图片,还是散落在各处。有的在第三方的网站上,有的在 CSDN 的服务器上,有的直接引用的其他地方的图片。
FungLeo
2019/05/27
4870
关于OpenCV for Python入门-自带人脸检测算法比较
本来学习OpenCV的目的就是为了做人脸识别、车辆识别、人群计数等等,识别人脸首先要进行人脸检测,OpenCV中内置了Haar Cascade人脸分类器,其中包括haarcascade_frontalface_alt、haarcascade_frontalface_alt_tree、haarcascade_frontalface_alt2、haarcascade_frontalface_default这四种,本文不求甚解,只是从比对上判断一下这几种内置分类器的可用性。
python与大数据分析
2022/04/02
7090
关于OpenCV for Python入门-自带人脸检测算法比较
从零开始制作一个数据集
下载完成之后需要人工筛选一下,里面会夹杂一些乱七八糟的图片,以及主体不是目标的图片,筛选两三遍,最后可能也就找几百张,像前面别人做好的数据集那样一下 60000 张可麻烦了,可以用一些方法让他们翻倍,比如改变一下图片的亮度、对比度、把图片左右反转一下等等
yichen
2021/03/10
1.8K1
Python 学习入门(12)—— 文件
python进行文件读写的函数是open或file: f = open(filename, mode)
阳光岛主
2019/02/19
5130
实战:人脸识别的Arcface实现 | CSDN博文精选
本文将简单讲述arcface从训练到部署的整个过程,主要包括前期的数据筛选和准备,模型训练以及模型部署。
AI科技大本营
2019/10/28
8.9K0
实战:人脸识别的Arcface实现 | CSDN博文精选
人脸识别系统的原理与实现:PNET训练数据预处理2
上一节我们详细说明了如何为PNET生成用于训练的人脸图片,本节我们需要将上一节分割出的人脸图片存储成文件,相关代码如下:
望月从良
2021/01/02
6600
人脸识别系统的原理与实现:PNET训练数据预处理2
推荐阅读
相关推荐
LFW人脸数据集筛选有多张图的人
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验