什么是FID?怎么实现FID?

下面全部内容是对外网讲解的翻译:外网FID讲解

1.什么是Frechet Inception Distance(FID)?

Frechet Inception Distance(简称FID)是一种用于评估生成图像质量的度量标准,专门用于评估生成对抗网络的性能。
FID分数是由Martin Heusel等人在他们2017年的论文《GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium》(https://arxiv.org/abs/1706.08500)中提出和使用的。

1.1是对Inception Score(IS)的改进

该分数被提出作为对现有的Inception Score(IS)的改进。

论文原文当中描述到:For the evaluation of the performance of GANs at image generation, we introduce the “Frechet Inception Distance” (FID) which captures the similarity of generated images to real ones better than the Inception Score.

1.2以什么思路做改进—增强生成数据和真实数据的对比

Inception Score(IS)根据最佳表现的图像分类模型Inception v3将一组合成图像分类为1,000个已知对象之一的准确程度来估计合成图像的质量。该分数综合了每个合成图像条件类别预测的置信度(质量)和预测类别边际概率的积分(多样性)。

Inception Score仅仅是对图像生成质量的比较,并不能捕捉合成图像与真实图像之间的比较。开发FID分数的目标是根据合成图像集合的统计数据与目标领域中真实图像集合的统计数据进行比较,评估合成图像。

论文原文当中描述到:Drawback of the Inception Score is that the statistics of real world samples are not used and compared to the statistics of synthetic samples.

1.3具体怎么实现—原始数据提取特征再取统计量再对比

像Inception分数一样,FID分数也使用了Inception v3模型。具体来说,模型的编码层(在输出图像分类之前的最后一个池化层)用于捕捉输入图像的计算机视觉特征。这些激活值是通过计算一组真实图像和生成图像的均值和协方差来总结为一个多元高斯分布。
然后,对于这些激活值在真实图像和生成图像集合中的统计数据进行计算。
然后使用Frechet距离(也称为Wasserstein-2距离)计算这两个分布之间的距离。

1.4效果怎么样

使用Inception v3模型的激活值来总结每个图像,使得该分数被称为“Frechet Inception Distance”。

较低的FID表示更高质量的图像;相反,较高的分数表示较低质量的图像,而且这种关系可能是线性的。

该分数的作者表明,当应用系统性的失真,如添加随机噪声和模糊效果时,较低的FID分数与更高质量的图像相关。
在这里插入图片描述

2.怎么计算FID

2.1特征提取

FID(Fréchet Inception Distance)分数的计算是通过首先加载一个预训练的Inception v3模型来完成的。

该模型的输出层被移除,输出来自最后一个池化层的激活值,即全局空间池化层的激活值。这个输出层有2,048个激活值,因此,每个图像被预测为2,048个激活特征。这被称为图像的编码向量或特征向量。然后,为问题领域中的一组真实图像预测一个2,048维的特征向量,以提供真实图像的表示参考。然后可以计算合成图像的特征向量。

结果是分别使用真实图像和生成图像获得的两组2,048维特征向量。

2.2 距离计算

从论文当中我们可以找到FID的计算公式如下:
在这里插入图片描述

“〖mu〗_1”和“〖mu〗_2”表示真实图像和生成图像的特征均值,例如,它们是2,048个元素的向量,其中每个元素是图像中观察到的特征的均值。
C_1和C_2是实际特征向量和生成的特征向量的协方差矩阵,通常称为sigma
"||mu_1 - mu_2||^2"是指两个均值向量之间的平方差的总和。"Tr"是迹线性代数运算的简写,例如,它表示方阵主对角线上元素的总和。
"sqrt"是指给定两个协方差矩阵的乘积的平方根矩阵。
矩阵的平方根通常也写作M^(1/2),即矩阵的一半次方,其效果相同。由于该操作使用数值方法求解,因此可能会失败,这取决于矩阵中的值。通常情况下,结果矩阵中的某些元素可能是虚数,这通常可以被检测到并移除。

如何用numpy实现FID

在Python中使用NumPy数组实现FID分数的计算非常简单。

首先,让我们定义一个函数,它将接受真实图像和生成图像的激活集合,并返回FID分数。

下面列出的calculate_fid()函数实现了该过程。

在这里,我们几乎直接实现了FID计算。值得注意的是,TensorFlow中的官方实现按照略有不同的顺序实现了计算的各个元素,可能是为了提高效率,并引入了围绕矩阵平方根的额外检查,以处理可能的数值不稳定性。

如果您在自己的数据集上计算FID时遇到问题的话,我建议您查看官方实现,并在下面的实现中进行扩展,以添加这些检查。

# calculate frechet inception distance
def calculate_fid(act1, act2):
 # calculate mean and covariance statistics
 mu1, sigma1 = act1.mean(axis=0), cov(act1, rowvar=False)
 mu2, sigma2 = act2.mean(axis=0), cov(act2, rowvar=False)
 # calculate sum squared difference between means
 ssdiff = numpy.sum((mu1 - mu2)**2.0)
 # calculate sqrt of product between cov
 covmean = sqrtm(sigma1.dot(sigma2))
 # check and correct imaginary numbers from sqrt
 if iscomplexobj(covmean):
 covmean = covmean.real
 # calculate score
 fid = ssdiff + trace(sigma1 + sigma2 - 2.0 * covmean)
 return fid

可以用这些代码测试:

# define two collections of activations
act1 = random(10*2048)
act1 = act1.reshape((10,2048))
act2 = random(10*2048)
act2 = act2.reshape((10,2048))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值