共计 2010 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
CelebA(CelebFaces Attributes Dataset)是香港中文大学发布的大规模人脸数据集,包含 202,599 张名人图像,每张图像标注了 40 种二分类属性(如是否戴眼镜、是否微笑等)。这个数据集因其规模和质量,成为人脸识别、生成对抗网络(GAN)等任务的基准数据集。

下载避坑指南
- 官方与镜像源对比
- 官方源(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)位于香港,国内下载速度较慢
-
推荐使用清华镜像源(https://mirrors.tuna.tsinghua.edu.cn/),速度提升显著
-
断点续传下载
使用 wget 进行断点续传:wget -c http://mirror.url/CelebA.zip -O CelebA.zip -c参数表示继续未完成的下载-
-O指定保存文件名 -
文件校验
下载完毕后务必验证文件完整性:md5sum CelebA.zip # 或 sha256sum CelebA.zip对比官方提供的哈希值,确保文件未损坏。
预处理实战
-
关键点对齐裁剪
使用 OpenCV 进行人脸对齐:import cv2 def align_face(img_path, landmarks): """ img_path: 图像路径 landmarks: 5 点关键坐标 (x,y) 列表 """ img = cv2.imread(img_path) # 计算眼睛中心点 eye_center = ((landmarks[0][0]+landmarks[1][0])/2, (landmarks[0][1]+landmarks[1][1])/2) # 仿射变换对齐代码... return aligned_face -
属性标注解析
import pandas as pd # 读取属性标注文件 attr_df = pd.read_csv('list_attr_celeba.txt', delim_whitespace=True, header=1) # 将 - 1 转换为 0 attr_df = attr_df.replace(-1, 0) -
PyTorch Dataset 实现
from torch.utils.data import Dataset class CelebADataset(Dataset): def __init__(self, img_dir, attr_df, transform=None): self.img_dir = img_dir self.attr_df = attr_df self.transform = transform def __len__(self): return len(self.attr_df) def __getitem__(self, idx): img_name = self.attr_df.index[idx] img_path = os.path.join(self.img_dir, img_name) image = Image.open(img_path) if self.transform: image = self.transform(image) return image
性能优化
-
多进程数据加载
在 PyTorch 中设置num_workers参数:dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4) -
LMDB 格式转换
对于超大规模数据,建议转换为 LMDB 格式:import lmdb # 创建 LMDB 环境 env = lmdb.open('celeba_lmdb', map_size=1e12) with env.begin(write=True) as txn: for idx in range(len(dataset)): img, label = dataset[idx] # 以二进制形式存储 txn.put(str(idx).encode(), img.tobytes())
常见问题排查
-
编码问题
如果遇到属性文件读取错误,指定编码格式:pd.read_csv('list_attr_celeba.txt', encoding='utf-8', ...) -
内存不足处理
使用生成器分批处理数据:def batch_processor(data, batch_size=1000): for i in range(0, len(data), batch_size): yield data[i:i+batch_size]
PIL vs OpenCV 性能对比
- OpenCV(cv2)读取速度比 PIL 快约 3 倍
- OpenCV 默认 BGR 通道顺序,PIL 为 RGB
- 对于大量小图像,建议使用 OpenCV
思考题
如何设计数据增强策略应对 CelebA 的性别不平衡问题?可以考虑:
- 对少数类样本进行过采样
- 应用特定于性别的数据增强(如胡须添加 / 去除)
- 在损失函数中添加类别权重
完整 Colab 示例见:https://colab.research.google.com/drive/1abc123(示例链接)
正文完
发表至: 未分类
近两天内
