前言

本文主要讨论用于衡量图片质量的常用方法和用于评估 GAN 效果的方法。

  • MSE
  • PSNR
  • SSIM[1]
  • MS-SSIM[2]

评估图片质量的方法

方法主要是衡量两张图片的相似度,以下用X{X}Y{Y}代指两张图片,如果X{X}是一张高质量图片,Y{Y}是待测图片,如果两张图片相似,那么Y{Y}也有很高的质量。

MSE

就是两张图片的像素差的平方的均值。

MSE(X,Y)=1MNi=1Mj=1N(Xi,jYi,j)2{ MSE(X,Y) = \frac{1}{MN} \sum_{i = 1}^{M} \sum_{j = 1}^{N} (X_{i,j} - Y_{i,j})^{2} }

容易知道,MSE 是越小,两张图片越接近,质量也就越好。 RMSE 就是再开个根号。

PSNR(Peak Singal-to-noise ratio) 峰值信噪比

最高响应(可以取得的最大值,对8bit图片就是255)的平方除以MSE,再取对数。

PSNR(X,Y)=10log10(MAX2MSE(X,Y)){ PSNR(X,Y) = 10 \log_{10} \left( \frac{MAX^{2}}{MSE(X,Y)} \right) }

PSNR 是越大越好,但是没有上界。

SSIM [1]


SSIM 分三个部分:

  • 亮度:l(X,Y){l(X,Y)}
  • 对比度:c(X,Y){c(X,Y)}
  • 结构相似度:s(X,Y){s(X,Y)}

SSIM(X,Y)=[l(X,Y)]α[c(X,Y)]β[s(X,Y)]γ{ SSIM(X,Y) = [l(X,Y)]^{\alpha} [c(X,Y)]^{\beta} [s(X,Y)]^{\gamma} }

l(x,y)=2μxμy+C1ux2+uy2+C1c(x,y)=2σxσy+C2σx2+σy2+C2s(x,y)=σx,y+C3σxσy+C3{ \begin{aligned} l(\mathbf{x},\mathbf{y}) &= \frac{2 \mu_{x} \mu_{y} + C_{1}}{u_{x}^{2} + u_{y}^{2} + C_{1}} \\ c(\mathbf{x},\mathbf{y}) &= \frac{2 \sigma_{x} \sigma_{y} + C_{2}}{\sigma_{x}^{2} + \sigma_{y}^{2} + C_{2}} \\ s(\mathbf{x},\mathbf{y}) &= \frac{\sigma_{x,y} + C_{3}}{\sigma_{x}\sigma_{y} + C_{3}} \end{aligned} }

其中μx,μy,σx2,σy2,σx,y{\mu_{x},\mu_{y},\sigma_{x}^{2},\sigma_{y}^{2},\sigma_{x,y}}分别是图片x,y{x,y}的均值,方差,协方差。

实际SSIM计算[3]

上述的SSIM计算公式包含的超参数有:三种指标的比例α,β,γ{\alpha, \beta, \gamma},三种指标计算中的常数C1,C2,C3{C_{1},C_{2},C_{3}}

在实际的SSIM计算中一般会将上面的式子进行变换:取α=β=γ=1{\alpha = \beta = \gamma = 1},取C3=C2/2{C_{3} = C_{2} / 2},式子变为:

SSIM(x,y)=(2μxμy+C1)(2σx,y+C2)(μx2+μy2+C1)(σx2+σy2+C2)=l(x,y)2σx,y+C2σx2+σy2+C2{ \begin{aligned} SSIM(\mathbf{x},\mathbf{y}) &= \frac{(2 \mu_{x} \mu_{y} + C_{1})(2 \sigma_{x,y} + C_{2})}{(\mu_{x}^{2} + \mu_{y}^{2} + C_{1})(\sigma_{x}^{2} + \sigma_{y}^{2} + C_{2})} \\ &= l(\mathbf{x},\mathbf{y}) \frac{2 \sigma_{x,y} + C_{2}}{\sigma_{x}^{2} + \sigma_{y}^{2} + C_{2}} \end{aligned} }

而且使用 NxN 的窗口,窗口按照类似滤波器的方式在图片上以strid=1移动,每次计算窗口内的局部SSIM,最后取平均值

其他SSIM的细节

  • 计算细节:

可以借助已有的卷积函数(如pytorch的torch.nn.functional.conv2d),只要设置卷积核为box filter,就可以求得各个window的均值,再借助方差、协方差的公式:

σX2=EX2(EX)2{ \sigma_{X}^{2} = \mathbb{E}X^{2} - (\mathbb{E}X)^{2} }

σX,Y=E(XY)EXEY{ \sigma_{X,Y} = \mathbb{E}(XY) - \mathbb{E}X\mathbb{E}Y }

这样计算起来比较高效。

但是在官方实现的matlab代码中默认使用的是大小为11x11,σ=1.5{\sigma = 1.5}的旋转对称高斯低通滤波器。所以在一份pytorch的实现(见下面)中也是用的高斯滤波器。

  • 数值问题:

    协方差的计算会出现负数,可以将负数置0处理(relu)

  • 超参数取值:

