大家好,欢迎来到IT知识分享网。
什么是FID
下面全部内容是对外网讲解的翻译:外网FID讲解
1.什么是Frechet Inception Distance(FID)?
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))
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/152442.html