CelebA(CelebFaces Attributes)数据库是一个大规模人脸图像数据集,由香港中文大学多媒体实验室于2015年发布,广泛应用于人脸识别、属性标注、图像生成等计算机视觉任务,该数据集包含超过20万张名人图像,每张图像均有40个二值属性标注(如“戴眼镜”“微笑”等),并提供了5个关键点位置和边界框信息,使其成为人脸分析领域的重要基准数据源,以下是CelebA数据库的具体使用方法,涵盖数据获取、预处理、模型训练及应用等环节。
数据获取与解压
申请与下载
访问CelebA官方主页(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html),注册并填写申请表,审核通过后即可下载数据集,数据集分为四个部分:Img/img_align_celeba
:对齐后的人脸图像(尺寸为178×178像素),共202,599张。Eval/list_eval_partition.txt
:数据集划分文件,将图像分为训练集(162,770张)、验证集(19,867张)和测试集(19,962张)。Anno/list_attr_celeba.txt
:40个属性的标注文件,每行对应一张图像,用“1”或“-1”表示是否具有该属性(如“5_o_Clock_Shadow”为1表示有胡茬)。Anno/list_landmarks_align_celeba.txt
:5个关键点坐标(左眼、右眼、鼻尖、左嘴角、右嘴角),用于人脸对齐或关键点检测任务。
下载后解压至指定目录,建议结构如下:
CelebA/ ├── Img/ │ └── img_align_celeba/ # 图像文件 ├── Eval/ │ └── list_eval_partition.txt # 数据集划分 ├── Anno/ │ ├── list_attr_celeba.txt # 属性标注 │ └── list_landmarks_align_celeba.txt # 关键点坐标
数据解析与预处理
加载标注信息
使用Python读取标注文件,例如解析属性标注:import pandas as pd attr_df = pd.read_csv('Anno/list_attr_celeba.txt', delim_whitespace=True, header=1) attr_df.columns = ['image_id'] + attr_df.columns[1:].tolist() # 将-1转换为0,1转换为1(表示是否具有属性) attr_df[attr_df.columns[1:]] = (attr_df[attr_df.columns[1:]] + 1) // 2
数据集划分
根据list_eval_partition.txt
划分数据集,partition_df = pd.read_csv('Eval/list_eval_partition.txt', delim_whitespace=True, header=None, names=['image_id', 'partition']) train_df = partition_df[partition_df['partition'] == 0] val_df = partition_df[partition_df['partition'] == 1] test_df = partition_df[partition_df['partition'] == 2]
图像预处理
CelebA图像已对齐,但仍需根据任务需求进一步处理:- 尺寸调整:将图像缩放至模型输入尺寸(如224×224用于ResNet)。
- 数据增强:训练时随机裁剪、翻转、调整亮度/对比度,提升模型泛化能力。
- 归一化:按ImageNet均值([0.485, 0.456, 0.406])和标准差([0.229, 0.224, 0.225])归一化。
示例代码(使用PyTorch):
from torchvision import transforms transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])
典型任务应用
人脸属性分类
以“是否戴眼镜”属性为例,构建CNN模型进行二分类:- 数据加载:使用
ImageFolder
或自定义Dataset
加载图像及对应属性标签。 - 模型设计:选用ResNet18、VGG等骨干网络,替换最后一层为全连接层(输出维度为1,Sigmoid激活)。
- 损失函数:二元交叉熵损失(BCEWithLogitsLoss)。
- 训练流程:分批次训练,监控验证集准确率,防止过拟合。
- 数据加载:使用
人脸关键点检测
利用list_landmarks_align_celeba.txt
中的5个关键点坐标,回归任务训练模型:- 标签处理:将坐标归一化至[0,1](相对于图像宽高)。
- 模型输出:全连接层输出10个值(5个关键点的x,y坐标)。
- 损失函数:均方误差(MSE)或Smooth L1 Loss。
人脸生成与编辑
结合生成对抗网络(GAN),如StyleGAN,利用CelebA图像生成高质量人脸或修改属性(如添加/摘除眼镜),需将属性标签作为条件输入生成器,实现可控生成。
注意事项
- 数据伦理:CelebA图像涉及名人隐私,需遵守数据使用协议,不得用于商业或非法用途。
- 属性平衡性:部分属性样本不均衡(如“双下巴”样本较少),训练时可采用过采样或加权损失函数。
- 版本兼容性:不同版本的CelebA标注文件可能存在差异,需确认标注格式的一致性。
相关问答FAQs
Q1: CelebA数据集的40个属性具体包括哪些?如何查看每张图像的属性标签?
A1: CelebA的40个属性涵盖人脸外观特征(如性别、戴眼镜、留胡子)、表情(微笑、惊讶)、配饰(戴帽子、戴项链)等,可通过list_attr_celeba.txt
查看,其中每行第一列为图像文件名(如jpg
),后续40列为对应属性值(1表示有,0表示无),使用以下代码读取某张图像的属性:
attr_df = pd.read_csv('Anno/list_attr_celeba.txt', delim_whitespace=True, header=1) image_attrs = attr_df[attr_df['image_id'] == '000001.jpg'].iloc[0].to_dict() print(image_attrs) # 输出该图像的所有属性
Q2: 如何解决CelebA训练时属性样本不均衡的问题?
A2: 可采用以下方法:
- 过采样/欠采样:对少数属性样本过采样(复制或SMOTE生成),或对多数属性欠采样(随机丢弃部分样本)。
- 损失函数加权:根据类别频率计算权重,在BCE损失中赋予少数类更高权重(如
weight=torch.tensor([pos_weight, 1.0])
)。 - Focal Loss:通过调节难易样本的权重,减少易分样本对损失的贡献,提升模型对少数类的关注。
- 数据增强:对少数类样本应用更强的增强(如随机旋转、颜色抖动),增加样本多样性。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复