这两天看了下 @墨天明 大佬推荐的去年的最新工作,论文全称叫做Physics-guided Noise Neural Proxy for Practical Low-light Raw Image Denoising,是噪声建模方面的工作,自己之前的噪声建模就是参考的大佬的ELD以及PMN,看见新工作立马来拜读一下。
看本博客之前还是建议大家阅读一下先前的两篇工作
ELD:
论文解读:
PMN:
论文名称:
论文解读:
特别是PMN,好吧不得不承认因为ELD我当时没看完,PMN主要有个很大的优点,它把噪声建模,sensor生成的噪声图像有用哪些种类的噪声,这些基本知识讲的比较清楚(不知道是不是因为版面不够专门加的hh),娓娓道来的,让当时还是一个什么都不懂的小白的我居然觉得自己看懂了。写作真的有点东西的,推荐大家看一下,在PNNP里,这部分的介绍就被简化了许多。
言归正传,回到本篇的主角
PNNP:
故事会环节
论文首先讲了一下去噪工作很重要的万能开头,然后说了一下基于学习的去噪方法现在大行其道,但是其中有一点问题,就是收集大规模的数据集很麻烦。于是,用噪声模型的合成数据训练就成了替代方案。(写作tips:嗅觉敏锐的读者看了这开头就应该知道作者这篇论文应该是用基于学习的去噪方法做主线,然后用合成噪声简化数据集收集过程的实验路线了,如果不是这么写的,那这段就成废话了。)
然后作者开始写噪声建模的优缺点,优点就是对于信号相关的噪声,建模很准,但是对于信号无关的噪声,就很难建模了。同样的,对于基于学习的噪声建模,对于这种信号无关的噪声就学的比较好,但是现在的基于学习的方法基本都基于pair对,收集困难,同时噪声太复杂会让网络很难学。(这里就是经典的现在的方法有啥问题,接下来要说要怎么解决了。不过我对于基于学习的噪声建模其实还是不大理解的,因为在我自己的视野里,基于学习的噪声建模要pair对,那有了pair对直接训降噪不就完了,可能我理解的基于学习的建模主要是用来扩充数据集,没细致了解过,不是很清楚到底咋做的)
于是作者提出了自己的方法:收集数据集困难,那就直接镜头一盖拍黑帧,正好,黑帧就是信号无关的信号,是基于学习的方法的强项,那让模型学黑帧不就齐活了?作者提出了PNNP,先解耦复杂的噪声,约束优化过程,然后设计了一个loss来监督学习。
Method
PND
作者首先介绍了一下噪声到底都有啥,但是这里我感觉没有PMN讲的清楚,就不具体说了,反正简单来说,噪声分成信号相关噪声和信号无关噪声。信号无关噪声也就是暗帧,又可以分成3个噪声-帧噪声,行列噪声,像素噪声

其中,帧噪声用逐帧解耦可以去除,行列噪声可以用band-wise解耦去除,这样就只剩下像素噪声了。然后由于低bit量化,这个像素噪声会有变化,又用了高比特重构来还原真实的像素噪声。最后得到一个像素噪声的gt。
用这个策略之后,相当于模型可以少学习泊松高斯和blc以及fpn等噪声,专注于学这个像素噪声,降低了学习难度。这里呼应了作者在intro中提到的基于学习的建模的难点2,噪声太复杂比较难学。
PPM
在得到了像素噪声的gt之后,就开始网络设计了

作者设计了两个一毛一样的支路,区别在于一个支路有Dgain增益,另一个Dgain=1。分别输入两个高斯噪声,这两个输入之和就是像素噪声。然后作者解释了一下为啥这么设计,但是 说实话,我其实没看懂为什么两个支路相加的结果是像素噪声?作者好像并没有在这里提供解释,只是提及了为什么一个有Dgain一个没Dgain,如果是我的话,我会非常希望在这里能解释一下为什么两条支路的和是像素噪声的。
CDF and quantile
作者在下一部分,设计了两个loss来监督学习,一个是Quantile,另一个是CDF,分别是对概率分布的分位约束,以及随机变量取值小于给定值的概率。这里有一点小缺憾就是作者说了CDF的设计原因,但是对于为什么有个quantile loss 好像并没有明确说明,大部分的篇幅在说这两个loss怎么算,我个人感觉可能加上quantile的设计原因,以及放一个伪代码可能会更清晰一点,当然,最好还是直接代码给我copy一下hhh


实验
实验说实话一般来说我感觉没啥可讲的,所有的论文都是花式说自己的效果好,唯二让我比较关注的就是关于双分支的消融实验以及loss的消融实验,从结果上来看,双分支的效果很好,比单分支好很多,但是我不确定这个和数据的采集有没有关系,以及具体保留的是哪个分支?因为在我认知里,这应该取决于gt到底是什么dgain采集的,如果是dgain=1采集的黑帧,和dgain=n采集的黑帧,其效果的应该是某一个分支吧。如果把另外一个分支去除了,效果会差这么多么?另一个就是关于CDF的消融,看实验结果,貌似主要起效果的是quantile loss,去除了cdf之后效果差距不大,但是整个loss的method中,大量篇幅其实是在写CDF,感觉有点主次不清,是不是在loss模块可以更多的介绍一下quantile loss呢?
总结
看完论文感觉还是收益良多的,因为自己其实在工作中看见形形色色的基于学习的方法建模,也会好奇是不是真的有效,采集了这么多数据那为啥不直接训?因为方法验证链路太久其实至今没试过基于学习的方法(一直蠢蠢欲动,一直没动过)大佬给出了一种,不用采集大量数据,对着黑帧拍的方法,把复杂的噪声直接解耦,给我眼前一亮的感觉,比我之前闲着自己设计的学习的方法好像简单多了,必须改天闲了试一下。