CelebA数据集下载与预处理完整指南:从零开始的人脸识别数据准备

1次阅读
没有评论

共计 2010 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景介绍

CelebA(CelebFaces Attributes Dataset)是香港中文大学发布的大规模人脸数据集,包含 202,599 张名人图像,每张图像标注了 40 种二分类属性(如是否戴眼镜、是否微笑等)。这个数据集因其规模和质量,成为人脸识别、生成对抗网络(GAN)等任务的基准数据集。

CelebA 数据集下载与预处理完整指南:从零开始的人脸识别数据准备

下载避坑指南

  1. 官方与镜像源对比
  2. 官方源(http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html)位于香港,国内下载速度较慢
  3. 推荐使用清华镜像源(https://mirrors.tuna.tsinghua.edu.cn/),速度提升显著

  4. 断点续传下载
    使用 wget 进行断点续传:

    wget -c http://mirror.url/CelebA.zip -O CelebA.zip

  5. -c参数表示继续未完成的下载
  6. -O指定保存文件名

  7. 文件校验
    下载完毕后务必验证文件完整性:

    md5sum CelebA.zip
    # 或
    sha256sum CelebA.zip

    对比官方提供的哈希值,确保文件未损坏。

预处理实战

  1. 关键点对齐裁剪
    使用 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

  2. 属性标注解析

    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)

  3. 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

性能优化

  1. 多进程数据加载
    在 PyTorch 中设置 num_workers 参数:

    dataloader = DataLoader(dataset, batch_size=32, 
                           shuffle=True, num_workers=4)

  2. 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())

常见问题排查

  1. 编码问题
    如果遇到属性文件读取错误,指定编码格式:

    pd.read_csv('list_attr_celeba.txt', encoding='utf-8', ...)

  2. 内存不足处理
    使用生成器分批处理数据:

    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 的性别不平衡问题?可以考虑:

  1. 对少数类样本进行过采样
  2. 应用特定于性别的数据增强(如胡须添加 / 去除)
  3. 在损失函数中添加类别权重

完整 Colab 示例见:https://colab.research.google.com/drive/1abc123(示例链接)

正文完
 0
评论(没有评论)