FID图像质量评估指标

FID(Fréchet Inception Distance)

FID是从原始图像的计算机视觉特征的统计方面,来衡量两组图像的相似度,是计算真实图像和生成图像的特征向量之间距离的一种度量。
这种视觉特征是使用 Inception v3 图像分类模型提取特征并计算得到的。FID 在最佳情况下的得分为 0.0,表示两组图像相同。分数越低代表两组图像越相似,或者说二者的统计量越相似

FID 分数常被用于评估由生成对抗网络(GAN)生成的图像的质量,较低的分数与较高质量的图像有很高的相关性。

在 python 环境下实现 Frechet Inception 距离(FID)
首先,我们可以尝试用这个函数来计算一些人造特征向量的 Inception 分数。
act1 = random(20480)
act1 = act1.reshape((10, 2048))
act2 = random(20480)
act2 = act2.reshape((10, 2048))
然后,通过FID函数对人造向量进行对应匹配分数的计算。
完整示例
 

import numpy
from numpy import cov
from numpy import trace
from numpy import iscomplexobj
from numpy.random import random
from scipy.linalg import sqrtm

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

act1 = random(20480)
act1 = act1.reshape((10, 2048))
act2 = random(20480)
act2 = act2.reshape((10, 2048))
fid = calculate_fid(act1, act1)
print( 'FID (same): %.3f'% fid)
fid = calculate_fid(act1, act2)
print( 'FID (different): %.3f'% fid)

「mu_1」和「mu_2」指的是真实图像和生成图像的特征均值(例如,2,048 维的元素向量,其中每个元素都是在图像中观察到的平均特征)。

C_1 和 C_2 是真实图像的和生成图像的特征向量的协方差矩阵,通常被称为 sigma。

|| mu_1-mu_2 ||^2 代表两个平均向量差的平方和。Tr 指的是被称为「迹」的线性代数运算(即方阵主对角线上的元素之和)。

sqrt 是方阵的平方根,由两个协方差矩阵之间的乘积给出。

运行这段代码示例,首先会显示出激活函数值「act1」和它自己之间的 FID 分数,正如我们所预想的那样,该值为 0.0
(注:该分数的符号可以忽略)
同样,正如我们所预料的,两组随机激活函数值之间的距离是一个很大的数字,在本例中为 323.325。

 

你可能感兴趣的:(小白学视觉,深度学习)