保姆级教程:用Python2.7从零搭建CelebA-HQ数据集(附百度网盘资源)
从零构建CelebA-HQ:一份面向现代开发者的实践指南
如果你正在涉足人脸生成、图像超分辨率或风格迁移等领域,那么CelebA-HQ数据集很可能已经出现在你的研究雷达上。这个由高分辨率名人脸组成的精选集合,因其图像质量高、标注清晰,已成为计算机视觉领域一个重要的基准数据集。然而,官方提供的往往只是经过处理的最终图像,或是分散的原始数据与生成脚本。对于想要深入理解数据生成流程、进行定制化处理,或是需要在特定环境下复现的研究者来说,从原始素材开始亲手搭建整个数据集,不仅是一次宝贵的学习经历,更能让你在后续工作中拥有完全的掌控力。
今天这份指南,将带你超越简单的“下载-运行”模式。我们将深入探讨如何在一个现代、可维护的开发环境中,处理那些可能基于旧版本Python(如2.7)的遗留代码,并安全、高效地生成从64x64到1024x1024的全分辨率CelebA-HQ图像。我们会涵盖环境隔离、依赖管理、代码适配、批量处理优化以及结果验证等全流程,目标是让你不仅“做出来”,更“理解透彻”。
1. 环境准备与项目初始化
在开始任何数据处理项目之前,建立一个干净、独立的环境是避免“依赖地狱”的第一步。虽然原始脚本可能指定了Python 2.7,但我们可以利用现代工具来优雅地管理它,而不是全局安装一个已结束支持的解释器。
1.1 使用Conda创建隔离环境
Conda是一个强大的包与环境管理器,特别适合处理科学计算中复杂的依赖关系。我们将创建一个专用于此项目的环境。
# 创建一个新环境,命名为‘celeba_hq_build’,并指定Python 2.7
conda create -n celeba_hq_build python=2.7 -y
# 激活该环境
conda activate celeba_hq_build
注意:确保你的Conda已正确安装并初始化。在Windows上,你可能需要使用Anaconda Prompt;在macOS/Linux上,使用终端即可。
创建成功后,你的命令行提示符前通常会显示环境名 (celeba_hq_build),这表明后续的所有操作都将局限在这个沙箱内,不会影响系统或其他项目。
1.2 获取原始数据与代码
CelebA-HQ的生成依赖于两部分核心数据:
- 原始CelebA图像 (
img_celeba.7z):包含超过20万张对齐的名人脸图片。 - 高分辨率增量文件 (
celeba-hq-deltas):这是一个.zip或.7z压缩包,内含将低分辨率图像升级到高分辨率所需的变换信息。
此外,你需要生成脚本。通常这是一个或多个Python文件(如 h5tool.py)。请从可靠的来源获取这些文件。
项目目录结构规划: 一个清晰的目录结构能极大提升工作效率。建议按如下方式组织:
CelebA-HQ-Builder/
├── data/
│ ├── raw/ # 存放原始下载的压缩包
│ │ ├── img_celeba.7z
│ │ └── celeba-hq-deltas.zip
│ ├── extracted/ # 存放解压后的原始数据
│ │ ├── img_celeba/ # 解压后的CelebA图片文件夹
│ │ │ └── list_landmarks_celeba.txt # 人脸关键点标注文件
│ │ └── deltas/ # 解压后的增量文件(暂不解压,见下文)
│ └── processed/ # 最终生成的高分辨率图像输出目录
├── scripts/ # 存放生成脚本
│ └── h5tool.py
└── README.md # 项目说明
使用 mkdir -p 命令(Linux/macOS)或在文件管理器中手动创建这些文件夹。
1.3 安装必要的依赖包
激活环境后,安装生成脚本所需的Python库。根据常见脚本的需求,通常包括:
# 确保pip已更新(在conda环境中)
python -m pip install --upgrade pip
# 安装核心科学计算与图像处理库
pip install numpy scipy pillow h5py
# 有时可能需要加密相关的库,但并非总是必需
# pip install cryptography
你可以通过创建一个 requirements.txt 文件来记录依赖,方便未来复现:
numpy==1.16.6 # Python 2.7支持的最后一个主要版本
scipy==1.2.3
Pillow==6.2.2 # PIL的友好分支
h5py==2.10.0
然后使用 pip install -r requirements.txt 进行安装。
2. 数据处理与脚本深度解析
在运行生成脚本前,理解其工作原理和必要的数据准备至关重要。盲目运行往往会导致路径错误或意料之外的结果。
2.1 数据解压与放置
按照我们的目录结构,进行如下操作:
- 将下载的
img_celeba.7z解压到data/extracted/img_celeba/目录下。你会看到一个包含大量jpg图片的子文件夹(通常也叫img_celeba)。 - 将
list_landmarks_celeba.txt文件复制到data/extracted/img_celeba/目录下,与图片文件夹同级。这个文件包含了每张图片的人脸关键点坐标,是生成对齐高分辨率图的关键。 - 至关重要的一步:对于
celeba-hq-deltas.zip,不要现在解压。许多生成脚本设计为直接读取压缩包内的文件,在内存中动态解压以节省磁盘空间和提高效率。只需将整个zip文件放在data/raw/或data/extracted/deltas/中,并记下它的完整路径。
2.2 剖析与修改生成脚本
拿到 h5tool.py 或类似的脚本后,不要直接运行。用文本编辑器打开它,我们需要重点关注几个部分:
- 路径配置:这是最常见的出错点。脚本中必然有变量指向原始图片目录、增量文件路径和输出目录。
- 文件读取逻辑:检查它是如何读取
list_landmarks_celeba.txt和celeba-hq-deltas.zip的。 - 输出目录创建:脚本是否会自动创建如
celeba-64,celeba-128等输出文件夹?
典型修改示例: 假设在脚本开头或某个配置函数中找到了如下代码段:
# 原始脚本中可能类似这样
celeba_dir = '/home/user/CelebA/img_celeba'
deltas_path = '/home/user/CelebA/celeba-hq-deltas.zip'
output_root = '/home/user/CelebA/CelebA-HQ'
你需要将其修改为符合你实际目录结构的路径:
# 修改为你的绝对路径或相对路径
import os
project_root = os.path.dirname(os.path.abspath(__file__)) # 获取脚本所在目录
celeba_dir = os.path.join(project_root, '..', 'data', 'extracted', 'img_celeba')
deltas_path = os.path.join(project_root, '..', 'data', 'raw', 'celeba-hq-deltas.zip')
output_root = os.path.join(project_root, '..', 'data', 'processed')
# 然后确保输出子目录存在
for res in [64, 128, 256, 512, 1024]:
dir_path = os.path.join(output_root, f'celeba-{res}')
if not os.path.exists(dir_path):
os.makedirs(dir_path)
print(f"Created directory: {dir_path}")
提示:使用
os.path.join来构建路径可以确保代码在不同操作系统(Windows/macOS/Linux)上都能正常工作。
关于标注文件的读取:
有时脚本中读取标注文件的路径可能多了一层 Anno 目录,而你的文件并不在那里。检查类似 open(os.path.join(celeba_dir, 'Anno', 'list_landmarks_celeba.txt')) 的语句,如果报错,很可能需要去掉 'Anno',如 open(os.path.join(celeba_dir, 'list_landmarks_celeba.txt'))。
3. 执行生成与监控优化
当所有路径都配置正确后,就可以开始生成这个庞大的数据集了。这个过程非常耗时,因此需要一些技巧来管理和监控。
3.1 启动生成进程
在终端中,首先导航到你的脚本所在目录,然后运行命令。命令格式通常如下:
cd /path/to/your/CelebA-HQ-Builder/scripts
python h5tool.py create_celeba_hq celeba-hq-1024x1024.h5 /path/to/img_celeba /path/to/celeba-hq-deltas.zip
create_celeba_hq: 通常是脚本中定义的子命令或函数名。celeba-hq-1024x1024.h5: 可能会生成一个临时的HDF5格式文件,用于中间存储,最终输出仍是图片。- 最后两个参数分别是原始图片目录和增量文件压缩包的路径。
关键参数解析: 有些脚本支持更多参数来控制生成过程,例如:
--num_threads或-j: 指定使用的CPU线程数,可以加快处理速度。--start_idx/--end_idx: 仅生成指定索引范围内的图像,用于调试或分批次处理。--output_format: 指定输出图片格式(如PNG、JPEG)。
在运行前,查看脚本的帮助信息 python h5tool.py --help 或阅读源码开头部分,以了解所有可用选项。
3.2 处理长时间运行任务
生成3万张1024x1024的高质量图像可能需要数小时甚至更久。这里有一些建议:
-
使用后台运行与日志:你可以让进程在后台运行,并将输出重定向到日志文件,这样即使关闭终端也不会中断。
nohup python h5tool.py create_celeba_hq ... > generation.log 2>&1 &nohup使命令忽略挂断信号。> generation.log将标准输出重定向到日志文件。2>&1将标准错误也重定向到标准输出(即同一个日志文件)。&在后台运行。 之后可以使用tail -f generation.log来实时查看日志尾部。
-
监控进度与资源:
- 脚本本身通常会打印当前处理的图片序号。
- 使用系统监控工具,如
htop(Linux/macOS) 或任务管理器(Windows),观察CPU、内存和磁盘I/O的使用情况。高分辨率生成是计算和I/O密集型任务。
-
分批次生成:如果担心意外中断或想先验证部分结果,可以利用脚本的起止索引参数先生成前1000张。
python h5tool.py create_celeba_hq ... --start_idx 0 --end_idx 1000
3.3 验证生成结果
生成完成后,不要急于庆祝,先进行质量检查。
-
数量核对:进入各个分辨率的输出文件夹(如
data/processed/celeba-1024),检查文件数量是否与预期相符(CelebA-HQ应为30000张)。可以使用命令快速统计:ls -1 data/processed/celeba-1024/*.jpg | wc -l # Linux/macOS dir /b data\processed\celeba-1024\*.jpg | find /c /v "" # Windows cmd -
质量抽检:
- 随机打开几张不同分辨率的图片,查看图像是否清晰、对齐正确、有无明显的扭曲或伪影。
- 比较同一张人脸在不同分辨率下的图片,观察细节是否随着分辨率提升而自然增加。
-
数据完整性:如果脚本生成了
.h5中间文件,可以尝试用Python快速读取并检查其结构。import h5py with h5py.File('celeba-hq-1024x1024.h5', 'r') as f: print(f.keys()) # 查看数据集名称 data = f['data'][:] # 读取数据(注意内存大小) print(data.shape, data.dtype)
4. 现代工程化改进与故障排除
对于希望将这个过程集成到更大型项目或追求最佳实践的开发者,可以考虑以下改进方案。
4.1 使用Docker容器化(高级)
为了确保环境百分百可复现,避免在不同机器上配置环境的麻烦,Docker是终极解决方案。你可以创建一个 Dockerfile:
# 使用一个包含conda的轻量级Python 2.7基础镜像
FROM continuumio/miniconda:4.7.12
# 设置工作目录
WORKDIR /workspace
# 复制依赖列表和脚本
COPY requirements.txt .
COPY scripts/ ./scripts/
# 复制数据(注意:数据量大,建议在运行时挂载卷,这里仅复制小文件或通过卷管理)
# COPY data/raw/ ./data/raw/
# 使用conda创建完全相同的环境
RUN conda create -n celeba_env python=2.7 -y && \
echo "conda activate celeba_env" >> ~/.bashrc
ENV PATH /opt/conda/envs/celeba_env/bin:$PATH
# 安装依赖
RUN /bin/bash -c "source activate celeba_env && pip install -r requirements.txt"
# 默认命令(可以设置为运行生成脚本)
CMD ["/bin/bash"]
然后构建镜像并运行容器,将本地数据目录挂载进去:
docker build -t celeba-hq-generator .
docker run -it --rm -v $(pwd)/data:/workspace/data celeba-hq-generator
4.2 常见问题与解决方案
在搭建过程中,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
ImportError: No module named ... | 依赖包未安装或不在当前Python环境。 | 确认已激活正确的conda环境,并用 pip list 检查包是否存在。 |
IOError: [Errno 2] No such file or directory: '...list_landmarks_celeba.txt' | 标注文件路径错误。 | 仔细检查 celeba_dir 变量指向的路径,以及文件是否确实在该路径下。 |
| 生成过程中内存占用极高然后崩溃 | 默认设置可能一次性加载过多数据。 | 检查脚本是否有批处理大小参数可以调整。或者,考虑分批次运行(使用--start_idx/--end_idx)。 |
| 生成的图片全黑或扭曲 | 增量文件(deltas)损坏,或与原始图片不匹配。 | 重新下载增量文件,并确保其与原始CelebA数据版本对应。 |
| 运行速度极慢 | 单线程运行;磁盘I/O瓶颈。 | 尝试使用脚本的多线程参数。确保数据位于SSD硬盘上。 |
4.3 后续集成与应用建议
成功生成数据集后,为了便于在深度学习框架中使用,可以考虑:
- 创建索引文件:生成一个
train.txt、val.txt、test.txt文件列表,按照CelebA官方的划分来组织训练集、验证集和测试集。 - 转换为TFRecord或LMDB:对于TensorFlow或Caffe等框架,将大量小图片文件转换为单个或少数几个数据库文件,可以极大提升训练时的数据读取效率。
- 编写数据加载类:为PyTorch或TensorFlow编写一个
Dataset或DataLoader类,集成数据增强(如随机裁剪、翻转)、归一化等预处理流程。
亲手构建CelebA-HQ数据集的过程,远不止是得到一堆图片文件。它迫使你去理解数据生成的 pipeline,处理遗留代码,管理复杂的依赖和长时间运行的任务。这些技能在面临更复杂、更定制化的研究项目时,会显得尤为宝贵。当你在自己的实验中使用这些亲手生成的数据时,那种对数据脉络的熟悉感,往往能带来更深的洞察和更可靠的实验结果。如果在尝试中遇到了上面未提及的古怪错误,不妨去相关的开源项目Issues页面或学术论坛搜索一下,很可能已经有先驱者为你铺平了道路。
更多推荐


所有评论(0)