前言
因为最近在做一个关于物品识别的项目,因为用于识别的图片光照环境多样,其中有许多照片都是在光照不良或者严重背光的环境下产生的,所以一个非常重要的处理步骤就是进行图像增强,提高图像亮度从而提高最后物品识别的准确率,因此我阅读了一些大牛论文来学习他们提出的算法,这里记录一下我的学习过程。
一、EnlightenGAN
1. 思路概述
目前,基于深度学习的图像增强方法取得了一些不错的成效。但这存在着一个问题,就是它们大部分都属于监督学习,也就是说需要大量配对数据(paired data)来进行训练,但现实生活中,我们很难获取大量的同场景下的低光和正常光图像来作为数据对。因此,作者和他的团队提出了一种无监督的生成对抗网络来实现图像增强,即EnlightenGAN。这个模型并不需要配对数据来进行训练,但却能在多种场景下表现良好。为了提高模型性能,同时也弥补数据未成对造成的一些缺憾,作者和他的团队提出了一系列的新处理方法,包括全局-局部判别器结构,自正则化感知损失,以及自正则注意机制(a global-local discriminator structure, a self-regularized perceptual loss fusion, and the attention mechanism)
论文中,作者总结了该模型的一些亮点:
(1)这是第一个成功使用未配对数据(unpaired data)训练的低光图像增强模型,它消除了这一领域对于配对数据的依赖,也就是说,我们可以利用多个领域多个场景的未配对数据来进行训练,并且这能够大大减小过拟合风险,提高模型应用在现实世界的泛化能力。
(2)模型使用的全局-局部判别器结构,让其对于在空间不同光条件不同的图像上也表现良好;此外,自正则化的特征保留损失(比较生成前后VGG提取的特征差异)和自正则化的注意力机制
很好的弥补了模型缺乏外界监督的缺点,对模型的成功十分关键。
(3)EnlightenGAN与当前的几种先进方法相比,均能体现出优越性;且与使用配对数据训练的方法相比,EnlightenGAN能在多领域的真实低光图像上都表现出色。
配对数据与不配对数据( paired and unpaired data):当两个数据集的长度相等,并且一个数据集中的每个观察值都可以与另一个数据集中的观察值“配对”时,我们称之为配对数据,如果无法配对则称为不配对数据。举个例子,如果我需要观察班上的同学喝了魔法药水之后念咒语能不能变身,那么如果我选择一组同学让他们喝下魔法药水,分别记录下他们喝药前后的数据,这两组数据就叫做配对数据;如果我取这组喝了药的同学和另外一组未喝药的同学来记录数据,这两组数据就是不配对数据
2. 实现方法
这里把整个EnlightenGAN的结构介绍一下,具体的损失函数见下一部分。
可以看到,整个架构可以分成两个模块,生成器模块和全局-局部判别器模块。首先,我们来看看生成器模块。生成器模块就是一个引入了自注意力机制的U-Net,自正则化注意力图的生成方式如下:我们把输入的RGB图像的照度通道( illumination channel)I 归一化到 [ 0,1 ], 然后通过运算1 - I (element-wise difference 逐元素作差)就得到了我们的注意力图(attention map),可以理解为对于光照越弱的地方注意力越强。因为网络中得到的每个特征图大小都不一样,所以这里把注意力图resize为各中间的特征图对应的大小,然后对应相乘最后得到了我们的输出图像。
整个U-Net由8个卷积块组成,每个卷积块由两个3*3的卷积层组成,卷积层后都是一个BN层和一个LeakRelu层,这里之所以不使用传统的Relu函数,是因为如果使用Relu函数,得到的稀疏网络不利于GAN的稳定性。此外,为了减小棋盘效应,作者用一个双线性上采样层加一个卷积层来代替原本的标准反卷积层。
棋盘效应:由于反卷积的”不均匀重叠“,会导致图像中的某部位比别的部位颜色深,造成的伪影看上去像棋盘格子一般。而这种”不均匀重叠“,是因为卷积核(kernel)尺寸不能被步长(stride)整除导致的。
接下来我们来看判别器模块,可以看到有两个判别器,一个是全局判别器,一个是局部判别器,都使用的是PatchGAN判别器。
这里介绍一下PatchGAN,这是一个全卷积网络,它与标准的GAN判别器最关键的不同点,就是最后得到的不是一个值(概率),而是一个N * N *1 的矩阵
X
X
X,这个矩阵
X
X
X也就是全卷积网络输出的特征图,而
X
i
j
X_{ij}
Xij就是某个patch是真是假的概率,对应着原图的某块区域,最终通过平均得到结果。我们可以把它视为是对原图的每个区域都进行了判断,最后加权平均得到全局的结果,这样能关注到更多的图像细节。
全局判别器不用多说大家都很熟悉,局部判别器则是一个需要注意的创新点,实现方式是每次从输出的生成图和真实图片中随机裁剪5个patch,让判别器进行鉴别,它能够确保生成的增强图像的所有局部区域看起来都像真实的自然光,这对于避免局部过曝或低曝是非常重要的,尤其是对于该模型使用未配对数据的情况下。
接下来我们来看涉及的另外一个网络结构,计算自特征保留损失时用到的VGG Net。使用种预训练的VGG对图像之间的特征空间距离进行建模,是一个使用较多的方法,但通常被用来计算输出图像和对应的真实图像之间的特征距离从而对其进行限制。由于这里使用的是未配对数据,作者和他的团队将其用于不同的对象:输入的低光图像与生成的增强图像之间的特征距离。原理基础就是作者和团队在大量实验后发现,调整图像的亮度对于VGG Net的分类结果影响不大,也就是说VGG Ne提取图像特征的能力对亮度不敏感,这是基于未配对数据的一个伟大创新,详细的感知损失计算我在下一部分会进行描述。
3. 损失函数
(1)全局-局部判别器和生成器的损失函数
如果大家对GAN不陌生的话,应该都记得它在训练中的每个epoch,都是先固定生成器训练得到当前最优的判别器,然后再固定这个判别器去训练生成器,在这里也是一样。为了让不了解GAN的同学更好的理解这里的损失函数,这里我从初代标准GAN的损失函数开始,介绍几代不同的损失函数。
标准GAN损失函数
在论文中,标准的GAN价值函数定义如下:
min G max D V ( D , G ) = E x ∼ p data ( x ) [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min _{G} \max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))] minGmaxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
可以发现,这个函数是生成器和判别器两者之间的博弈,这也符合GAN提出的理念:让判别器提升自己的鉴别能力,同时让生成器提高骗过判别器的能力。在训练的时候,我们将上述价值函数拆分成两个对应的损失函数,训练判别器的时候损失函数如下:
1 m ∑ i = 1 m [ log D ( x ( i ) ) + log ( 1 − D ( G ( z ( i ) ) ) ) ] \frac{1}{m} \sum_{i=1}^{m}\left[\log D\left(\boldsymbol{x}^{(i)}\right)+\log \left(1-D\left(G\left(\boldsymbol{z}^{(i)}\right)\right)\right)\right] m1∑i=1m[logD(x(i))+log(1−D(G(z(i))))]
其中,m是batch_size(每个批次样本数量), x i x_i xi是从生成真实数据的分布中随机抽取的第i个样本, z i z_i zi是从先验噪声分布中随机抽取的第i个样本,D是判别器,G是生成器。注意,这里是要最大化损失函数,所以是梯度上升。
训练完判别器后,就固定更新后的判别器,然后训练生成器,损失函数如下:
1 m ∑ i = 1 m log ( 1 − D ( G ( z ( i ) ) ) ) \frac{1}{m} \sum_{i=1}^{m} \log \left(1-D\left(G\left(\boldsymbol{z}^{(i)}\right)\right)\right) m1∑i=1mlog(1−D(G(z(i))))
各参数的含义和上面一致,由于这里是要最小化损失函数,所以是梯度下降。
如果模型在训练中正常收敛, p g p_g pg会在最后收敛至 p d a t a p_{data} pdata,也就是让生成器能够复刻现实中的数据分布。肯定有同学疑惑通过GAN的价值函数是如何实现最后这个收敛目标的,这里面涉及了数学推导,由于篇幅问题,我就另开了一个博客来写,感兴趣的同学可以去我的这篇博客看详细的推导过程:GAN优化过程的数学推导
相对判别器的提出
在GAN的原始论文发布后,一位统计学家指出目前的标准GAN缺少一个关键属性:在训练生成器时,我们不仅应该提高伪数据是真实数据的概率,还应该降低实际数据是真实数据的概率。她的论文链接如下,感兴趣的同学可以去看看原文的细节:The relativistic discriminator: a key element missing from standard GAN
我们倒回去看标准GAN在训练生成器时使用的损失函数:
1 m ∑ i = 1 m log ( 1 − D ( G ( z ( i ) ) ) ) \frac{1}{m} \sum_{i=1}^{m} \log \left(1-D\left(G\left(\boldsymbol{z}^{(i)}\right)\right)\right) m1∑i=1mlog(1−D(G(z(i))))
可以发现该函数确实只和假数据有关,并没有包含真实数据的相关项。
在这里,我用通俗易懂一些的话简单描述一下作者的依据,她主要提出了三个方面,我主要介绍前两个方面的原因,第三个梯度相关的原因需要的数学推导在原文是有的,大家可以自己去看。
第一个原因就是从先验知识的角度考虑的,从先验知识来看,我们期望最后的判别器对于一个样本的真实性判断概率为0.5(我们每次扔给判别器的样本都是一半为真实图片一半为生成的假图片);但是,按照标准GAN的逻辑,它没有利用到这一先验知识,如果生成器在训练后渐渐能复刻真实数据的分布,那么判别器最后很可能会出现对于真假图片输出都约等于一的情况。经过生成器的多轮迭代后,就可能会出现判别器中的layer输出
C
(
x
f
)
>
C
(
x
r
)
C(x_f) > C(x_r)
C(xf)>C(xr)的情况。这个时候,鉴于我们塞进去的图片是一半真实图片一半生成的图片,因此判别器反而会认为真图片是假的。
第二个原因是从JS散度的优化角度考虑的。如果读了GAN的原论文或者是看了我那篇关于GAN优化过程的数学推导的博客(GAN优化过程的数学推导)后,应该就知道基于原始GAN的判别器推导出最优判别器的形式后,能把价值函数改写成:
C ( G ) = − 2 log 2 + 2 D J S ( P data ∥ P G ) C(G)=-2 \log 2+2 D_{JS}\left(P_{\text {data }} \| P_{G}\right) C(G)=−2log2+2DJS(Pdata ∥PG)
我们可以这么理解,最优的判别器估计的就是最大化实际数据分布 p d a t a p_{data} pdata和生成器生成的数据分布 p g p_g pg的JS散度,所以生成器要骗过它就要最小化JS散度。因为这个是基于最优判别器的函数形式,也就是优化判别器而达成的,所以我们把JS散度移到等式左边并代入生成器的损失函数,则JS散度的计算可以表示为最大化下列式子:
D J S ( P ∥ Q ) = 1 2 ( log ( 4 ) + max D : X → [ 0 , 1 ] E x r ∼ P [ log ( D ( x r ) ) ] + E x f ∼ Q [ log ( 1 − D ( x f ) ) ] ) D_{JS}(\mathbb{P} \| \mathbb{Q})=\frac{1}{2}\left(\log (4)+\max _{D: X \rightarrow[0,1]} \mathbb{E}_{x_{r} \sim \mathbb{P}}\left[\log \left(D\left(x_{r}\right)\right)\right]+\mathbb{E}_{x_{f} \sim \mathbb{Q}}\left[\log \left(1-D\left(x_{f}\right)\right)\right]\right) DJS(P∥Q)=21(log(4)+maxD:X→[0,1]Exr∼P[log(D(xr))]+Exf∼Q[log(1−D(xf))])
对于
x
r
∈
P
x_{r} \in P
xr∈P和
x
f
∈
Q
x_{f} \in Q
xf∈Q 如果
D
(
x
r
)
=
D
(
x
f
)
=
0.5
D\left(x_{r}\right)=D\left(x_{f}\right)=0.5
D(xr)=D(xf)=0.5 ,
D
J
S
D_{JS}
DJS 最小化; 如果
D
(
x
r
)
=
1
,
D
(
x
f
)
=
0
,
D
J
S
D\left(x_{r}\right)=1 , D\left(x_{f}\right)=0 ,D_{JS}
D(xr)=1,D(xf)=0,DJS最大化。而我们在最小化
D
J
S
D_{JS}
DJS时,本来应该发生
D
(
x
r
)
D(x_r)
D(xr)从
1
1
1到
0.5
0.5
0.5的变化和
D
(
x
f
)
D(x_f)
D(xf)从
0
0
0到
0.5
0.5
0.5的变化,但实际上我们只让
D
(
x
f
)
D(x_f)
D(xf)增大了,而且是增大到趋近于1,我们并没有减小
D
(
x
r
)
D(x_r)
D(xr)。结果如下图:
这样的话,事实上我们的优化过程并不是严格意义上最小化JS散度的过程。
基于这些原因分析,作者认为要在训练生成器时减小 D ( x r ) D(x_r) D(xr),所以提出了下述对损失函数的修改:
原GAN判别器:
D
(
x
)
=
sigmoid
(
C
(
x
)
)
D(x)=\operatorname{sigmoid}(C(x))
D(x)=sigmoid(C(x))
修改后对于某对数据
x
~
=
(
x
r
,
x
f
)
\tilde{x}=\left(x_{r}, x_{f}\right)
x~=(xr,xf)的相对判别器:
D
(
x
~
)
=
sigmoid
(
C
(
x
r
)
−
C
(
x
f
)
)
D(\tilde{x})=\operatorname{sigmoid}\left(C\left(x_{r}\right)-C\left(x_{f}\right)\right)
D(x~)=sigmoid(C(xr)−C(xf))
也就是说,现在我们的判别器可以说是用来估计真实图片比假图片更加真实的概率。因此,相对标准GAN的判别器和生成器的损失函数变为:
L D R S G A N = − E ( x r , x f ) ∼ ( P , Q ) [ log ( sigmoid ( C ( x r ) − C ( x f ) ) ) ] . L G R S G A N = − E ( x r , x f ) ∼ ( P , Q ) [ log ( sigmoid ( C ( x f ) − C ( x r ) ) ) ] . \begin{aligned} L_{D}^{R S G A N} & =-\mathbb{E}_{\left(x_{r}, x_{f}\right) \sim(\mathbb{P}, \mathbb{Q})}\left[\log \left(\operatorname{sigmoid}\left(C\left(x_{r}\right)-C\left(x_{f}\right)\right)\right)\right] . \\ L_{G}^{R S G A N} & =-\mathbb{E}_{\left(x_{r}, x_{f}\right) \sim(\mathbb{P}, \mathbb{Q})}\left[\log \left(\operatorname{sigmoid}\left(C\left(x_{f}\right)-C\left(x_{r}\right)\right)\right)\right] . \end{aligned} LDRSGANLGRSGAN=−E(xr,xf)∼(P,Q)[log(sigmoid(C(xr)−C(xf)))].=−E(xr,xf)∼(P,Q)[log(sigmoid(C(xf)−C(xr)))].
LSGAN——最小二乘GAN
因为传统的标准GAN生成的图片质量一般,为了提高生成质量,这篇论文的作者指出,标准GAN函数使用的交叉熵损失函数会导致那些在决策边界被分类为真的、但是仍然远离真实数据的假样本不会继续迭代,因此在训练生成器的时候容易发生梯度弥散。基于此,作者认为最小二乘损失函数能够惩罚远离决策边界的被样本,把远离决策边界的假样本拖进决策边界,从而提高生成图片的质量。论文中给出了图示:
也就是说,作者用平方误差的计算代替了原本的标准目标函数,因而从原本的minmax变成了minmin,都最小化损失函数:
min D V L S G A N ( D ) = 1 2 E x ∼ p d a t a ( x ) [ ( D ( x ) − b ) 2 ] + 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) − a ) 2 ] min G V L S G A N ( G ) = 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) − c ) 2 ] \begin{aligned} \min _{D} V_{\mathrm{LSGAN}}(D) & =\frac{1}{2} \mathbb{E}_{\boldsymbol{x} \sim p_{\mathrm{data}}(\boldsymbol{x})}\left[(D(\boldsymbol{x})-b)^{2}\right]+\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z}))-a)^{2}\right] \\ \min _{G} V_{\mathrm{LSGAN}}(G) & =\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z}))-c)^{2}\right] \end{aligned} DminVLSGAN(D)GminVLSGAN(G)=21Ex∼pdata(x)[(D(x)−b)2]+21Ez∼pz(z)[(D(G(z))−a)2]=21Ez∼pz(z)[(D(G(z))−c)2]
对于a,b,c的取值问题,作者提出了两种方案:
(1)使 b - c = 1,b - a = 2,文中的例子为:
min D V L S G A N ( D ) = 1 2 E x ∼ p data ( x ) [ ( D ( x ) − 1 ) 2 ] + 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) + 1 ) 2 ] min G V L S G A N ( G ) = 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) ) 2 ] . \begin{array}{l} \min _{D} V_{\mathrm{LSGAN}}(D)=\frac{1}{2} \mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}\left[(D(\boldsymbol{x})-1)^{2}\right]+\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z}))+1)^{2}\right] \\ \min _{G} V_{\mathrm{LSGAN}}(G)=\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z})))^{2}\right] . \end{array} minDVLSGAN(D)=21Ex∼pdata (x)[(D(x)−1)2]+21Ez∼pz(z)[(D(G(z))+1)2]minGVLSGAN(G)=21Ez∼pz(z)[(D(G(z)))2].
(2)令c = b,使用0-1标签:
min D V L S G A N ( D ) = 1 2 E x ∼ p d a t a ( x ) [ ( D ( x ) − 1 ) 2 ] + 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) ) 2 ] min G V L S G A N ( G ) = 1 2 E z ∼ p z ( z ) [ ( D ( G ( z ) ) − 1 ) 2 ] . \begin{aligned} \min _{D} V_{\mathrm{LSGAN}}(D) & =\frac{1}{2} \mathbb{E}_{\boldsymbol{x} \sim p_{\mathrm{data}}(\boldsymbol{x})}\left[(D(\boldsymbol{x})-1)^{2}\right]+\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z})))^{2}\right] \\ \min _{G} V_{\mathrm{LSGAN}}(G) & =\frac{1}{2} \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}\left[(D(G(\boldsymbol{z}))-1)^{2}\right] . \end{aligned} DminVLSGAN(D)GminVLSGAN(G)=21Ex∼pdata(x)[(D(x)−1)2]+21Ez∼pz(z)[(D(G(z)))2]=21Ez∼pz(z)[(D(G(z))−1)2].
EnlightenGAN的判别器、生成器损失函数
在EnlightenGAN的训练中,作者借鉴了相对判别器的思想,再引入最小二乘LSGAN的思路,得到了需要最小化的三个损失函数:
(1)全局判别器和生成器损失
L D Global = E x r ∼ P real [ ( D R a ( x r , x f ) − 1 ) 2 ] + E x f ∼ P fake [ D R a ( x f , x r ) 2 ] , L G Global = E x f ∼ P fake [ ( D R a ( x f , x r ) − 1 ) 2 ] + E x r ∼ P real [ D R a ( x r , x f ) 2 ] , \begin{aligned} \mathcal{L}_{D}^{\text {Global }}= & \mathbb{E}_{x_{r} \sim \mathbb{P}_{\text {real }}}\left[\left(D_{R a}\left(x_{r}, x_{f}\right)-1\right)^{2}\right] \\ & +\mathbb{E}_{x_{f} \sim \mathbb{P}_{\text {fake }}}\left[D_{R a}\left(x_{f}, x_{r}\right)^{2}\right], \\ \mathcal{L}_{G}^{\text {Global }}= & \mathbb{E}_{x_{f} \sim \mathbb{P}_{\text {fake }}}\left[\left(D_{R a}\left(x_{f}, x_{r}\right)-1\right)^{2}\right] \\ & +\mathbb{E}_{x_{r} \sim \mathbb{P}_{\text {real }}}\left[D_{R a}\left(x_{r}, x_{f}\right)^{2}\right], \end{aligned} LDGlobal =LGGlobal =Exr∼Preal [(DRa(xr,xf)−1)2]+Exf∼Pfake [DRa(xf,xr)2],Exf∼Pfake [(DRa(xf,xr)−1)2]+Exr∼Preal [DRa(xr,xf)2],
(2)局部判别器和生成器损失
L D Local = E x r ∼ P real-patches [ ( D ( x r ) − 1 ) 2 ] + E x f ∼ P fake-patches [ ( D ( x f ) − 0 ) 2 ] , L G Local = E x r ∼ P fake-patches [ ( D ( x f ) − 1 ) 2 ] , \begin{aligned} \mathcal{L}_{D}^{\text {Local }}= & \mathbb{E}_{x_{r} \sim \mathbb{P}_{\text {real-patches }}}\left[\left(D\left(x_{r}\right)-1\right)^{2}\right] \\ & +\mathbb{E}_{x_{f} \sim \mathbb{P}_{\text {fake-patches }}}\left[\left(D\left(x_{f}\right)-0\right)^{2}\right], \\ \mathcal{L}_{G}^{\text {Local }}= & \mathbb{E}_{x_{r} \sim \mathbb{P}_{\text {fake-patches }}}\left[\left(D\left(x_{f}\right)-1\right)^{2}\right], \end{aligned} LDLocal =LGLocal =Exr∼Preal-patches [(D(xr)−1)2]+Exf∼Pfake-patches [(D(xf)−0)2],Exr∼Pfake-patches [(D(xf)−1)2],
(2)自特征保留损失 (Self Feature Preserving Loss)
因为VGG的分类结果对亮度不敏感,所以这里作者和他的团队提出限制输入的低光图像与输出的对应增强图像之间的VGG特征距离来保证图像的内容特征在增强后尽量不丢失,这也是与未配对数据相对应的一个巧妙思路。
L S F P ( I L ) = 1 W i , j H i , j ∑ x = 1 W i , j ∑ y = 1 H i , j ( ϕ i , j ( I L ) − ϕ i , j ( G ( I L ) ) ) 2 \mathcal{L}_{S F P}\left(I^{L}\right)=\frac{1}{W_{i, j} H_{i, j}} \sum_{x=1}^{W_{i, j}} \sum_{y=1}^{H_{i, j}}\left(\phi_{i, j}\left(I^{L}\right)-\phi_{i, j}\left(G\left(I^{L}\right)\right)\right)^{2} LSFP(IL)=Wi,jHi,j1∑x=1Wi,j∑y=1Hi,j(ϕi,j(IL)−ϕi,j(G(IL)))2
其中, I L I^L IL表示输入的低光图像, G ( I L ) G\left(I^{L}\right) G(IL)表示生成器生成的增强图像, ϕ i , j \phi_{i, j} ϕi,j表示在ImageNet上预训练的VGG-16提取出来的特征图, i i i表示第 i i i个最大池化层, j j j表示第 i i i个最大池化层之后的第 j j j个卷积层;文中默认是 i = 5 , j = 1 i = 5,j = 1 i=5,j=1。 W i , j W_{i, j} Wi,j和 H i , j H_{i, j} Hi,j是提取出来的特征图尺寸大小。注意,这里同样对全局图像和从输入输出图像局部裁剪出来的patch进行计算,所以也有Global Loss和Local Loss。
(3)最终的损失
因此,最终的损失函数由上面的两部分组成:
Loss = L S F P Global + L S F P Local + L G Global + L G Local \text { Loss }=\mathcal{L}_{S F P}^{\text {Global }}+\mathcal{L}_{S F P}^{\text {Local }}+\mathcal{L}_{G}^{\text {Global }}+\mathcal{L}_{G}^{\text {Local }} Loss =LSFPGlobal +LSFPLocal +LGGlobal +LGLocal
消融实验
作者和他的团队还对EnlightenGAN模型做了消融实验,分别测试了去掉局部判别器和去掉注意力机制的结果,附上原文中的图:
二、 Zero-DCE
1. 思路概述
如果大家用过一些P图软件,就会知道我们如果要调整一张图片的亮度,会用到一个工具,里面起初是一条表示y = x的直线(也就是亮度不变),我们可以拖动这条线,让它变成一些曲线,这些曲线的功能就是将原图亮度映射到新图亮度。而Zero-DCE的关键思路,就是利用神经网络拟合出这样的一条亮度映射曲线,再结合原图就能得到一张亮度增强后的图像,而这个曲线的拟合是可导的,因此可以我们可以利用梯度下降法,使用深度卷积神经网络来学习这个曲线的参数,这个网络可以通过迭代去近似高阶的曲线,从而提高结果的准确性和鲁棒性。
作者在论文中总结了主要的三个贡献点:
(1)这是第一个不需要用到配对或不配对数据的弱光增强网络模型,因此可以不需要带标签的图像数据,这可以避免模型过拟合的风险,并且确保模型能够适用于各种各样的光照环境。
(2)该模型拟合出的曲线是随输入图像而改变的(image-specific),每个像素的亮度映射曲线都是量身定制的高阶曲线,这些高阶曲线可以通过不断迭代自身来得到。
(3)作者的团队展示了在没有参考图像的情况下,可以针对特定任务设计一个无参考损失函数来训练深度图像增强模型(该损失函数能够间接评估增强质量)。
2. 实现方法
在论文中,最重要的数学公式就是亮度映射曲线的公式,称为亮度增强曲线公式(Light-Enhancement Curve, LE-curve),公式如下:
L
E
(
I
(
x
)
;
α
)
=
I
(
x
)
+
α
I
(
x
)
(
1
−
I
(
x
)
)
L E(I(\mathbf{x}) ; \alpha)=I(\mathbf{x})+\alpha I(\mathbf{x})(1-I(\mathbf{x}))
LE(I(x);α)=I(x)+αI(x)(1−I(x))
其中,
α
\alpha
α取值范围为[ -1,1 ],是要学习的参数,
I
(
x
)
I(\mathbf{x})
I(x)是输入图像x坐标处的亮度值,
L
E
(
I
(
x
)
;
α
)
L E(I(\mathbf{x}) ; \alpha)
LE(I(x);α)就是提亮之后的亮度值。
我们可以发现,这个公式非常巧妙地满足以下要求:
(1)映射后曲线的亮度取值范围还是[0 , 1],而且0和1这两个端点映射前后不会有变化;
(2)这个曲线在定义域内是单调递增的,这一点很巧妙,确保了亮度一定是提升的;
(3)这个曲线是可导的;
在论文中可以看到,不同的
α
\alpha
α对应的曲线是这样的:
为什么图中写的是
α
1
\alpha_1
α1呢?这个1代表的是迭代的次数。在很多情况下,仅仅二次曲线是不够的,我们需要拟合出更复杂的曲线来提高效果,因此会对这个曲线函数进行迭代,也就是说,会出现:
L
E
1
(
x
)
=
I
(
x
)
+
α
1
I
(
x
)
(
1
−
I
(
x
)
)
L
E
2
(
x
)
=
L
E
1
(
x
)
+
α
2
L
E
1
(
x
)
(
1
−
L
E
1
(
x
)
)
⋮
L
E
n
(
x
)
=
L
E
n
−
1
(
x
)
+
α
n
L
E
n
−
1
(
x
)
(
1
−
L
E
n
−
1
(
x
)
)
\begin{array}{l} L E_{1}(\mathbf{x})=I(\mathbf{x})+\alpha_{1} I(\mathbf{x})(1-I(\mathbf{x})) \\ L E_{2}(\mathbf{x})=L E_{1}(\mathbf{x})+\alpha_{2} L E_{1}(\mathbf{x})\left(1-L E_{1}(\mathbf{x})\right)\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \vdots\\ L E_{n}(\mathbf{x})=L E_{n-1}(\mathbf{x})+\alpha_{n} L E_{n-1}(\mathbf{x})\left(1-L E_{n-1}(\mathbf{x})\right) \end{array}
LE1(x)=I(x)+α1I(x)(1−I(x))LE2(x)=LE1(x)+α2LE1(x)(1−LE1(x)) ⋮LEn(x)=LEn−1(x)+αnLEn−1(x)(1−LEn−1(x))
因为在这个方法中,对于每一个像素都有定制的曲线,所以可以再表示为:
L
E
n
(
x
)
=
L
E
n
−
1
(
x
)
+
A
n
(
x
)
L
E
n
−
1
(
x
)
(
1
−
L
E
n
−
1
(
x
)
)
L E_{n}(\mathbf{x})=L E_{n-1}(\mathbf{x})+\mathcal{A}_{n}(\mathbf{x}) L E_{n-1}(\mathbf{x})\left(1-L E_{n-1}(\mathbf{x})\right)
LEn(x)=LEn−1(x)+An(x)LEn−1(x)(1−LEn−1(x))
论文中给出了四次迭代α取值不同对应的曲线(前三次的α都为-1,只有
α
4
\alpha_4
α4不同):
还有一个需要注意的就是,这个方法是对RGB通道分开处理的,论文中给出了一个映射的范例,其中对所有迭代轮次中的α的值进行了平均处理并归一化到[ 0,1 ],最后用热图呈现:
作者用一个网络来表达这个曲线映射模型—— Deep Curve Estimation Network (DCE-Net),整体的模型架构如下:
这里简单介绍以下DCE-Net,它由六层卷积层和一层输出层组成,除了最后为了限制输出范围采用tanh激活函数外,其他都是使用ReLu激活函数。特殊之处就是这几个卷积层采用了对称跳连的结构(skip-connect),三四层拼接后往后输出,二五层拼接后往后输出,一六层拼接后往后输出,最后的输出层是3 * 8 = 24个通道,3就是RGB三分量,他们分别对应8个通道,也就对应着这个映射曲线是迭代了8次(8个α),每个像素对应着24个参数。
3. 损失函数
接下来要介绍的是另一个关键点,就是无参考的损失函数,论文中一共定义了四种损失函数。
(1)Spatial Consistency Loss ( L s p a L_{spa} Lspa)
这个损失,是用来衡量增强亮度后相邻区域像素值之间的差异的变化,也就是说我们希望在增强亮度前后相邻区域的像素值的关系尽量保持不变,维持空间上的一致性。
这个损失的计算方法为,将图片划分为若干个局部区域,然后计算每个局部区域和它的四邻域的像素值差异,最后求均值,公式如下:
L
s
p
a
=
1
K
∑
i
=
1
K
∑
j
∈
Ω
(
i
)
(
∣
(
Y
i
−
Y
j
)
∣
−
∣
(
I
i
−
I
j
)
∣
)
2
L_{s p a}=\frac{1}{K} \sum_{i=1}^{K} \sum_{j \in \Omega(i)}\left(\left|\left(Y_{i}-Y_{j}\right)\right|-\left|\left(I_{i}-I_{j}\right)\right|\right)^{2}
Lspa=K1∑i=1K∑j∈Ω(i)(∣(Yi−Yj)∣−∣(Ii−Ij)∣)2
其中,
K
K
K为局部区域的个数,
Ω
(
i
)
\Omega(i)
Ω(i)为上、下、左、右四邻域,
Y
Y
Y表示增强图,
I
I
I表示原图,然后
Y
i
Y_i
Yi和
I
i
I_i
Ii为每个局部区域像素的平均值。在实际操作时,作者设置的局部区域是4 * 4大小的,在模型中通过平均池化层和卷积层来实现。
(2)Exposure Control Loss ( L e x p L_{exp} Lexp)
这个损失,是用来限制图片的曝光度的,也就是说我们不希望调整后的亮度值太过极端,所以先设置一个中间量,计算亮度值与这个中间量的差异,这里也是取局部区域进行计算,取的是16 * 16大小的区域。
公式如下:
L
e
x
p
=
1
M
∑
k
=
1
M
∣
Y
k
−
E
∣
L_{e x p}=\frac{1}{M} \sum_{k=1}^{M}\left|Y_{k}-E\right|
Lexp=M1∑k=1M∣Yk−E∣
M就是局部区域的个数。
(3)Color Constancy Loss ( L c o l L_{col} Lcol)
这个损失,是根据一个结论来衡量色彩是否正常。根据灰度世界假设(Gray-World color constancy hypothesis),对于一幅色彩丰富的图像,其R,G,B 三个色彩分量的平均值趋于同一灰度值 K。
公式如下:
L
c
o
l
=
∑
∀
(
p
,
q
)
∈
ε
(
J
p
−
J
q
)
2
,
ε
=
{
(
R
,
G
)
,
(
R
,
B
)
,
(
G
,
B
)
}
L_{c o l}=\sum_{\forall(p, q) \in \varepsilon}\left(J^{p}-J^{q}\right)^{2}, \varepsilon=\{(R, G),(R, B),(G, B)\}
Lcol=∑∀(p,q)∈ε(Jp−Jq)2,ε={(R,G),(R,B),(G,B)}
(p,q)就是RGB三个通道两两配对,J表示某通道像素平均值。
(4)Illumination Smoothness Loss ( L L_{} L)
这个损失,是为了保持像素间的单调性,从而保证整个图像的平滑和空间连续性,方法是在每个曲线参数图
A
\mathcal{A}
A上添加一个光照平滑损失,限制水平方向和垂直方向上的梯度,公式如下:
L
t
v
A
=
1
N
∑
n
=
1
N
∑
c
∈
ξ
(
∣
∇
x
A
n
c
∣
+
∇
y
A
n
c
∣
)
2
,
ξ
=
{
R
,
G
,
B
}
L_{t v_{\mathcal{A}}}=\frac{1}{N} \sum_{n=1}^{N} \sum_{c \in \xi}\left(\left|\nabla_{x} \mathcal{A}_{n}^{c}\right|+\nabla_{y} \mathcal{A}_{n}^{c} \mid\right)^{2}, \xi=\{R, G, B\}
LtvA=N1∑n=1N∑c∈ξ(∣∇xAnc∣+∇yAnc∣)2,ξ={R,G,B}
其中,N为迭代数量,
A
n
\mathcal{A}_n
An是某轮迭代对应的参数图,
∇
x
\nabla_{x}
∇x和
∇
y
\nabla_{y}
∇y是水平方向和垂直方向上的梯度。
因此,最后的损失函数为:
L
total
=
L
s
p
a
+
L
e
x
p
+
W
c
o
l
L
c
o
l
+
W
t
v
A
L
t
v
A
L_{\text {total }}=L_{s p a}+L_{e x p}+W_{c o l} L_{c o l}+W_{t v_{\mathcal{A}}} L_{t v_{\mathcal{A}}}
Ltotal =Lspa+Lexp+WcolLcol+WtvALtvA
可以看到,后两个损失是带有权重的,一般情况下分别设为0.5,20.
参考文献
[1] Jiang, Yifan, et al. “Enlightengan: Deep light enhancement without paired supervision.” IEEE transactions on image processing 30 (2021): 2340-2349.
[2] Mao, Xudong, et al. “Least squares generative adversarial networks.” Proceedings of the IEEE international conference on computer vision. 2017.
[3] Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in neural information processing systems 27 (2014).
[4] Jolicoeur-Martineau, Alexia. “The relativistic discriminator: a key element missing from standard GAN.” arv preprint arv:1807.00734 (2018).
[5] Guo, Chunle, et al. “Zero-reference deep curve estimation for low-light image enhancement.” Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2020.