论文中测试生成图像数据的评估指标,可用于光流估计、图像插帧等

PSNR:峰值信噪比

PSNR全称为“Peak Signal-to-Noise Ratio”,中文意思即为峰值信噪比,是衡量图像质量的指标之一。
图像与影像压缩中典型的峰值讯噪比值在30dB 到50dB 之间,越高越好。

  • $PSNR\approx50dB$ ,代表压缩后的图像仅有些许非常小的误差。
  • $PSNR>30dB$ ,人眼很难察觉压缩后和原始影像的差异。
  • $PSNR \in [20dB ,30dB]$,人眼就可以察觉出图像的差异。
  • $PSNR \in [10dB ,20dB]$,人眼还是可以用肉眼看出这个图像原始的结构,且直观上会判断两张图像不存在很大的差异。
  • $PSNR<10dB$,人类很难用肉眼去判断两个图像是否为相同,一个图像是否为另一个图像的压缩结果。

公式

PSNR是基于MSE(均方误差)定义,对给定一个大小为m*n的原始图像I和对其添加噪声后的噪声图像K,其MSE可定义为:
$$
MSE=\frac{1}{m n} \sum_{i=0}^{m-1} \sum_{j=0}^{n-1}[I(i, j)-K(i, j)]^{2}
$$
则PSNR可定义为:
$$
P S N R=10 \cdot \log {10}\left(\frac{M A X{I}^{2}}{M S E}\right)=20 \cdot \log {10}\left(\frac{M A X{I}}{\sqrt{M S E}}\right)
$$
其中MAXI为图像的最大像素值,PSNR的单位为dB。若每个像素由8位二进制表示,则其值为2^8-1=255。但注意这是针对灰度图像的计算方法,若是彩色图像,通常可以由以下方法进行计算:

  • 方法一:计算RGB图像三个通道每个通道的MSE值再求平均值,进而求PSNR

  • 方法二:直接使用matlab的内置函数psnr()(注意该函数将所有图像当成灰度图像处理)。

  • 方法三:将图像转为YCbCr格式,只计算Y分量即亮度分量的PSNR。

代码

python实现:

from skimage.metrics import peak_signal_noise_ratio as psnr
from PIL import Image
import numpy as np


img1 = np.array(Image.open('original.jpg'))
img2 = np.array(Image.open('compress.jpg'))


if __name__ == "__main__":
print(psnr(img1, img2))

matlab实现:

function PSNR = psnr(f1, f2)
%计算两幅图像的峰值信噪比
k = 8;
%k为图像是表示地个像素点所用的二进制位数,即位深。
fmax = 2.^k - 1;
a = fmax.^2;
MSE =(double(im2uint8(f1)) -double( im2uint8(f2))).^2;
b = mean(mean(MSE));
PSNR = 10*log10(a/b);

SSIM:结构相似性

SSIM 测量两个图像之间的相似性。人类对像素的绝对亮度/颜色不敏感,但对边缘和纹理的位置非常敏感。 SSIM 通过主要关注边缘和纹理相似性来模仿人类感知。一般取值范围:0-1.值越大,质量越好。

公式

SSIM分别在亮度 (luminance l(x,y))、对比度 (contrast c(x,y)) 和结构 (structure s(x,y))三个方面进行比较。
$$
\operatorname{SSIM}(\mathbf{x}, \mathbf{y})=[l(\mathbf{x}, \mathbf{y})]^{\alpha}[c(\mathbf{x}, \mathbf{y})]^{\beta}[s(\mathbf{x}, \mathbf{y})]^{\gamma}
$$
其中,l(x,y)比较x和y的亮度,c(x,y)比较x和y的对比度,s(x,y)比较x和y的结构。C1、C2、C3是正值常数,用于防止公式出现除0异常。

简化公式

$$
\operatorname{SSIM}(\mathbf{x}, \mathbf{y})=\frac{\left(2 \mu_{x} \mu_{y}+C_{1}\right)\left(2 \sigma_{x y}+C_{2}\right)}{\left(\mu_{x}^{2}+\mu_{y}^{2}+C_{1}\right)\left(\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}\right)}
$$
C1、C2、C3是正值常数,用于防止公式出现除0异常。
$C_1=(K_1L)(K_1L)$
$C_2=(K_2
L)(K_2L)$
$C_3=C_2/2$
默认 $K_1 = 0.01,K_2 = 0.03$,$L=2^B-1$,B是比特深度。常用8bit,所以L值一般是255。

