FID图像质量评估指标

FID(Fréchet Inception Distance)是一种衡量图像集相似度的指标,基于Inceptionv3模型的特征向量统计。较低的FID分数表示图像集更相似,常用于评估GAN生成的图像质量。代码示例展示了如何计算FID,同一组图像的FID分数为0,不同图像集的FID分数较高。
摘要由CSDN通过智能技术生成

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。

 

Fréchet Inception Distance (FID) 是用于衡量两个图像数据集之间的差异性的一种常用指标。该指标结合了生成模型的拟合能力以及真实数据集的特征分布情况。下面是使用 Python 实现 FID 的代码: ```python import numpy as np import tensorflow as tf import os from scipy import linalg import pathlib import urllib import warnings import zipfile import functools import time import cv2 # 加载 InceptionV3 模型 def load_model(): model = tf.keras.applications.InceptionV3(include_top=False, weights='imagenet') return model # 从 URL 下载文件 def download(url, target_directory): filename = url.split('/')[-1] filepath = tf.keras.utils.get_file(filename, origin=url, cache_dir=target_directory) return filepath # 解压 ZIP 文件 def extract_zip(zip_path, target_directory): with zipfile.ZipFile(zip_path, 'r') as zip_ref: zip_ref.extractall(target_directory) # 获取图像特征向量 def get_activations(images, model): # 将像素值缩放到 [-1, 1] 的范围内 images = (images - 127.5) / 127.5 # 获取特征向量 activations = model.predict(images) return activations # 计算 FID def calculate_fid(real_images, fake_images, model): # 获取真实图像特征向量 real_activations = get_activations(real_images, model) # 获取生成图像特征向量 fake_activations = get_activations(fake_images, model) # 计算均值和协方差 mu1, sigma1 = np.mean(real_activations, axis=0), np.cov(real_activations, rowvar=False) mu2, sigma2 = np.mean(fake_activations, axis=0), np.cov(fake_activations, rowvar=False) # 计算 FID diff = mu1 - mu2 covmean = linalg.sqrtm(sigma1.dot(sigma2)) if np.iscomplexobj(covmean): covmean = covmean.real fid = diff.dot(diff) + np.trace(sigma1 + sigma2 - 2.0 * covmean) return fid # 加载 InceptionV3 模型 model = load_model() # 下载预训练的 InceptionV3 模型权重 url = 'https://storage.googleapis.com/tensorflow/keras-applications/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5' target_directory = '/tmp' weights_file = download(url, target_directory) # 加载预训练的 InceptionV3 模型权重 model.load_weights(weights_file) # 加载图像数据集 real_images = [] fake_images = [] # 加载真实图像 real_images_dir = '/path/to/real/images' for filename in os.listdir(real_images_dir): image = cv2.imread(os.path.join(real_images_dir, filename)) image = cv2.resize(image, (299, 299)) real_images.append(image) # 加载生成图像 fake_images_dir = '/path/to/fake/images' for filename in os.listdir(fake_images_dir): image = cv2.imread(os.path.join(fake_images_dir, filename)) image = cv2.resize(image, (299, 299)) fake_images.append(image) # 计算 FID fid = calculate_fid(np.array(real_images), np.array(fake_images), model) print('FID:', fid) ``` 需要注意的是,在计算 FID 之前,需要对图像进行预处理,将像素值缩放到 [-1, 1] 的范围内,并将图像缩放到 InceptionV3 模型的输入尺寸(299x299)。另外,由于计算 FID 的过程中需要计算图像的特征向量和协方差矩阵,因此建议使用 GPU 进行计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值