详解CelebA数据集下载、读取【基于Python实现】

文章目录

  • 简介
  • CelebA数据集下载
  • 基于Python和PyTorch读取CelebA数据并可视化
    • torchvision.datasets.CelebA介绍
    • root根目录文件夹下CelebA文件存储方式如下
    • 可视化以及代码
  • 参考资料

简介

CelebA数据集是由香港中文大学多媒体实验室发布的大规模人脸属性数据集,包含超过 20 万张名人图像,每张图像有 40 个属性注释。CelebA数据集全拼是Large-scale CelebFaces Attributes (CelebA) Dataset。 该数据集中的图像涵盖了丰富的人体姿势变化和复杂多样的背景信息。涵盖了分类、目标检测和关键点检测等数据。本篇博客将详细介绍CelebA数据集的 下载可视化

注意:

  1. CelebA数据集并非一直不变,作者可能会根据需要添加一些新的数据。但基本上不会改变原有的数据,这个大家不同太担心。⭐️⭐️
  2. 香港中文大学多媒体实验室并不具备CelebA数据集中所有图像的版权,大家能切仅能将其作为学术研究和学习的用途。🔥🔥

CelebA数据集下载

CelebA官方网站【https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html】提供两种下载方式:1、谷歌云盘下载;2、百度云盘下载。
这里将两个云盘的下载链接放在下方,大家可根据自身情况选择任意一个下载,下载内容均相同。

在这里插入图片描述

  • 谷歌云盘连接:https://drive.google.com/drive/folders/0B7EVK8r0v71pWEZsZE9oNnFzTm8?resourcekey=0-5BR16BdXnb8hVj6CNHKzLg&usp=sharing
    在这里插入图片描述
  • 百度云盘链接【密码:rp0s,若需要!】:https://pan.baidu.com/s/1eSNpdRG#list/path=%2F【推荐使用🚀🚀】
    在这里插入图片描述

下载后大家将会得到如下三个文件夹和一个txt文件。
在这里插入图片描述
其中每个文件夹中的文件内容大体上如下所示:

  • Anno文件夹:

    • identity_CelebA.txt:身份信息记录文件。该txt文件包含两列数据:1、人脸图像名;2、图像对应的名人身份ID。
      在这里插入图片描述

    • list_attr_celeba.txt:裁剪对对齐后的人脸标签属性记录文件。该txt文件第一行为图片数量,第二行为属性标签,后面的每一行分别是图片名+标签值。其中标签值为1表示具有改标签属性,为-1则不具备。
      在这里插入图片描述

    • list_bbox_celeba.txt:裁剪对对齐后的人脸标注框记录文件。该txt文件第一行为数据集图片数量,第二行为image_id、x_1、y_1、width height分别表示人脸标注框左上角像素坐标以及标注框的宽和高。后续所有行则为图片名和标注框的具体数据值。注意:这里的标注框对应原始图像!!
      在这里插入图片描述

    • list_landmarks_align_celeba.txt:裁剪对对齐后关键信息点数据记录文件。该txt文件第一行为数据集图片数量,第二行为lefteye_x、lefteye_y、righteye_x、righteye_y、nose_x、nose_y、leftmouth_x、leftmouth_y、rightmouth_x、rightmouth_y关键点标签,分别表示左眼横像素坐标、左眼纵像素坐标、右眼横像素坐标、右眼纵像素坐标、鼻子横像素坐标、鼻子纵像素坐标、左嘴角横像素坐标、左嘴角纵像素坐标、右嘴角横像素坐标、右嘴角纵像素坐标。后续所有行则为图片名和特征点的具体数据值。
      在这里插入图片描述

    • list_landmarks_celeba.txt:为裁剪对对齐前原始图像中关键信息点数据记录文件。具体内容解释详见上方的list_landmarks_align_celeba.txt说明。
      在这里插入图片描述

  • Eval文件夹:

    • list_landmarks_celeba.txt:该txt文件包含两列数据的,第一列数据对应图片名称,第二列数据对同一行的图片所属数据集。其中,0表示训练集training set,1表示验证集validation set,2表示测试集test set。
  • Img文件夹:注意这里的后缀为’7z.0xx’的文件需要用7-zip压缩软件解压到本地。

    • img_align_celeba_png.7z:解压该7z压缩文件后,将会得到16个新的7z压缩文件【如下图所示】,全部解压后你将会得到202,599 张原始网页人脸图像

    • 在这里插入图片描述

    • img_celeba.7z:解压该7z压缩文件后,同样将会得到16个新的7z压缩文件【如下图所示】,全部解压后你将会得到202,599 张对齐和裁剪的脸部图像。对齐和裁剪过程为:首先根据两眼位置使用相似变换对图像进行粗略对齐;然后,将对齐后的图片大小裁剪为218*178。【注意区分和img_align_celeba_png.7z压缩文件的区别】。注意这里的后缀为’7z.0xx’的文件需要用7-zip压缩软件解压到本地。
      在这里插入图片描述

    • img_align_celeba.zip:解压后将得到一个同名的文件夹,里面包含了202599张JPEG已经对齐和裁剪好的名人头像图片。
      在这里插入图片描述

  • README.txt:数据集的英文介绍,英文不错的朋友建议阅读,英文差的同学也推荐使用翻译软件学习一下,这有助于帮助大家了解CelebA数据集。

基于Python和PyTorch读取CelebA数据并可视化

大家从百度云盘或者谷歌云盘下载得到的CelebA数据集包括三个文件夹和一个README.txt文件。具体的说明详见上一小节。

解压后的ClelebA数据集中图片为jpg或者png图片,通过OpenCV或者PIL等Python软件包就可以直接加载。对应的数据标签文件为txt文件,需要手动写一下读取脚本,当然也可以直接使用torchvision.datasets.CelebA这个API直接读取,但需要将数据集按照下面的方式进行存储。

此处讲解通过PyTorch的API加载相关数据集进行说明。首先下载下来的CelebA数据集并不能通过torchvision.datasets.CelebA接口进行直接读取和调用,要解压对齐和裁剪后的图片以及标签和数据集划分txt文件到统一的celeba文件夹下【注意:文件夹名称需为全小写英文字母】,方可通过torchvision.datasets.CelebA这个API接口进行读取和操作。

torchvision.datasets.CelebA介绍

torchvision.datasets.CelebA原型定义如下:
torchvision.datasets.CelebA(
root: str,
split: str = “train”,
target_type: List[str] | str = “attr”,
transform: ((…) -> Any) | None = None,
target_transform: ((…) -> Any) | None = None,
download: bool = False
)
输入参数介绍:

参数类型介绍
root下载文件存储的根目录下载时会在此根目录中穿件一个全小写celeba文件夹,并将所有的文件存储在新创建的文件夹中。若无需下载,及download参数为False,则自动加载该根目录下中的数据集文件,此时需要所有的文件按照一定的规则存储,据图详见此表后的图解
split加载时对对应的数据集。此参数为一个字符串,可选参数为’train’,‘valid’,‘test’,‘all’,分别代表训练集、验证集、测试集和所有数据集。注意:无论此处怎么设置均会下载所有数据集,只是加载进当下实例的数据会有所区别。
target_type目标标签数据类型。字符串或者字符串列表,可选参数有’attr’、‘bbox’、‘identity’、'lanmarks‘’。分别对应属性数据、标注框数据、身份数据和特征点数据
transform图片的转换相关转换会应用到对应的图像上
target_transform目标类型的转换相关转换会应用到相应的标签数据相
download是否下载,布尔类型True表示下载,自动在根目录root下面创建一个cleleba的文件夹,并将数据集文件下载在其中。为False则不下载,会自动加载root根目录下面cleleba文件夹下面的文件。若组织方式错误,或者相关文件不存在则会报错

root根目录文件夹下CelebA文件存储方式如下

root
| - cleleba
| – img_align_celeba
| – img_align_celeba.zip
| – list_attr_celeba.txt
| – list_bbox_celeba.txt
| – identity_CelebA.txt
| – list_bbox_celeba.txt
| – list_eval_partition.txt
| – list_landmarks_align_celeba.txt
| – list_landmarks_celeba.txt
| – README.txt
在这里插入图片描述

可视化以及代码

  • 数据集前四张图片以及对应的身份标签(图片标题)、属性标签(X标签值)、关键点(图片中的小蓝点)。因为标注框看对应的原图,不能在对齐裁剪后的图片中进行展示,下方将单独给出标注框的可视化结果!
    在这里插入图片描述

  • 第2张图片原图对对应的标注框
    在这里插入图片描述

  • 可视化的代码

注意:在工程目录下应该有一个专门存储CelebA数据集的datasets文件夹,datasets文件夹下应该有celeba文件夹用于单独存放所有的CelebA图片和标签文件。
./datasets/celeba/目录下的内容如下:

在这里插入图片描述
目录中的内容除了’img_celeba’文件夹下面存储了原始图像,其他和torchvision.datasets.CelebA所需目录组织方式相同!

