- 深度学习
- 计算机视觉
- 媒体生成
【免费下载链接】guided-diffusion
本指南围绕 guided-diffusion 仓库的 evaluations 评估模块 展开,系统讲解如何用 FID、sFID、Precision、Recall 和 Inception Score 五类指标对扩散模型生成结果进行量化评测。你将掌握 .npz 样本批次与参考批次的获取方法、evaluator.py的完整运行流程,以及从源码层面理解每个指标的计算原理,从而在自己的模型对比实验中准确复现论文中的评测方案。
评估指标体系:为什么要同时使用五类指标
生成模型的对比不能依赖单一指标。guided-diffusion 仓库(论文Diffusion Models Beat GANs on Image Synthesis的官方代码)采用五类指标共同刻画生成质量,这些指标全部可以通过对样本批次的批量计算获得:
| 指标 | 全称 | 衡量内容 |
|---|---|---|
| FID | Frechet Inception Distance | 真实分布与生成分布在 Inception 特征空间中的 Wasserstein-2 距离,数值越低表示分布越接近 |
| sFID | spatial FID | 使用 Inception 网络空间层特征(而非池化特征)计算的 FID,更关注局部结构 |
| Precision | 精确率 | 生成样本落入真实数据流形(manifold)的比例,衡量生成样本的"真实性" |
| Recall | 召回率 | 真实样本被生成分布覆盖的比例,衡量生成的"多样性/覆盖率" |
| Inception Score | IS | 基于类别预测分布的熵差评估图像清晰度与多样性,数值越高越好 |
FID 与 IS 侧重全局分布统计,Precision/Recall 则从流形覆盖角度互补地反映真实性与多样性之间的权衡——这正是扩散模型对比 GAN 时最常被讨论的两个维度。仓库 README.md 中的实验结果表即同时报告 FID、Precision 和 Recall 三项,例如 ImageNet 256×256 上引导扩散模型(ADM-G + ADM-U)取得 FID 3.94、Precision 0.83、Recall 0.53。
所有指标均以.npz(numpy 压缩格式)文件中的样本批次为输入,因此评估流程高度标准化:先准备样本批次与参考批次,再运行评估脚本。
.npz 批次文件规范:参考批次与样本批次
评估所需的批次文件分为两类,规范如下:
- 参考数据集批次(reference batch):包含整个数据集的预计算统计量(
mu、sigma),同时内含10,000 张图像,用于计算 Precision 和 Recall。 - 其他所有批次(样本批次):包含50,000 张图像,可用于计算统计量和 Precision/Recall。
从源码 evaluator.py 的read_statistics方法(第 164-172 行)可以看出批次的内部结构约定:如果 npz 中已存在mu、sigma键,则直接读取预计算统计量(同时读取mu_s、sigma_s作为空间特征统计量),否则会现场从图像计算统计量:
obj = np.load(npz_path) if "mu" in list(obj.keys()): return FIDStatistics(obj["mu"], obj["sigma"]), FIDStatistics( obj["mu_s"], obj["sigma_s"] ) return tuple(self.compute_statistics(x) for x in activations)这正是参考批次与普通样本批次的差异所在:参考批次省去了重复计算整个数据集统计量的开销,而样本批次(50,000 张)则足以给出稳定可靠的统计估计。
预计算批次下载清单(LSUN 与 ImageNet)
仓库在 OpenAI 公共存储(Azure Blob Storage)上提供了论文中使用的全部参考批次、本仓库扩散模型样本批次以及对比基线(DDPM、IDDPM、BigGAN、StyleGAN 等)的样本批次。以下按数据集完整列出(其中VIRTUAL_*为参考批次,其余为样本批次):
LSUN(256×256)
LSUN bedroom
- 参考批次:
VIRTUAL_lsun_bedroom256.npz - ADM(dropout):
admnet_dropout_lsun_bedroom.npz - DDPM:
ddpm_lsun_bedroom.npz - IDDPM:
iddpm_lsun_bedroom.npz - StyleGAN:
stylegan_lsun_bedroom.npz
LSUN cat
- 参考批次:
VIRTUAL_lsun_cat256.npz - ADM(dropout):
admnet_dropout_lsun_cat.npz - StyleGAN2:
stylegan2_lsun_cat.npz
LSUN horse
- 参考批次:
VIRTUAL_lsun_horse256.npz - ADM(dropout):
admnet_dropout_lsun_horse.npz - ADM:
admnet_lsun_horse.npz
ImageNet
ImageNet 64×64
- 参考批次:
VIRTUAL_imagenet64_labeled.npz - ADM:
admnet_imagenet64.npz - IDDPM:
iddpm_imagenet64.npz - BigGAN:
biggan_deep_imagenet64.npz
ImageNet 128×128
- 参考批次:
VIRTUAL_imagenet128_labeled.npz - ADM:
admnet_imagenet128.npz - ADM-G:
admnet_guided_imagenet128.npz - ADM-G(25 步采样):
admnet_guided_25step_imagenet128.npz - BigGAN-deep(trunc=1.0):
biggan_deep_trunc1_imagenet128.npz
ImageNet 256×256
- 参考批次:
VIRTUAL_imagenet256_labeled.npz - ADM:
admnet_imagenet256.npz - ADM-G:
admnet_guided_imagenet256.npz - ADM-G(25 步采样):
admnet_guided_25step_imagenet256.npz - ADM-G + ADM-U:
admnet_guided_upsampled_imagenet256.npz - ADM-U:
admnet_upsampled_imagenet256.npz - BigGAN-deep(trunc=1.0):
biggan_deep_trunc1_imagenet256.npz
ImageNet 512×512
- 参考批次:
VIRTUAL_imagenet512.npz - ADM:
admnet_imagenet512.npz - ADM-G:
admnet_guided_imagenet512.npz - ADM-G(25 步采样):
admnet_guided_25step_imagenet512.npz - ADM-G + ADM-U:
admnet_guided_upsampled_imagenet512.npz - ADM-U:
admnet_upsampled_imagenet512.npz - BigGAN-deep(trunc=1.0):
biggan_deep_trunc1_imagenet512.npz
说明:上述批次文件均托管于
openaipublic.blob.core.windows.net/diffusion/jul-2021/ref_batches/下的对应目录(lsun/、imagenet/),命名规则与上表一致。请根据目标数据集与对比模型自行定位下载。
这些文件可直接用于复现论文中的指标结果,例如下载 ImageNet 256×256 的参考批次与admnet_guided_upsampled_imagenet256.npz样本批次,即可得到下文示例输出中的数值。
运行评估脚本:evaluator.py 实战
环境依赖
脚本 evaluator.py 的运行依赖记录在 evaluations/requirements.txt 中:
tensorflow-gpu>=2.0 scipy requests tqdm需要注意两点:
- TensorFlow 版本:脚本基于
tensorflow.compat.v1编写(源码第 16 行import tensorflow.compat.v1 as tf),因此即使安装了 TF 2.x 也能以兼容模式运行;tensorflow-gpu>=2.0意味着需要 GPU 版 TensorFlow 以获得 Inception 特征提取加速。 - InceptionV3 模型自动下载:脚本首次运行时会在当前工作目录自动下载 InceptionV3 模型文件
classify_image_graph_def.pb(约100MB,源码第 20-21 行定义了下载 URL 与本地路径,第 573-583 行的_download_inception_model负责带进度条的下载)。若该文件已存在,则直接复用,不会重复下载。
运行命令
准备好样本批次与对应数据集的参考批次后,向脚本传入两个位置参数:参考批次路径与样本批次路径。以 ImageNet 256×256 为例:
python evaluator.py VIRTUAL_imagenet256_labeled.npz admnet_guided_upsampled_imagenet256.npz运行开始时会有大量 TensorFlow 的 verbose 日志(脚本先执行evaluator.warmup()预热,把 TF 的噪音日志提前输出,避免干扰后续进度信息),随后依次打印各阶段进度与最终指标。典型输出如下:
$ python evaluator.py VIRTUAL_imagenet256_labeled.npz admnet_guided_upsampled_imagenet256.npz ... computing reference batch activations... computing/reading reference batch statistics... computing sample batch activations... computing/reading sample batch statistics... Computing evaluations... Inception Score: 215.8370361328125 FID: 3.9425574129223264 sFID: 6.140433703346162 Precision: 0.8265 Recall: 0.5309可以看到输出包含全部五项指标。其中 FID 3.94、Precision 0.83、Recall 0.53 与仓库 README.md 中"使用上采样与引导结合时 ImageNet 256×256 的最佳结果"表格完全对应,说明该示例输出正是论文中最优配置(ADM-G + ADM-U)的复现数值。
源码级解析:evaluator.py 的评估流水线
理解main()的调用链(evaluator.py 第 27-60 行),可以完整把握五个指标的底层计算过程:
warmup() → read_activations(ref) → read_statistics(ref) → read_activations(sample) → read_statistics(sample) → 各项指标计算1. Inception 特征提取
Evaluator 类 在 TensorFlow 会话中构建两个特征图(第 129-133 行):
pool_features:取自 InceptionV3 的pool_3:0节点(FID_POOL_NAME),得到2048 维全局池化特征,用于 FID 与 Inception Score;spatial_features:取自mixed_6/conv:0节点(FID_SPATIAL_NAME),并截取前 7 个通道(第 599 行spatial = spatial[..., :7]),用于sFID(空间特征上的 Frechet 距离)。
compute_activations(第 142-162 行)以batch_size=64逐批喂入图像(默认值见第 122 行构造函数签名),返回(pool_3, spatial)两组特征数组。图像以 NHWC 格式、取值范围[0, 255]的 uint8 数组传入。
2. 统计量计算与 FID/sFID
read_statistics(第 164-172 行):优先读取 npz 内预计算的mu/sigma(参考批次),否则调用compute_statistics现场计算。compute_statistics(第 174-177 行):对激活特征计算均值mu与协方差sigma。frechet_distance(第 72-115 行):实现经典 FID 公式||mu1 - mu2||² + Tr(Σ1 + Σ2 - 2(Σ1Σ2)^(1/2)),使用scipy.linalg.sqrtm计算协方差乘积的矩阵平方根;当乘积接近奇异时(第 97-104 行)会向对角加入eps=1e-6并给出警告;若结果出现微小虚部(数值误差)则取其实部(第 106-111 行)。
sFID与FID共用同一frechet_distance函数,区别仅在于输入的是空间特征的统计量(mu_s、sigma_s)。
3. Inception Score
compute_inception_score(第 179-192 行)在2048 维池化特征上通过 softmax 子图(_create_softmax_graph,第 603-614 行)得到类别概率分布,然后按split_size=5000分组计算 KL 散度的指数均值,实现与 OpenAI improved-GAN 中 Inception Score 相同的定义:
kl = part * (np.log(part) - np.log(np.expand_dims(np.mean(part, 0), 0))) kl = np.mean(np.sum(kl, 1)) scores.append(np.exp(kl))softmax 推理采用独立的softmax_batch_size=512(第 123 行),以控制内存占用。
4. Precision / Recall 与流形估计
compute_prec_recall(第 194-202 行)基于改进的 Precision-and-Recall 指标实现,核心是 ManifoldEstimator 类:
manifold_radii(第 248-281 行):对每个样本计算其到 k 近邻(默认nhood_sizes=(3,))的距离作为超球半径,以此估计数据流形;可选clamp_to_percentile参数剪除半径过大的离群超球。evaluate_pr(第 325-359 行):判断样本是否落入对方流形的超球覆盖范围内——样本落入参考流形记为 Precision 命中,参考样本落入生成流形记为 Recall 命中。- 距离计算由 DistanceBlock 类 在 TensorFlow 图中完成:先尝试float16快速路径计算成对欧氏距离,若出现非有限值则回退到 float32(第 376-384 行);行/列批大小
row_batch_size、col_batch_size默认均为 10,000,用于在内存与性能之间权衡。
5. 内存友好的批次读取
为支撑 50,000 张图像的评估而不过度占用内存,脚本实现了流式 npz 读取:
open_npz_array(第 516-531 行)解析 npz 内的arr_0.npy,根据 numpy 格式版本(1.0/2.0)决定是否走流式路径;StreamingNpzArrayReader(第 467-491 行)按需从 zip 内文件偏移读取指定字节数,read_batches(batch_size)生成批量迭代器;- 若数组为 Fortran 序或含对象类型,则回退到
MemoryNpzArrayReader(第 493-513 行)直接加载内存。
这使得 50,000 张图像只需按 64 张一批逐批提取特征,峰值内存可控。
如何生成用于评估的样本批次
除了直接下载官方批次,你也可以用自己的模型生成样本批次。仓库的三个采样脚本都会将结果保存为.npz文件:
- scripts/image_sample.py:无条件/条件扩散模型采样。循环采样直至满足
num_samples(默认 10,000),对每个 batch 采样后经((sample + 1) * 127.5).clamp(0, 255)反归一化为 uint8,并以 NHWC 顺序保存(第 60-62 行);最后通过np.savez(out_path, arr, label_arr)(类条件)或np.savez(out_path, arr)(无条件)写入samples_{shape}.npz,其中arr_0为图像、arr_1为标签(第 75-87 行)。 - scripts/classifier_sample.py:分类器引导采样,同样保存
arr_0(图像)与arr_1(标签),见第 99-107 行。 - scripts/super_res_sample.py:超分辨率上采样采样,需要传入
--base_samples(低分辨率基础样本 npz,例如64_samples.npz);其load_data_for_worker(第 77-100 行)从 npz 读取arr_0图像(类条件时同时读取arr_1标签),归一化到 [-1, 1] 后作为上采样模型输入。
官方批次中的 50,000 张样本即对应--num_samples 50000的采样配置(README 中 128×128 分类器引导示例即使用--num_samples 50000)。为复现 25 步快速采样结果,可在采样时使用--timestep_respacing ddim25 --use_ddim True。
指标解读与仓库参考结果
在评估自己模型前,可参考仓库 README.md 中论文报告的结果作为数值量级基准:
纯引导扩散模型(ImageNet)
| 数据集 | FID | Precision | Recall |
|---|---|---|---|
| ImageNet 64×64 | 2.07 | 0.74 | 0.63 |
| ImageNet 128×128 | 2.97 | 0.78 | 0.59 |
| ImageNet 256×256 | 4.59 | 0.82 | 0.52 |
| ImageNet 512×512 | 7.72 | 0.87 | 0.42 |
引导 + 上采样组合(高分辨率最佳结果)
| 数据集 | FID | Precision | Recall |
|---|---|---|---|
| ImageNet 256×256 | 3.94 | 0.83 | 0.53 |
| ImageNet 512×512 | 3.85 | 0.84 | 0.53 |
LSUN 单类别(无引导)
| 数据集 | FID | Precision | Recall |
|---|---|---|---|
| LSUN Bedroom | 1.90 | 0.66 | 0.51 |
| LSUN Cat | 5.57 | 0.63 | 0.52 |
| LSUN Horse | 2.57 | 0.71 | 0.55 |
结合 model-card.md 中的说明可以更准确地解读这些数字:所有指标都基于在 ImageNet 上预训练的Inception-V3表征,因此对 ImageNet 类(如动物)更敏感,而对人脸等视觉特征可能不敏感;此外,分类器引导虽然能提升 Precision(真实性),但会降低 Recall(多样性),解读指标时需同时观察两项而非只看 FID。
常见问题与注意事项
- 首次运行耗时:脚本会下载约 100MB 的 InceptionV3 模型到当前工作目录,请确保磁盘空间与网络可用;下载完成后后续运行直接复用。
- TensorFlow 日志冗长:
warmup()会把大量 verbose 日志提前到进度打印之前,避免输出顺序混乱;评估进度由tqdm展示。 - GPU 配置:源码第 33-36 行设置了
allow_soft_placement=True(允许 DecodeJpeg 等算子落到 CPU 执行)与gpu_options.allow_growth=True(按需增长显存),适用于显存有限的环境。 - 批次一致性:参考批次与样本批次必须来自同一数据集与分辨率,否则特征维度或分布不匹配会导致断言失败(
frechet_distance中对 mu/sigma 形状有显式断言,见第 86-91 行)。 - Precision/Recall 计算量:流形估计涉及 50,000 张图像的成对距离计算,虽然采用分块与 float16 加速,仍需要一定的内存与时间,可依据机器配置调整
row_batch_size/col_batch_size。
至此,你已完整掌握 guided-diffusion 评估模块从批次获取、脚本运行到指标原理的完整链路,可以将其直接复用于你自己的扩散模型质量对比实验中。
- 深度学习
- 计算机视觉
- 媒体生成
【免费下载链接】guided-diffusion
相关推荐
终极指南:如何用evaluator.py快速评估guided-diffusion的FID分数
终极指南:如何用evaluator.py快速评估guided diffusion的FID分数 扩散模型在图像生成领域取得了突破性进展,而 guided diff
深度学习计算机视觉媒体生成如何评估生成模型质量:FID与Inception Score完全指南
如何评估生成模型质量:FID与Inception Score完全指南 在深度学习领域,生成模型如GAN、扩散模型等正变得越来越流行,但如何准确评估这些模型生成内
人工智能深度学习大模型NLP计算机视觉强化学习LoRAProgressive Growing of GANs质量评估:Inception Score、FID等指标详解
Progressive Growing of GANs质量评估:Inception Score、FID等指标详解 Progressive Growing of
人工智能深度学习计算机视觉媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考