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

简介

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、百度云盘下载。
这里将两个云盘的下载链接放在下方,大家可根据自身情况选择任意一个下载,下载内容均相同。

在这里插入图片描述

下载后大家将会得到如下三个文件夹和一个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 Image


if __name__ == "__main__":
    root_dir = './datasets'
    celeba = CelebA(root=root_dir, split='all',
                    target_type=['attr', 'identity', 'bbox', 'landmarks'],
                    download=False)
    attr_names = celeba.attr_names
    attr_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)
        # 身份ID
        cele_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

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

  • 21
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值