- 这是CVPR2021的一篇暗光增强的论文
Retinex增强和去噪部分
- 第一部分的核心公式是一种retinex公式(用于暗图增强的retinex公式有几种类型,虽然本质一样但是对于各个分量的定义不一样): y = x ⊗ t y=x\otimes t y=x⊗t,其中x是正常光照图片(0-1),t是暗图中的亮度分量(小于1),y则是暗图(0-1)。
- 之所以是这样的定义,可以这么理解,基于的一个假设是认为亮图的亮度分量是1,而乘以一个小于1的亮度分量使得图片变暗,也即认为暗图上的亮度分量是小于1的,从而乘上之后成为暗图。那么在给定一张暗图y的情况下,估计亮图x可以通过估计暗图上的亮度分量t来实现,从而增强结果 x = y ⊘ t x=y\oslash t x=y⊘t
- 从而第一个模块就是给定暗图y估计其亮度分量t,那么基于第二个先验:亮图上最大像素值是1,可以得知,我们可以通过暗图的最大像素值来粗略地估计暗图的亮度分量。
- 但这么估计肯定太粗略了,要做修正。文章用一个网络来预测修正值,把粗略的估计结果 t ^ k \hat t_k t^k减掉修正值即可得到修正后的亮图分量估计。
- 这个模块是以循环的方式进行的,也即每次迭代都会对输入估计一个粗略的亮度分量,然后用网络进行修正,得到本轮的增强结果,再将增强结果作为新的输入送进下一轮迭代。
- 对上面这个描述补充一些细节:
- 首先第一轮迭代的输入理所当然就是最初的暗图;
- 其次,除了第一轮之外,后面的每轮迭代的粗略估计则不仅仅是输入的最大值,还要减去一个修正项以抑制不断迭代过程中可能带来的过曝光,这个修正项就是权重 γ \gamma γ乘以(本轮的输入减去最初的暗图),也即不希望增强结果比原图亮太多;
- 第三,修正网络的输入,从公式里看不出是什么,既有 t k t_k tk也有 t t t,从框图里还有 t ^ k \hat t_k t^k,最后我在代码中确认就是 t ^ k \hat t_k t^k,也即网络的输入仅仅是用max粗略估计的亮度分量,所以我感觉这个网络可能只起个平滑或者顶多再加个亮度平移作用。
- 第四个细节是网络的损失函数,看公式看图都看不出来,看代码发现跟公式和图片都不一样,代码里是暗图和最后一次迭代输出的t算L2损失,再加上最后一次迭代输出的t的tvloss。所以,3.1.1提到的公式以及论文框架图里画的公式估计只是一个理论推导,并不是实际应用的公式。平滑损失我还能理解,但是暗图和t算L2损失我是完全不能理解,并且在3.2.3部分提到的损失函数也和代码里的这个损失函数不同,3.2.3的损失函数是估计的亮度和第一次粗略估计的亮度之间算损失,这个我还能理解,代码里的问题很大。
- 第五个细节是,不同迭代中的网络其实是不同的网络,并不共享参数,这点下面的去噪模块也一样。
- 第二部分是去噪模块。,用网络估计一个噪声图,前面的增强结果的图片减去噪声图即可得到去噪结果。该模块也采取循环的模式,去噪结果作为下一次去噪的输入来估计新的噪声图。论文中提到这里的损失函数和增强网络的损失函数是一样的,从代码中可以看出是去噪结果的平滑损失和去噪结果与原图的L2损失(但是乘了1e-6)。
结构搜索部分
- 网络结构被预定义为一个一个有向无环图,由五个节点组成,每个节点都和下一个节点和最终节点相连,出度为2入度为1,除了最后一个节点:
- 这里的有向边即为可选的元模块,包括不同size 的卷积等操作。通过NAS模块来对每个节点的操作进行择优,得到最后的网络结构。
- 结构搜索的论文我还没看,文中也没有涉及这部分细节,只说增强网络和去噪网络的搜索是交替进行的,相当于先优化增强网络的结构,再优化去噪网络的结构,然后再优化增强网络的结构,递归地进行优化。
实验结果
- 虽然看损失函数有我不能理解的地方,但是实验结果上看还不错,相比其他网络结构,去噪效果很明显:
- 这个循环去噪模块从消融实验看确实是起去噪效果的,有空探究下为什么这样简单的去噪模块加这样不合理的去噪损失可以去噪: