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中去:

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

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

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

筛选图片

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

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

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

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

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

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

import os
import shutilnof = 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"): continuenoArray = noLine.split()if (len(noArray) < 1): noGo = FalsehasArray = hasLine.split()if (len(hasArray) < 1): hasGo = Falseif (noGo and (imgName == noArray[0])):oldname= "./"+imgNamenewname="./noGlass/"+imgNameshutil.move(oldname, newname)noLine = nof.readline()elif (hasGo and (imgName == hasArray[0])):oldname= "./"+imgNamenewname="./hasGlass/"+imgNameshutil.move(oldname, newname)hasLine = hasf.readline()if (i % 100 == 0): print(imgName)nof.close()
hasf.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

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

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

方形脸部截取

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

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"): continueimage = 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 imagetop, 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 - leftheight = bottom - topif (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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

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

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

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


处理筛选CelebA人脸数据集

处理筛选CelebA人脸数据集相关推荐

  1. 关于Celeba人脸数据集的介绍

    CeleA是香港中文大学的开放数据,包含10177个名人身份的202599张图片,并且都做好了特征标记,这对人脸相关的训练是非常好用的数据集. 官网链接 网盘链接 别看只是一堆人脸,他们很贴心地做好了 ...

  2. CelebA人脸数据集

    CeleA是香港中文大学的开放数据,包含10177个名人身份的202599张图片,并且都做好了特征标记,这对人脸相关的训练是非常好用的数据集. 官网链接 网盘链接 别看只是一堆人脸,他们很贴心地做好了 ...

  3. 常见公开人脸数据集的获取和制作自定义人脸数据集

    原文博客:Doi技术团队 链接地址:https://blog.doiduoyi.com/authors/1584446358138 初心:记录优秀的Doi技术团队学习经历 前言 开发人脸识别系统,人脸 ...

  4. 【机器学习】 - 各种人脸数据集下载地址及说明汇总

    1. Olivetti Faces人脸数据集 由40个人组成,共计400张人脸: 每人的人脸图片为10张,包含正脸.侧脸以及不同的表情: 整个数据集就是一张大的人脸组合图片,下载地址:https:// ...

  5. 深度学习自学(二十六):人脸数据集

    人脸检测,关键点检测,人脸识别,人脸表情,人脸年龄,人脸姿态等方向的数据集. 01 人脸检测 所谓人脸检测任务,就是要定位出图像中人脸的大概位置. 1.1 Caltech 10000 数据集地址:ht ...

  6. 【总结】最全1.5万字长文解读7大方向人脸数据集v2.0版,搞计算机视觉怎能不懂人脸...

    人脸图像是计算机视觉领域中研究历史最久,也是应用最广泛的图像.从人脸检测.人脸识别.人脸的年龄表情等属性识别,到人脸的三维重建等,都有非常多的数据集被不断整理提出,极大地促进了该领域的发展. 本次,我 ...

  7. 常用公开人脸数据集汇总,持续更新中~~

    转载请注明作者和出处: http://blog.csdn.net/john_bh/ 文章目录 一. 人脸数据汇总表 1.人脸检测 2.人脸关键点检测 3.人脸表情 4.年龄与性别 5.人脸姿态 6.人 ...

  8. 人脸数据集汇总 MS1M-IBUG MS1M-ArcFace MS1M-RetinaFace 等

    人脸数据集不太好直接找到,实际在 github上的insightface里有汇总. 说明: MS1M-IBUG : MS1M V1 MS1M-ArcFace : MS1M V2 MS1M-Retina ...

  9. 【技术综述】一文道尽“人脸数据集”

    言有三 毕业于中国科学院,计算机视觉方向从业者,有三工作室,有三AI学院等创始人 作者 | 言有三 编辑 | 言有三 今天,给大家送上一份大礼 没错,我就是喜欢写一些"一文道尽" ...

最新文章

  1. Redis重新连接弹性
  2. what are the added values for the research?
  3. 实验9 SQL Server 的触发器
  4. Python基础(二)--数据类型,运算符与流程控制
  5. [深度学习-实战篇]情感分析之卷积神经网络-TextCNN,包含代码
  6. Jeff Dean谈2020年机器学习趋势:多任务和多模态会有大进展
  7. 实时媒体AI,打破内容创作天花板,加速视频创新
  8. iPhone 14系列贴膜曝光:将采用开孔屏方案 四边框极窄
  9. 华为手机芯片断供,有没有可能回收旧手机解决目前困境?
  10. http.client.ResponseNotReady: Request-sent
  11. java 静态绑定_java的动态绑定和静态绑定
  12. AWT_Swing_JTextField (Java)
  13. 破圈了!完美日记凭什么让周迅成为全球品牌代言人
  14. LitePal简单用法
  15. MFC使用SaveAs函数保存Excel文件时,弹出“文件已存在”问题
  16. 【M-PARTNER】魔窗携手心意点点,共创App增长新生态!
  17. 图的邻接(链)表表示法 Graph adjacency list representation
  18. linux grep正则表达式与grep用法详解
  19. 分布式系统中的幂等性(客户端与服务端的交易一致性,避免多次扣款)
  20. 漏洞解决方案-远程DNS服务允许递归查询

热门文章

  1. EventBus使用详细讲解,结合示例
  2. 《Go语言圣经》笔记(1-4章)
  3. 【微信小程序】列表渲染wx:for
  4. 2017年河北省大学生程序设计竞赛 奇异旅馆 【并查集+树状数组】
  5. 简述光纤通信有哪些优势特点分析
  6. Android之使用Http协议实现文件上传示例(上传MP3文件)
  7. Gallery2修改记录
  8. windows找不到文件,怎么办?
  9. 你需要了解的帕金森定律和脑梗
  10. 服务器系统巡检命令,服务器巡检操作规划.pdf