#!/usr/bin/env python3
# -*- encoding utf-8 -*-import numpy as np
np.set_printoptions(suppress=True, precision=4)
from torchvision.datasets import CelebA
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 12
import cv2
from PIL import Imageif __name__ == "__main__":root_dir = './datasets'celeba = CelebA(root=root_dir, split='all',target_type=['attr', 'identity', 'bbox', 'landmarks'],download=False)attr_names = celeba.attr_namesattr_names.pop()attr_names = np.array(attr_names)    fig = plt.figure(figsize=(14, 7))for idx in range(4):img, (attr, identity, bbox, landmarks) = celeba[idx]  # 读取图片和相关标签值ax = fig.add_subplot(1, 4, idx + 1)# 不显示刻度标签和边框ax.set_xticks([])ax.set_yticks([])ax.set_frame_on(b=False)    # 将CelebA数据集读取到的PIL图片格式转换成OprnCV所需格式img_cv2 = cv2.cvtColor(src=np.asanyarray(img), code=cv2.COLOR_RGB2BGR)# 特征点landmarks = landmarks.numpy()for idx, point in enumerate(landmarks):if idx % 2 == 0:cv2.circle(img=img_cv2, center=(point, landmarks[idx + 1]),radius=1, color=(255, 0, 0), thickness=2)attr_list = attr.numpy()attrs = attr_names[attr_list==1]label = ''     # 属性标签for att in attrs:label = label + att + '\n'ax.set_xlabel(label)# 身份IDcele_id = identity.numpy()ax.set_title(f'ID: {cele_id}')# 将OpenCV图片再次转成成Pillow图片格式img_pil = Image.fromarray( cv2.cvtColor(src=img_cv2,code=cv2.COLOR_BGR2RGB,))ax.imshow(img_pil)plt.savefig(root_dir + '/' + 'celeba.jpg', dpi=600, format='jpg',bbox_inches='tight')fig = plt.figure()img, (attr, identity, bbox, landmarks) = celeba[1]  # 获取第一张图片的标注框bbox = bbox.numpy()ax = fig.add_subplot(1, 1, 1)# 不显示刻度标签和边框ax.set_xticks([])ax.set_yticks([])ax.set_frame_on(b=False)# 标注框img_cv2 = cv2.imread(filename=root_dir + '/' \+ 'celeba/img_celeba/000002.jpg')cv2.rectangle(img=img_cv2, pt1=(bbox[0], bbox[1]),pt2=(bbox[0] + bbox[2], bbox[1] + bbox[3]),thickness=1,color=(0, 0, 255))img = cv2.cvtColor(src=img_cv2, code=cv2.COLOR_BGR2RGB)ax.imshow(img)plt.savefig(root_dir + '/' + 'origin_celeba.jpg', dpi=600, format='jpg',bbox_inches='tight')

参考资料

  1. 官网:Large-scale CelebFaces Attributes (CelebA) Dataset

收集整理和创作不易, 若有帮助🉑, 请帮忙点赞👍➕收藏❤️, 谢谢!✨✨🚀🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换 将十进制数转换为二进制表示形式的最简单方法是“除二法”&#xff0c;可用栈来跟踪二进制结果。 除二法 下面实现一个将十进制数转换为二进制或十六进制的算法&#xff0c;代码如下&#xff1a; #[derive(Debug)] struct Stack<T> {size: usize, // 栈大…

蓝桥杯每日一题----单调栈和单调队列

单调栈和单调队列 单调栈 单调栈即栈内的元素是单调递减或者单调递增的&#xff0c;我们通过一个题目来理解。 单调栈模板题 题目描述 给出项数为 n 的整数数列 a 1 … a n a_1…a_n a1​…an​。 定义函数 f ( i ) f(i) f(i)代表数列中第 i 个元素之后第一个大于 a i …

Redis面试题整理(持续更新)

1. 缓存穿透&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到 DB 去查询&#xff0c;可能导致DB挂掉&#xff0c;这种情况大概率是遭到了攻击。 解决方案&#xff1a; …

python-分享篇-自定义词云图颜色

文章目录 准备代码效果 准备 运行本程序需要安装第三方模块matplotlib、jieba、wordcloud 和scipy &#xff0c;scipy要求1.0.0版本&#xff0c;否则程序将出现导入错误&#xff1a;ImportError: cannot import name ‘imread’ from ‘scipy.misc’ ImportError: cannot impo…

Linux下的自动化任务与计划任务:让你的系统更智能

