Fréchet Inception Distance(FID)

摘自:
https://www.cnblogs.com/gaona666/p/12376796.html

Fréchet Inception Distance(FID)
计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集 ------ ImageNet,在 Inception V3 的“世界观”下,凡是不像 ImageNet 的数据,都是不真实的,都不能保证输出一个 sharp 的 predition distribution。因此,要想更好地评价生成网络,就要使用更加有效的方法计算真实分布与生成样本之间的距离。

基本原理
FID距离计算真实样本,生成样本在特征空间之间的距离。首先利用Inception网络来提取特征,然后使用高斯模型对特征空间进行建模,再去求解两个特征之间的距离,较低的FID意味着较高图片的质量和多样性。具体公式如下:

具体推导公式 https://www.sciencedirect.com/science/article/pii/0047259X8290077X

相比较IS来说,FID对噪声有更好的鲁棒性。因为FID只是把 Inception V3 作为特征提取器,并不依赖它判断图片的具体类别,因此不必担心 Inception V3 的训练数据和生成模型的训练数据不同。同时,由于直接衡量生成数据和真实数据的分布之间的距离,也不必担心每个类别内部只产生一模一样的图片这种形式的 mode collapse。

局限性
虽然相比IS,FID的方法有了很大改进,但是对于ImageNet这种大规模数据集上的过拟合问题,仍然没有解决。除此之外,FID基于特征提取,也就是依赖于某些特征的出现或者不出现,因此无法描述这些特征的空间关系。例如用GAN去生成人脸,如果嘴巴长在眼睛上面,FID可能也会认为它是一张较好地生成结果。

总结
同样是借助于Inception V3的结构提取特征,所以GAN的论文中经常使用FID作为IS的补充,特别是在多样性和mode collapse问题上,FID有更好地评价表现,但也有和IS同样的缺陷,比如不适合在内部差异较大的数据集上使用,无法区分过拟合等。

原文链接:https://blog.csdn.net/qq_35586657/article/details/98478508 GAN的几种评价指标

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值