代码

python实现:

from skimage.measure import compare_ssim
print(compare_ssim(img1, img2,data_range=255,multichannel=True))

LPIPS 图像相似性度量标准(感知损失)

该度量标准学习生成图像到Ground Truth的反向映射强制生成器学习从假图像中重构真实图像的反向映射,并优先处理它们之间的感知相似度。LPIPS 比传统方法(比如L2/PSNR, SSIM, FSIM)更符合人类的感知情况。LPIPS的值越低表示两张图像越相似,反之,则差异越大。

公式

$$
d\left(x, x_{0}\right)=\sum_{l} \frac{1}{H_{l} W_{l}} \sum_{h, w}\left|w_{l} \odot\left(\hat{y}{h w}^{l}-\hat{y}{0 h w}^{l}\right)\right|_{2}^{2}
$$
d为 x0与x之间的距离。从L层提取特征堆(feature stack)并在通道维度中进行单位规格化(unit-normalize)。利用向量WL 来放缩激活通道数,最终计算L2距离。最后在空间上平均,在通道上求和。

代码

python实现:

import lpips
class util_of_lpips():
def __init__(self, net, use_gpu=False):
'''
Parameters
----------
net: str
抽取特征的网络,['alex', 'vgg']
use_gpu: bool
是否使用GPU,默认不使用
Returns
-------
References
-------
https://github.com/richzhang/PerceptualSimilarity/blob/master/lpips_2imgs.py
'''
## Initializing the model
self.loss_fn = lpips.LPIPS(net=net)
self.use_gpu = use_gpu
if use_gpu:
self.loss_fn.cuda()

def calc_lpips(self, img1_path, img2_path):
'''
Parameters
----------
img1_path : str
图像1的路径.
img2_path : str
图像2的路径.
Returns
-------
dist01 : torch.Tensor
学习的感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS).

References
-------
https://github.com/richzhang/PerceptualSimilarity/blob/master/lpips_2imgs.py

'''
# Load images
img0 = lpips.im2tensor(lpips.load_image(img1_path)) # RGB image from [-1,1]
img1 = lpips.im2tensor(lpips.load_image(img2_path))

if self.use_gpu:
img0 = img0.cuda()
img1 = img1.cuda()
dist01 = self.loss_fn.forward(img0, img1)
return dist01

IE

公式

$$
\operatorname{IE} = \left[ \frac{1}{N}\sum_{(x,y)}(I(x, y) - I_{GT}(x, y))^2 \right]^{\frac{1}{2}}
$$
N代表图片像素的个数

论文地址:A Database and Evaluation Methodology for Optical Flow

光流估计评估方法

以上介绍都是对于生成图像与ground truth的比较,一下介绍光流估计中的评价指标:

EPE/EE(Endpoint Error)

EPE(Endpoint Error),是光流估计中标准的误差度量,是预测光流向量与真实光流向量的欧氏距离在所有像素上的均值。(越低越好)

公式

$$
\operatorname{EPE}=\sqrt{\left(\left(\mathrm{u}{\mathrm{est}}-\mathrm{u}{\mathrm{gt}}\right)^{2}+\left(\mathrm{v}{\mathrm{est}}-\mathrm{v}{\mathrm{gt}}\right)^{2}\right)}
$$

AE(Angular Error)

光流是使用了类似平面直角坐标系中的坐标形式来表达,而该坐标同时可以表示为一个向量。由此可以引入另一个评价指标AE。

AE(Angular Error),是计算光流向量之间的角度误差(此处加了一个维度,从原来的(u, v) 变成 (u, v, 1))。

公式

$$
AE = \arccos(\frac{(u_{est},v_{est},1)^T *(u_{gt},v_{gt},1)}{\sqrt{1.0+u_{est}^2+v_{est}^2}\sqrt{1.0+u_{gt}^2+v_{gt}^2}})
$$
新的评价方法更新中…

参考

https://zhuanlan.zhihu.com/p/541385224?utm_id=0
https://blog.csdn.net/weixin_43135178/article/details/118497369
https://mapengsen.blog.csdn.net/article/details/127486035
https://blog.csdn.net/weixin_43466026/article/details/119898304
https://aistudio.baidu.com/aistudio/projectdetail/4597614
A Database and Evaluation Methodology for Optical Flow