在日常的Linux系统管理中&#xff0c;你是否经常需要定时执行某些任务&#xff0c;或者希望在系统启动时自动运行某些脚本&#xff1f;如果是的话&#xff0c;那么自动化任务和计划任务将是你的得力助手。它们可以帮助你提高系统效率、减少人工干预&#xff0c;并确保任务能够按…

【汇编】简单的linux汇编语言程序

一、Linux系统汇编语言 Linux系统上的汇编语言可以使用不同的语法风格&#xff0c;主要包括Intel语法和AT&T语法。这两种语法有各自的特点和风格区别&#xff0c;尽管它们表示的底层机器指令相同。下面分别对两种语法进行简要说明&#xff1a; Intel语法 Intel语法是由I…

有啥办法把百度地图某个点1公里范围内截个图?

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 东方欲晓&#xff0c;莫道君行早。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银交流群【上海新年人】问了一个地图截图的问题&#xff…

找不到目标和方向,怎么办?

现代社会里&#xff0c;许多人常见的症状&#xff0c;就是「空心病」。 什么是空心病呢&#xff1f;类似这样&#xff1a; 我知道要有目标&#xff0c;但我就是不知道想做什么&#xff0c;感觉对一切事物都提不起兴趣&#xff0c;没有动力&#xff0c;怎么办&#xff1f; 这个…

【C语言】socketpair 的系统调用

一、 Linux 内核 4.19socketpair 的系统调用 SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,int __user *, usockvec) {return __sys_socketpair(family, type, protocol, usockvec); } 这段代码定义了一个名为 socketpair 的系统调用。系统调用是操作…

AI算法参数个数本身优化空间

一、背景 AI算法的参数数量并非越多越好&#xff0c;也不是越少越好。参数的数量与模型的复杂度密切相关&#xff1a; 1. 参数多&#xff08;高复杂度模型&#xff09;&#xff1a; - 优点&#xff1a;模型具有更强的表达能力和拟合能力&#xff0c;对于复杂的、非线性的数据分…

C 语言 devc++ 使用 winsock 实现 windows UDP 局域网发送消息

U参考来源 U 这里移植到windows 上 &#xff0c;使用 devc 开发。 服务端代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <winsock2.h>int main() {WORD sockVersion MAKEWORD(2, 2);WSAD…

微服务多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存…

MATLAB实现朴素贝叶斯分类

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的分类算法&#xff0c;它假设特征之间相互独立&#xff0c;从而简化了计算复杂性。该算法常用于文本分类、垃圾邮件过滤、情感分析等应用场景。 MATLAB实现鸢尾花数据集分类代码如下&#xff1a; clear lo…

2024 CKS 题库 | 7、Dockerfile检测

不等更新题库 CKS 题库 7、Dockerfile检测 Task 分析和编辑给定的Dockerfile /cks/docker/Dockerfile&#xff08;基于ubuntu:16.04 镜像&#xff09;&#xff0c; 并修复在文件中拥有的突出的安全/最佳实践问题的两个指令。 分析和编辑给定的清单文件 /cks/docker/deployme…

Python·turtle库编程之:怎么画一个五角星?

文章目录 前言源码附&#xff1a; 前言 大家好&#xff0c;我是BoBo仔&#xff0c;这节课我要带来一期turtle库的使用教程——画五角星。话不多说&#xff0c;我们直接上代码。 源码 import turtle as t t.pencolor(yellow) t.fillcolor("yellow") t.penup() t.go…

react 【七】各种hooks的使用/SPA的缺点

文章目录 1、Hook1.1 为什么会出现hook1.2 useState1.3 useEffect1.4 useContext1.5 useReducer1.6 useCallback1.7 useMemo1.8 useRef1.8.1 ref绑定dom1.8.2 ref解决闭包缺陷 1.9 useImperativeHandle1.10 useLayoutEffect1.11 自定义Hook1.11.1 什么是自定义Hook1.11.2 Conte…

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

【Deep Learning 1】神经网络的搭建

&#x1f31e;欢迎来到PyTorch的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年2月16日&a…

消息队列RabbitMQ-使用过程中面临的问题与解决思路

消息队列在使用过程中会出现很多问题 首先就是消息的可靠性&#xff0c;也就是消息从发送到消费者接收&#xff0c;消息在这中间过程中可能会丢失 生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中&#xff0c;这些过程中消息都可能会丢失。 …

gem5 garnet 合成流量: packet注入流程

代码流程 下图就是全部. 剩下文字部分是细节补充,但是内容不变: bash调用python,用python配置好configuration, 一个cpu每个tick运行一次,requestport发出pkt. bash 启动 python文件并配置 ./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \--num-cpus…