☰
guided-diffusion 生成质量评估指南:使用 evaluator.py 计算 FID、sFID、Precision、Recall 与 Inception Score
2026/10/15 16:31:06 网站建设 项目流程
  • 深度学习
  • 计算机视觉
  • 媒体生成

【免费下载链接】guided-diffusion

项目地址:https://gitcode.com/gh_mirrors/gu/guided-diffusion
点击查看免费下载

本指南围绕 guided-diffusion 仓库的 evaluations 评估模块 展开,系统讲解如何用 FID、sFID、Precision、Recall 和 Inception Score 五类指标对扩散模型生成结果进行量化评测。你将掌握 .npz 样本批次与参考批次的获取方法、evaluator.py的完整运行流程,以及从源码层面理解每个指标的计算原理,从而在自己的模型对比实验中准确复现论文中的评测方案。

评估指标体系:为什么要同时使用五类指标

生成模型的对比不能依赖单一指标。guided-diffusion 仓库(论文Diffusion Models Beat GANs on Image Synthesis的官方代码)采用五类指标共同刻画生成质量,这些指标全部可以通过对样本批次的批量计算获得:

指标全称衡量内容
FIDFrechet Inception Distance真实分布与生成分布在 Inception 特征空间中的 Wasserstein-2 距离,数值越低表示分布越接近
sFIDspatial FID使用 Inception 网络空间层特征(而非池化特征)计算的 FID,更关注局部结构
Precision精确率生成样本落入真实数据流形(manifold)的比例,衡量生成样本的"真实性"
Recall召回率真实样本被生成分布覆盖的比例,衡量生成的"多样性/覆盖率"
Inception ScoreIS基于类别预测分布的熵差评估图像清晰度与多样性,数值越高越好

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

需要注意两点:

  1. TensorFlow 版本:脚本基于tensorflow.compat.v1编写(源码第 16 行import tensorflow.compat.v1 as tf),因此即使安装了 TF 2.x 也能以兼容模式运行;tensorflow-gpu>=2.0意味着需要 GPU 版 TensorFlow 以获得 Inception 特征提取加速。
  2. 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 类:

  1. manifold_radii(第 248-281 行):对每个样本计算其到 k 近邻(默认nhood_sizes=(3,))的距离作为超球半径,以此估计数据流形;可选clamp_to_percentile参数剪除半径过大的离群超球。
  2. evaluate_pr(第 325-359 行):判断样本是否落入对方流形的超球覆盖范围内——样本落入参考流形记为 Precision 命中,参考样本落入生成流形记为 Recall 命中。
  3. 距离计算由 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)

数据集FIDPrecisionRecall
ImageNet 64×642.070.740.63
ImageNet 128×1282.970.780.59
ImageNet 256×2564.590.820.52
ImageNet 512×5127.720.870.42

引导 + 上采样组合(高分辨率最佳结果)

数据集FIDPrecisionRecall
ImageNet 256×2563.940.830.53
ImageNet 512×5123.850.840.53

LSUN 单类别(无引导)

数据集FIDPrecisionRecall
LSUN Bedroom1.900.660.51
LSUN Cat5.570.630.52
LSUN Horse2.570.710.55

结合 model-card.md 中的说明可以更准确地解读这些数字:所有指标都基于在 ImageNet 上预训练的Inception-V3表征,因此对 ImageNet 类(如动物)更敏感,而对人脸等视觉特征可能不敏感;此外,分类器引导虽然能提升 Precision(真实性),但会降低 Recall(多样性),解读指标时需同时观察两项而非只看 FID。

常见问题与注意事项

  1. 首次运行耗时:脚本会下载约 100MB 的 InceptionV3 模型到当前工作目录,请确保磁盘空间与网络可用;下载完成后后续运行直接复用。
  2. TensorFlow 日志冗长:warmup()会把大量 verbose 日志提前到进度打印之前,避免输出顺序混乱;评估进度由tqdm展示。
  3. GPU 配置:源码第 33-36 行设置了allow_soft_placement=True(允许 DecodeJpeg 等算子落到 CPU 执行)与gpu_options.allow_growth=True(按需增长显存),适用于显存有限的环境。
  4. 批次一致性:参考批次与样本批次必须来自同一数据集与分辨率,否则特征维度或分布不匹配会导致断言失败(frechet_distance中对 mu/sigma 形状有显式断言,见第 86-91 行)。
  5. Precision/Recall 计算量:流形估计涉及 50,000 张图像的成对距离计算,虽然采用分块与 float16 加速,仍需要一定的内存与时间,可依据机器配置调整row_batch_size/col_batch_size。

至此,你已完整掌握 guided-diffusion 评估模块从批次获取、脚本运行到指标原理的完整链路,可以将其直接复用于你自己的扩散模型质量对比实验中。

  • 深度学习
  • 计算机视觉
  • 媒体生成

【免费下载链接】guided-diffusion

项目地址:https://gitcode.com/gh_mirrors/gu/guided-diffusion
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询