Fréchet Inception Distance (FID)
Fréchet Inception Distance(FID)通过比较生成图像与真实照片的 Inception 特征统计量,为生成图像评分。了解其计算和比较方式。
弗雷歇 Inception 距离(FID)是一种生成图像模型的评分指标,它会比较模型生成图像与真实图像的统计特征。两组图像都会通过预训练的 Inception v3 网络;每组图像的特征都会汇总为一个具有均值和协方差的多元高斯分布,而 FID 就是这两个高斯分布之间的弗雷歇距离。分数越低越好;分数为零表示两组特征的均值和协方差完全相同。约翰内斯·开普勒林茨大学的 Martin Heusel 及其同事于 2017 年在论文《使用双时间尺度更新规则训练的 GAN 会收敛到局部纳什均衡》中提出 FID。它很快取代 Inception Score,成为生成对抗网络(GAN)以及后来扩散模型的标准指标。
FID 的计算方法#
- 生成大量图像,通常为 50,000 张,并收集一组真实图像作为参考,通常使用训练集。
- 将每张图像调整为 299 x 299 像素,然后输入 Inception v3。该网络是一个在 ImageNet上进行图像分类训练的卷积神经网络。保留其最后一个池化层输出的 2,048 维向量,作为图像的嵌入。
- 分别计算真实图像嵌入和生成图像嵌入的均值向量与协方差矩阵。
- 将两者合并:FID =(两个均值之间的平方距离)+ trace(C_real + C_gen - 2 x sqrt(C_real x C_gen)),其中 sqrt 表示矩阵平方根。
第一项会在生成图像与真实图像的平均差异增大时上升,例如出现色偏或内容构成不正确。第二项会在图像多样性异常时上升,例如 GAN 发生模式崩溃,只生成少数几种输出的情况。因此,一个分数就能同时反映保真度和多样性,这也是 FID 成为 Stable Diffusion等文生图系统默认评分指标的原因。
使用 NumPy 对模拟的 64 维特征向量进行相同计算:
import numpy as np
rng = np.random.default_rng(0)
# Simulated 64-D feature vectors for 5,000 real and 5,000 generated images
real = rng.normal(0.0, 1.0, size=(5000, 64))
generated = rng.normal(0.3, 0.8, size=(5000, 64)) # shifted mean, less variety
# Summarize each set as a Gaussian: a mean vector and a covariance matrix
mu_r, mu_g = real.mean(axis=0), generated.mean(axis=0)
cov_r, cov_g = np.cov(real, rowvar=False), np.cov(generated, rowvar=False)
# Trace of the matrix square root of cov_r @ cov_g, via its eigenvalues
tr_covmean = np.sqrt(np.linalg.eigvals(cov_r @ cov_g)).real.sum()
# FID = squared distance between means + covariance mismatch
fid = ((mu_r - mu_g) ** 2).sum() + np.trace(cov_r) + np.trace(cov_g) - 2 * tr_covmean
print(f"FID: {fid:.2f}")脚本打印出的 FID 为 8.78。均值偏移贡献约 5.8,分布范围较窄贡献约 2.6,剩下的约 0.5 来自有限样本对统计数据的估计,这总会推高 FID。在实际评估中,TorchMetrics FID等库会使用随该指标发布的原始 TensorFlow Inception 权重来计算特征。Torchvision 的 ImageNet 训练版 Inception v3 使用不同的权重,因此其得分无法与已发表的结果进行比较。
解读与比较 FID 分数#
只有在完全相同的条件下,FID 值才可以比较:使用相同的参考集、图像分辨率、样本数量和预处理方法。使用不同的库调整图像大小或将图像保存为 JPEG,都可能让分数偏移几个点;这正是 Clean-FID实现诞生的原因。小样本会抬高分数,因此原作者建议至少使用 10,000 张图像;基于 5,000 个样本计算出的分数不能与基于 50,000 个样本计算出的分数比较。
举例来说,StyleGAN2 在 FFHQ 数据集的 1024 x 1024 人脸图像上达到 2.84 的 FID;在 30,000 条 MS-COCO 图像描述上进行零样本文生图时,Google Imagen 的分数为 7.27,而 DALL-E 2 为 10.39。
其他生成图像指标#
- Inception Score(IS):仅根据生成图像评分,衡量 Inception 对图像分类时的置信度和多样性。它完全不查看真实数据,因此无法发现生成清晰图像但图像类别不正确的模型。
- 核 Inception 距离(KID):使用无偏核估计器比较相同的 Inception 特征,因此在样本量较小时更可靠。
- CLIP 分数:衡量图像与文本提示的匹配程度,而 FID 不会反映这一点,因此文生图模型通常会同时报告这两项指标。
- 生成模型的精确率和召回率:将 FID 的单一分数拆分为保真度(生成图像中看起来真实的比例)和覆盖度(模型重现的真实数据多样性比例)。
- FD-DINOv2:使用 DINOv2 特征计算相同的弗雷歇距离。DINOv2 是一个自监督视觉 Transformer。George Stein 及其同事于 2023 年提出了该指标,此前一项大规模人类研究发现,FID 无法反映人们对扩散模型图像逼真度的评价。
视频模型也采用相同思路,使用弗雷歇视频距离;VBench等评测套件则将视频质量拆分为不同维度,而不是只用单一距离衡量。
合成训练数据的 FID#
FID 也可用于在训练检测器前筛选合成数据。针对自动驾驶汽车视觉中的夜间驾驶,或缺陷检测中的特定产品缺陷等罕见场景,将生成图像与部署摄像头拍摄的真实照片进行评分比较,可以在投入训练时间前发现领域差距。最后还要检查下游准确率:使用和不使用合成图像分别训练 Ultralytics YOLO26,然后在验证模式下,使用相同的真实留出图像比较平均精度均值(mAP)。










