AI简报-图像质量评价指标-LPIPS
AI简报-图像质量评价指标-LPIPS
1. 意图
如何判断两幅图相似度?
因为图像是高纬度的数据,传统方法中通过像素级别的PSNR和SSIM来量化两幅图的相似度,但是对于图像来说,人类感知和量化指标存在一定偏差。如下图所示PSNR和SSIM对于模糊图像不敏感。

这篇文章(The Unreasonable Effectiveness of Deep Features as a Perceptual Metric)给出一种基于人类感知的图像质量评价指标Learned Perceptual Image Patch Similarity(LPIPS)
2. LPIPS
LPIPS 度量指标是建立在一个484K的人类判别的感知数据集(Berkeley-Adobe Perceptual Patch Similarity (BAPPS) Dataset)基础上构建CNN网络来构建度量学习。
在构建BAPPS数据集时,对参考图进行失真操作,然后人类根据参考图和失真图进行评分。这里涉及到两个部分:如何失真和评分标准。
失真操作包括传统和CNN的失真,如下图所示

人为评价标准有两个:
- 2AFC(two alternative forced choice):给出两种不同失真操作,挑选出和参考图(原始图)最相近的图
- Just noticeable differences (JND):给出两张图,只判别是否是相同还是不同
有了数据集后,就可以训练CNN模型,整个过程如下图所示;特征提取网络结构可以是VGG,AlexNet,SqueezeNet等。

如上图所示,将两个比较对象输入网络得到网络的每个特征层,然后进行差值计算,再赋予不同可学习的权重,最后求平均得到评价指标值。接着训练一个简单的网络来学习两个评价指标与人为评价指标差距。

在训练过程中,特征提取网络可以使用预训练的模型,固定权重,只学习特征权重;也可以把预训练模型的权重作为初始值,学习全部权重;也可以重新训练整个流程。
3. 使用
文章提供源代码和预训练模型可以直接对两幅图进行相似性判断,测试还是比较符合人类感知,lpips也作为许多图片质量评价的标准。
pip install lpips
import lpips
loss_fn_alex = lpips.LPIPS(net='alex') # best forward scores
loss_fn_vgg = lpips.LPIPS(net='vgg') # closer to "traditional" perceptual loss, when used for optimization
import torch
img0 = torch.zeros(1,3,64,64) # image should be RGB, IMPORTANT: normalized to [-1,1]
img1 = torch.zeros(1,3,64,64)
d = loss_fn_alex(img0, img1)