C1,C2{C_{1},C_{2}} 通常的计算公式是:

Ci=(KiL)2(i=1,2){ C_{i} = (K_{i} L)^{2} \qquad (i = 1, 2) }

其中 L{L} 和PSNR中的一样也是最大响应(8bit图像为255),K1,K2{K_{1},K_{2}}通常的取值为(0.01,0.03){(0.01,0.03)}

MS-SSIM [2]


MS-SSIM 在 SSIM 的基础上扩展成多个尺度的,idea是人眼对中间频率最敏感(human visual sensitivity peaks at middle frequencies (around 4 cycles per degree of visual angle) and decreases along both high- and low-frequency directions[2])。

对原图,进行低通滤波、下采样(大小减半)得到每一个scale的图片,共进行M1{M - 1}次。

除了最底层的scale,对第j=0,,M1{j = 0,\cdots,M-1}的scale的图片按照SSIM的相同方法可以计算到cj(x,y),sj(x,y){c_{j}(\mathbf{x},\mathbf{y}),s_{j}(\mathbf{x},\mathbf{y})}

最底层的scale,三种指标都计算,记作lM(x,y),cM(x,y),sM(x,y){l_{M}(\mathbf{x},\mathbf{y}),c_{M}(\mathbf{x},\mathbf{y}),s_{M}(\mathbf{x},\mathbf{y})}

最后按照下式计算它们的乘积:

MSSSIM(x,y)=[lM(x,y)]αMj=1M[cj(x,y)]βj[sj(x,y)]γj{ MSSSIM(\mathbf{x},\mathbf{y}) = [l_{M}(\mathbf{x},\mathbf{y})]^{\alpha_{M}} \prod_{j = 1}^{M} [c_{j}(\mathbf{x},\mathbf{y})]^{\beta_{j}} [s_{j}(\mathbf{x},\mathbf{y})]^{\gamma_{j}} }

如下图所示:

MS-SSIM计算方式
MS-SSIM计算方式

MS-SSIM 实现细节

一般:

  • M{M}为5
  • 且对每个scale的αj=βj=γj{\alpha_{j} = \beta_{j} = \gamma_{j}}
  • 对所有的j,保证j=1Mγj=1{\sum_{j = 1}^{M} \gamma_{j} = 1}

如果接着令C3=C2/2{C_{3} = C_{2} / 2},那么也可以化简成类似SSIM的两项:

MSSSIM(x,y)=[lM(x,y)]γMj=1M[2σx,y,j+C2σx,j2+σy,j2+C2]γj{ MSSSIM(\mathbf{x},\mathbf{y}) = [l_{M}(\mathbf{x},\mathbf{y})]^{\gamma_{M}} \prod_{j = 1}^{M} [\frac{2 \sigma_{x,y,j} + C_{2}}{\sigma_{x,j}^{2} + \sigma_{y,j}^{2} + C_{2} }]^{\gamma_{j}} }

其他细节

  • 数值问题:

    和之前SSIM说的一样,MS-SSIM 的计算中的协方差可能为负数,对负数取分数指数,会导致nan,通常的做法是:

    • 调大C2{C_{2}},使得数值为正
    • 将协方差所有负数值置0,relu
  • 超参数取值:

    文章[2]中,作者对M=5{M=5}时实验的最佳γi{\gamma_{i}}取值为:(0.0448,0.2856,0.3001,0.2363,0.1333){(0.0448,0.2856,0.3001,0.2363,0.1333)}

用于评价GAN


SSIM, MS-SSIM 可以用于衡量两张图片的相似性,ACGAN[4] 将它引入,用于衡量各类别生成的图片的多样性,和检测训练中的mode collapse问题

具体的做法其实很简单:

对每个类别生成的图片,任意选择100对,衡量两两的 MS-SSIM,取均值得分高表明该类生成的图像都非常相似,所以图片的多样性比较低,反之图片的多样性高

其他资料


  1. SSIM 主页(包含一份 matlab 代码)
  2. SSIM,MS-SSIM pytorch 实现
  3. 我的实现

Reference


  1. Wang, Z., Bovik, A. C., Sheikh, H. R., & Simoncelli, E. P. (2004). Image quality assessment: From error visibility to structural similarity. IEEE Transactions on Image Processing, 13(4), 600–612. https://doi.org/10.1109/TIP.2003.819861

  2. Wang, Z., Simoncelli, E. P., & Bovik, A. C. (2003). Multi-scale structural similarity for image quality assessment. Conference Record of the Asilomar Conference on Signals, Systems and Computers, 2, 1398–1402. https://doi.org/10.1109/acssc.2003.1292216

  3. 结构相似性 wikipedia

  4. Odena, A., Olah, C., & Shlens, J. (2017). Conditional image synthesis with auxiliary classifier gans. 34th International Conference on Machine Learning, ICML 2017, 6, 4043–4055.