denoising diffusion post-processing for low-light image enhancement 论文阅读笔记
- 这是arxiv上一篇做denoising diffusion的文章,用来做low-light image enhancement的post-processing,感觉可能是已经投稿还未发表
diffusion model 背景
- diffusion model是比较多公式的一个模型,但是其实不难,话不多说,直接上公式:
- diffusion model建模了一个马尔科夫链,从xt−1x_{t-1}xt−1到xtx_txt的过程建模成一个高斯概率模型,从而给定x0x_0x0,x1x_1x1到xTx_TxT的过程是高斯概率模型的累乘:
- 高斯乘以高斯还是高斯,那么第一个式子可以展开并化简,同时把x1:Tx_{1:T}x1:T拆开,具体公式看diffusion model的论文,这里不展开,反正一系列推导后,给定x0x_0x0,xtx_txt的概率分布是个高斯概率分布,进行一些变量代换使得公式更加简洁可以得到如下的式子:
- 其中,αt:=1−βt\\alpha_t:=1-\\beta_tαt:=1−βt, α‾t:=∏s=1tαs\\overline \\alpha_t:=\\prod_{s=1}^t \\alpha_sαt:=∏s=1tαs
- 这是个高斯模型,那么我已知x0x_0x0想采样得到xtx_txt可以通过向均值加高斯噪声来实现:
- 这里的ϵ\\epsilonϵ是0均值一方差的标准高斯噪声
- 我们可以看到,这个公式,当ttt越大时,α‾t\\overline \\alpha_tαt由于是一系列小于1的数的累乘,是会越来越小的,所以第一项占比越来越小,第二项占比越来越大。当x0x_0x0是一张干净的图像时,随着t的增大,xtx_txt中有效信号的成分越来越小,而噪声成分越来越大。直到ttt特别大的时候,假设我们设了个最大值TTT,这时候xTx_TxT几乎就是一张完全的噪声图,满足0均值1方差的高斯噪声。
- 前面讲的就是退化过程,一张干净的图片x0x_0x0是怎么一步步退化成一张噪声图xTx_TxT的。我们希望利用网络从xtx_{t}xt预测xt−1x_{t-1}xt−1,从而实现一个逆过程,把一张噪声图一步步变成一张干净的图像。给定xtx_{t}xt,xt−1x_{t-1}xt−1也是一个高斯分布,但是均值从网络中得出,方差是已知的。但是我们不需要管高斯分布也不需要管方差,因为我们不采样,我们直接取概率分布中的最大概率的点,也就是高斯分布的均值。
- 根据不同的diffusion 模型有不同的做法,这篇文章用的是denoising diffusion,模型并不直接预测均值,而是预测噪声,其实这是等效的。前面的推导中,我们可以通过将x0x_0x0和噪声ϵ\\epsilonϵ进行加权平均来获得xtx_txt,那么我们也可以通过预测从x0x_{0}x0到xtx_txt的过程中等效添加的高斯噪声来从xtx_txt逆推到x0x_{0}x0,从而预测噪声的模型的目标函数如下所示:
- 也就是先前向加噪,并记录下每次添加的噪声ϵ\\epsilonϵ和得到的xtx_txt,然后计算模型预测的噪声和真实噪声之间的差。
- 当模型训练完成,给定一张带噪图片xtx_txt,就可以通过如下公式对干净的图片x0x_0x0进行估计:
- 从网络的预测公式ϵθ(xt,t,c)\\epsilon_\\theta(x_t, t, c)ϵθ(xt,t,c)可以看出网络的输入由三部分组成,第一部分是带噪图片xtx_txt,很好理解,用卷积神经网络处理即可,第二部分的ttt是标量输入,就需要特殊处理的,这里用的是sinusoidal positional embeddings来处理生成向量,从而可以用全连接神经网络进一步处理。而ccc则根据任务的不同各自定义了。文章这里做的是暗图增强,所以ccc是暗图,x0x_0x0是亮图。
本文方法
- 暗图增强模型对暗图增强后通常会同时把噪声也增强出来,所以本文提出用denoising diffusion model来对增强结果进行去噪。diffusion网络先是在正常光照图片上训练,网络的输入是暗图(条件ccc)和diffusion对亮图加噪的图片(xtx_txt)和ttt,输出是xtx_txt上的噪声。测试的时候则输入暗图(条件ccc)和暗图增强网络的增强结果(xtx_txt)和ttt,网络会输出增强结果上的噪声。
- 注意测试的时候因为xtx_txt并不是真的用diffusion model加噪生成的,所以其实我们不知道ttt是多少,所以只能通过实验确定什么样的ttt比较好,实验发现ttt太大时,会把整张图片原封不动预测为噪声(因为模型就认为输入中噪声占比已经很大了),而ttt太小时文章说会过度估计噪声,但并没有给出具体解释,我也想不通。反正最后确认了设为300是最好的。
- 预测出噪声后,就可以根据diffusion model的公式把噪声去掉咯:
- 但是这里通过实验发现,这个公式中的时间ttt(即sss)最好是设得比预测噪声时的ttt小一点,这样效果更好。总之,前面的ttt可以固定为300,然后根据噪声水平的不同和出来的效果,可以灵活调整sss使得结果更光滑或者锐利。
总结
- 文章提供了一个思路,我觉得是有意思的。但是最后的时间步长的设定解释得不清楚,而且通过实验确定而非通过理论推导也让我觉得有点不舒服。如果能更严谨一点就更好了,可以看到还是有改进空间的。