生成领域指标
图像生成领域
Inception Score (IS)
实现
# 示例code:
fidelity --gpu $GPU_NUM --isc --input1 $IMG_PATH原理
IS主要通过两个标准衡量生成式模型的性能:
- 单一样本类别从属度,也即生成结果是否符合类别分布:$p(y|x)$
- 所有生成样本的多样性:$p(y)$
其中$p(y|x)$是从预训练Inception-V3网络得到的分类评分,因为预训练模型类别有1k类,所以$p(y|x)$与$p(y)$都是1k维的向量。为了达到上述两点:
- $p(y|x)$生成图像评分的某一维度尽量接近于1,而其他维度接近0。
- 多样性则应该使得$p(y)$应该是一个均匀分布的向量。
所以综上,我们需要使得$p(y|x)$的熵尽量的小,而$p(y)$的熵尽量的大。
熵计算公式:$H(x) = -\sum\limits{p(x)}logp(x)$,以$p(y)$为例子,也即是$H(y) = -\sum\limits_{i}^{C}{p(y_{i})}logp(y_{i})$,其中$C$是总类别数目,$p(y_{i})$也就是表示生成样本中第$i$类的概率。
实际计算是通过KL散度来计算的,KL散度的计算公式:
$$\begin{aligned} D_{KL}(P\|Q) &= \sum\limits_{i}P(x_{i})log\frac{P(x_{i})}{Q(x_{i})} \\ D_{KL}(P\|Q) &= \int_{-\infty}^{\infty}p(x)log\left(\frac{p(x)}{q(x)}\right)dx \end{aligned}$$具体到当前IS评分计算中就是$D_{KL}[p(y|x)\|p(y)]=H[p(y|x),p(y)]-H[p(y|x)]$ ,直观理解起来就是$D_{KL}[p(y|x)\|p(y)]$越大,$p(y|x)$的熵越小,且$p(y|x),p(y)$交叉熵越大,也即$p(y)$的熵越大。
计算公式为:
$$ IS(G)=exp\left(E_{x \sim p(g)}D_{KL}\left( p(y|x),p(y) \right)\right) $$实际计算过程中
- $x \sim p(g)$:表示从生成其中采样
- $p(y|x)$:表示将采样的图像送入到预训练Inception-V3中的到1k维的向量(各个类别的概率)。
- $p(y)$:表示N个从生成器中生成的图像(N通常取5000),每个生成的图像都送到Inception-V3中得到1k维向量,取平均得到。
随后计算他们KL散度,并求平均算$exp$
局限性
对神经网络权重很敏感
作者利用TensorFlow, Torch 和 Keras 等不同框架下预训练的 Inception V2 和 Inception V3 ,计算同一个数据库(50 k CIFAR-10 training images 和 50k ImageNet validation images)的 Inception Score。
发现尽管不同框架预训练的网络达到同样的分类精度,但由于其内部权重微小的不同,导致了 Inception Score 很大的变化,在 CIFAR-10 上 IV3 (inception v3) Torch 和 IV3 Keras 算出的 Inception Score 相差了 11.5% ,在 ImageNet 上,IV3 Torch 和 IV3 Keras 算出的 IS 相差 3.5%,这些差异,足以涵盖某些所谓 state-of-the-art 的模型所作出的提升。
需要同一数据集训练
使用 IS 时,分类模型和生成模型应该在同一个数据集上训练
由于 Inception V3 是在 ImageNet 上训练的,用 Inception V3 时,应该保证生成模型也在 ImageNet 上训练并生成 ImageNet 相似的图片,而不是把什么生成模型生成的图片(卧室,花,人脸)都往 Inception V3 中套,那种做法没有任何意义。
Inception Score 基于两个假设:
- Inception V3 可以准确估计$p(y)$,即样本在所有类别上的边缘分布;
- Inception V3 可以准确估计$p(y|x)$,从而计算出条件熵,用条件熵反映图片的真实程度。
对于假设 1,作者计算了 CIFAR-10 的边缘分布,取了排名前 10 的预测类。把这 10 类和 CIFAR-10 的 10 类相比较,发现,它们并没有对应关系。再一次说明了生成模型的训练数据需要和 Inception Net 或者别的什么分类网络的训练数据一致。不能在一个数据集上训练分类模型,用来评估另一个数据集上训练的生成模型。
对于假设 2,Inception 网络通过 $p(y|x)$ 计算出条件熵,条件熵越低表示生成的图片越真实,这也是有问题的。作者计算了 CIFAR 10 训练集的条件熵是 4.664 bit,而在随机噪声图片上,条件熵是 6.512 bit,仅仅比真实训练集图片高了一点点。
而在 ImageNet 的 validation set上,Inception net 算出的条件熵是 1.97 bit,也就是说 CIFAR 训练数据比起 ImageNet 更接近随机噪声,这显然是不科学的,因为 CIFAR 数据再不济也是真实图片,应该和 ImageNet 的条件熵更接近才对。再一次说明了,不能在一个数据集上训练分类模型,用来评估另一个数据集上训练的生成模型。
没有反映过拟合
根据 Inception Score 的计算原理,我们可以发现:如果神经网络记住了所有的训练集图片,然后随机输出,那么它会得到一个很高的 Inception Score。但是这种生成模型是没有意义的。
因此在用 Inception Score 评估生成模型的性能时,应该加上别的指标,证明模型没有过拟合,即模型输出的图片和训练集中任何图片都不同,单纯用 Inception Score 评估性能是不全面的。
Fréchet Inception Distance (FID)
实现
- wiki见1
- tensorflow实现:有一些常用数据集的预统计结果
- pytorch实现:DrawBench and PartiPrompts是常用的用于qualitative benchmarking的prompt dataset
原理
FID(Fréchet Inception Distance)是图像生成式模型的评分指标,表示生成图像的多样性和质量,FID越小质量越好。
FID计算器中,也用了inception network,用于提取特征(去除最后一层分类层,提取的特征是2048维度的向量)。
对于已经拥有的真实图像(也就是测试数据集),所有真实图片提取的向量是服从一个分布的,对于GAN生产的图片对应的高维向量特征也是服从一个分布的。如果两个分布相同,那么意味着GAN生成的图片的真实度很高。
如何计算两个分布之间的距离呢。并且两个分布都是多变量的(2048维度特征),所以是计算两个多维变量分布之间的距离,可以使用Wasserstein距离或者Frechet距离。
假设一个随机变量服从高斯分布(计算时拟合到高斯分布),那么这个分布可以用一个均值和方差来确定,那么两个分布只要均值方差相同,两个分布就相同。我们可以用均值和方差来计算两个单变量高斯分布之间的距离。这里是多维度分布,我们可以使用协方差矩阵来衡量多个维度之间的相关性,所以使用均值协方差矩阵来计算两个高维分布之间的距离,公式:
$$ d^2(F, G)=\|\mu_{X}-\mu_{Y}\|^2_{2}+Tr\big[\sum\limits_{X}+\sum\limits_{Y}-2(\sum\limits_{X}\sum\limits_{Y})^{1/2}\big] $$其中$\mu_{X},\mu_{Y}$是均值,$\sum\limits_{X},\sum\limits_{Y}$是协方差矩阵2。
局限性
一般来说
对于ImageNet这种大规模数据集上的过拟合问题,仍然没有解决。除此之外,FID是基于特征提取,也就是依赖于某些特征的出现或者不出现,因此无法描述这些特征之间的空间关系。例如用Gan生成的人脸,如果嘴长在眼睛上面,FID也可能认为是一张好的生成结果。
对于Stable Diffusion
类似于IS(Inception Score)或者KID(Kernel Inception Distance)应用在stable diffusion上通常来说不是特别好的选择,因为这些评分标准都是利用InceptionNet(pre-trained on the ImageNet-1k dataset)。而stable diffusion的训练数据集和InceptionNet的预训练数据集只有有限的overlap,所以不是一个特别合适的feature extraction方式。
另外这些方法的结果往往很脆弱,由于以下几点:
- 计算时使用的特定Inception model
- 计算的实现精确度
- 图像格式
谨记,FID通常来说对于相同结构和相同训练流程(similar runs)比较有效果。
Perceptual Path Length (PPL)
定义: 用于量化潜在空间(Latent Space)的平滑度和解纠缠程度。测量在潜在空间中进行插值时,生成图像在感知上的变化量。 公式:
$$ PPL = \mathbb{E} \left[ \frac{1}{\epsilon^2} D(G(I(z_1, z_2, t)), G(I(z_1, z_2, t+\epsilon))) \right] $$- $D$: 感知距离度量(如 LPIPS)。
- $I$: 插值函数(如线性或球面插值)。
- 低 PPL 表示潜在空间平滑,插值过渡自然,有利于图像编辑。
FID、IS、CLIP score metrics计算工程
参照BK-SDM的说明和实现,搞清楚了当前MS coco 30k的测试规则:首先是使用MS coco的数据集预计算的stat,然后是使用MS coco数据集中图片的caption作为prompt预测图片。也就是说实际上用来评估的两个数据集是属于统一的语义范畴的,两者差距不会太大。
另外根据不同的评分规则,该评分规则输入的图像大小也是不同的,InceptionNet是一个全卷积网络,通常使用的是最后一层特征($1 \times 2048 \times h \times w$)来计算均值和协方差矩阵的,如果最后一层的宽高不同的话,使用global spatial average pooling来将特征转化为$1 \times 2048$的最终特征。
检测领域指标
准确率(Precision)
通俗讲,准确率就是判定为正的正确率,公式是$Precesion=\frac{真正例(TP)}{真正例(TP) + 假正例(FP)}$。
- 真正例(True Positive, TP):实际为正,模型预测为正的例子。
- 假正例(False Positive, FP):实际为负,模型预测为正的例子。
- 真反例(True Negative, TN):实际为负,模型预测为反的例子。
- 假反例(False Negative, FN):实际为正,模型判定为反的例子。
召回率(Recall)
通俗讲,召回率就是:真实的正例中,有多少被模型正确识别出来了,用于衡量模型捕捉正例的能力,公式是$Recall=\frac{真正例(TP)}{真正例(TP) + 假反例(FN)}$。
3D 人体姿态估计性能指标
MPJPE (Mean Per Joint Position Error)
定义: 平均关节位置误差。计算预测的 3D 关节坐标与真实值(Ground Truth)之间的平均欧氏距离。通常在根关节(如骨盆)对齐后计算。 公式:
$$ MPJPE = \frac{1}{N \cdot J} \sum_{i=1}^{N} \sum_{j=1}^{J} \| \mathbf{P}_{i,j} - \mathbf{G}_{i,j} \|_2 $$- $N$: 样本数,$J$: 关节数。
- $\mathbf{P}_{i,j}$: 预测关节坐标。
- $\mathbf{G}_{i,j}$: 真实关节坐标。
- 单位通常为毫米 (mm)。
PA-MPJPE (Procrustes Aligned MPJPE)
定义: 普氏对齐后的平均关节位置误差。在计算 MPJPE 之前,先通过刚体变换(平移、旋转、缩放)将预测姿态与真实姿态进行对齐(Procrustes Analysis)。 作用: 消除全局旋转和尺度的影响,专注于评估姿态结构的重建质量。
PCK (Percentage of Correct Keypoints) & AUC
定义:
- PCK: 正确关键点的百分比。如果预测关节与真实关节的距离小于设定阈值(如 150mm 或头部长度的 50%),则视为正确。
- AUC (Area Under the Curve): PCK 曲线下的面积。计算不同阈值下的 PCK 值,绘制曲线并求面积,提供更综合的评估。
PVE (Per Vertex Error)
定义: 平均顶点误差。用于评估基于 Mesh 的人体重建模型(如 SMPL)。计算预测 Mesh 顶点与真实 Mesh 顶点之间的平均欧氏距离。 公式:
$$ PVE = \frac{1}{N \cdot V} \sum_{i=1}^{N} \sum_{v=1}^{V} \| \mathbf{M}_{i,v} - \mathbf{M}^{GT}_{i,v} \|_2 $$- $V$: Mesh 顶点数。