评估生成图像和视频的质量是生成模型(GAN、VAE、DDPM、Stable Diffusion 等)研发中的关键环节。评估指标分为主观评估 和客观评估两大类。
一、图像质量评估指标
1. FID(Fréchet Inception Distance)--- 最常用
原理:用 Inception V3 提取真实图和生成图的特征,假设两者服从高斯分布,计算 Fréchet 距离:
FID=∥μr−μg∥2+Tr(Σr+Σg−2(ΣrΣg)1/2)FID = \|\mu_r - \mu_g\|^2 + \text{Tr}\left(\Sigma_r + \Sigma_g - 2(\Sigma_r\Sigma_g)^{1/2}\right)FID=∥μr−μg∥2+Tr(Σr+Σg−2(ΣrΣg)1/2)
- μr,Σr\mu_r, \Sigma_rμr,Σr:真实图特征的均值和协方差
- μg,Σg\mu_g, \Sigma_gμg,Σg:生成图特征的均值和协方差
FID 越低越好(表示分布越接近),< 10 为优秀。
伪代码
function FID(real_images, generated_images):
inception = load_inception_v3()
real_features = inception(real_images) # [N, 2048]
fake_features = inception(generated_images)
μ_r = mean(real_features, dim=0)
Σ_r = cov(real_features)
μ_g = mean(fake_features, dim=0)
Σ_g = cov(fake_features)
diff = μ_r - μ_g
sqrt_term = sqrtm(Σ_r @ Σ_g) # 矩阵平方根
return norm(diff)^2 + trace(Σ_r + Σ_g - 2 * sqrt_term)
注意:FID 需要 50000+ 张图才稳定,对 batch size 敏感。
2. IS(Inception Score)--- 经典但逐渐被替代
原理:好的生成图应该被分类器高置信度识别为某类(条件熵低),同时各类分布均匀(边缘熵高):
IS=exp(ExDKL(p(y∣x)∥p(y)))IS = \exp\left(\mathbb{E}_x\left D_{KL}(p(y\|x) \\\| p(y)) \\right\right)IS=exp(ExDKL(p(y∣x)∥p(y)))
- p(y∣x)p(y|x)p(y∣x):Inception 对图 xxx 的类别预测
- p(y)p(y)p(y):所有生成图的平均类别分布
IS 越高越好。
伪代码
function IS(generated_images, splits=10):
inception = load_inception_v3()
probs = inception(generated_images) # [N, 1000] 类别概率
scores = []
for split in chunk(probs, splits):
p_yx = split # p(y|x)
p_y = mean(split, dim=0) # p(y)
kl = sum(p_yx * log(p_yx / p_y), dim=1)
scores.append(exp(mean(kl)))
return mean(scores), std(scores)
局限:只看类别多样性,不看真实性(噪声图也可能高 IS)。
3. LPIPS(Learned Perceptual Image Patch Similarity)
原理:用预训练网络(如 AlexNet/VGG)提取多层特征,逐层计算特征差异:
LPIPS(x,x^)=∑l1HlWl∑h,w∥wl⊙(y^hwl−yhwl)∥22LPIPS(x, \hat{x}) = \sum_l \frac{1}{H_l W_l} \sum_{h,w} \|w_l \odot (\hat{y}^l_{hw} - y^l_{hw})\|_2^2LPIPS(x,x^)=l∑HlWl1h,w∑∥wl⊙(y^hwl−yhwl)∥22
- yl,y^ly^l, \hat{y}^lyl,y^l:真实图和生成图在第 lll 层的特征
- wlw_lwl:可学习的逐通道权重
LPIPS 越低越好,越接近 0 越相似。
伪代码
function LPIPS(img1, img2):
net = load_alexnet()
features1 = net.extract_multi_layer(img1) # [feat_L1, feat_L2, ...]
features2 = net.extract_multi_layer(img2)
total = 0
for f1, f2, w in zip(features1, features2, layer_weights):
diff = (f1 - f2) ^ 2
diff = w * diff # 逐通道加权
total += mean(diff)
return total
优势:与人类感知高度相关,是衡量"像不像"最可靠的指标之一。
4. SSIM(Structural Similarity)
原理:从亮度、对比度、结构三个维度比较两图:
SSIM(x,y)=(2μxμy+C1)(2σxy+C2)(μx2+μy2+C1)(σx2+σy2+C2)SSIM(x, y) = \frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy} + C_2)}{(\mu_x^2 + \mu_y^2 + C_1)(\sigma_x^2 + \sigma_y^2 + C_2)}SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)
SSIM 越高越好,范围 0, 1,1 表示完全相同。
5. PSNR(Peak Signal-to-Noise Ratio)
PSNR=10⋅log10(MAX2MSE)PSNR = 10 \cdot \log_{10}\left(\frac{MAX^2}{MSE}\right)PSNR=10⋅log10(MSEMAX2)
- MAXMAXMAX:像素最大值(通常 255)
- MSEMSEMSE:均方误差
PSNR 越高越好,但与人眼感知相关性弱(常用于超分/去噪,不用于生成模型)。
二、指标对比总结
| 指标 | 方向 | 优点 | 缺点 |
|---|---|---|---|
| FID | ↓ 越低越好 | 与人类感知高度相关 | 需大量样本(5 万+),对 batch 敏感 |
| IS | ↑ 越高越好 | 计算快 | 只看多样性,不衡量真实性 |
| LPIPS | ↓ 越低越好 | 与人类感知最接近 | 需要参考图(不适合无条件生成) |
| SSIM | ↑ 越高越好 | 经典、计算快 | 像素级比较,对纹理不敏感 |
| PSNR | ↑ 越高越好 | 最简单 | 与人类感知相关性最弱 |
| CLIP Score | ↑ 越高越好 | 可评估文图匹配 | 依赖 CLIP 模型质量 |
三、视频质量评估指标
1. FVD(Fréchet Video Distance)
原理:FID 的视频版。用 I3D(Inflated 3D ConvNet)提取视频时序特征,计算 Fréchet 距离。
FVD 越低越好。
伪代码
function FVD(real_videos, generated_videos):
i3d = load_i3d_pretrained()
real_features = []
fake_features = []
for video in real_videos:
feats = i3d(video) # 3D 卷积提取时空特征
real_features.append(feats)
for video in generated_videos:
feats = i3d(video)
fake_features.append(feats)
# 和 FID 完全相同的 Fréchet 距离计算
return frechet_distance(real_features, fake_features)
局限:FVD 同样需要大量视频样本,且对帧率敏感。
2. VMAF(Video Multi-Method Assessment Fusion)
Netflix 开发的视频质量评估,融合多种指标(VIF + DLM + 时域信息):
VMAF = fusion(VIF_score, DLM_score, temporal_score)
VMAF 越高越好,范围 0, 100,接近 100 为"视觉无损"。
3. VBench(综合评估框架)
VBench 从多个维度综合评估视频生成模型:
| 维度 | 说明 |
|---|---|
| 主体一致性 | 主体在帧间是否稳定 |
| 背景一致性 | 背景是否稳定 |
| 运动平滑度 | 运动是否流畅 |
| 动态程度 | 视频的动感强度 |
| 美学质量 | 单帧的视觉美感 |
| 成像质量 | 清晰度、噪声水平 |
伪代码
function VBench(generated_videos):
scores = {}
scores['subject_consistency'] = clip_cosine_similarity(videos)
scores['bg_consistency'] = background_feature_matching(videos)
scores['motion_smoothness'] = optical_flow_variance(videos)
scores['dynamic_degree'] = frame_difference_ratio(videos)
scores['aesthetic_quality'] = aesthetic_model(videos)
scores['imaging_quality'] = image_quality_assessment(videos)
return weighted_sum(scores)
四、文本-图像/视频对齐指标
CLIP Score
原理:用 CLIP 模型计算文本和生成图的余弦相似度:
CLIPScore=cos(CLIPT(text), CLIPI(image))CLIPScore = \cos(\text{CLIP}_T(text),\ \text{CLIP}_I(image))CLIPScore=cos(CLIPT(text), CLIPI(image))
伪代码
function CLIP_Score(prompt, generated_image):
clip = load_clip_model()
text_emb = clip.encode_text(prompt) # [1, 512]
image_emb = clip.encode_image(generated_image)
score = cosine_similarity(text_emb, image_emb)
return score * 100 # 通常 ×100 便于阅读
CLIP Score 越高越好,衡量"图文是否匹配"。
五、综合评估方案(生产环境推荐)
┌─────────────────────────────────────────────┐
│ 生成模型评估流程 │
├─────────────────────────────────────────────┤
│ │
│ 1. FID 评估整体分布质量(≥ 50k 样本) │
│ ↓ │
│ 2. CLIP Score 评估文图对齐(≥ 10k 样本) │
│ ↓ │
│ 3. LPIPS 评估逐对相似度(有参考图时) │
│ ↓ │
│ 4. 人工偏好评估(A/B test,≥ 200 人) │
│ ↓ │
│ 5. 视频:FVD + VBench 多维评估 │
│ │
└─────────────────────────────────────────────┘
六、评估陷阱
| 陷阱 | 说明 | 对策 |
|---|---|---|
| FID 对预处理敏感 | resize 方式不同可差 10+ 分 | 统一 resize 方式(bicubic) |
| IS 被高方差噪声骗过 | 纯噪声图可能高 IS | 必须配合 FID |
| 只用一个指标 | 单一指标不能反映全貌 | 至少 FID + CLIP Score + 人工 |
| 样本太少 | FID 需要 50k 张才稳定 | 用足够样本,标注样本量 |
| 忽略多样性 | 只比较平均值忽略方差 | 看 Precision/Recall 曲线 |
个人能力有限,有问题随时联系~