返回文章列表

Introduction

在工作之后接触的主要任务就是做图像的降噪任务,然后发现一个很让人痛苦的点,就是工业场景中的降噪,和论文中的降噪,存在非常大的割裂,这其中的割裂之大甚至感觉到了两个领域,导致自己吃了不少亏。所以准备单开一章,记录一下自己对于图像降噪的理解和认识,常看常新。
图像降噪在学术届,其实看的最多的还是设计模型,比如NTIRE年年都有low-level的比赛,清一色的u-net架构+transformer变种。各种会议各种降噪的模型,例如CBDNetHWformerNAFNet之类的层出不穷,PSNR一个比一个高。后续如果有时间的话我可能会把一些著名的模型单独写一些,但是说实话,各种架构论文的效果确实不大。学术界做的第二多的,就是各种自监督,无监督的降噪方法,这种也基本没啥用,因为工业中基本不会有给你自监督的空间,能有训练数据谁去做自监督。最近看很多论文,自监督,量化,蒸馏,这些论文的指标做出来结果比全监督,浮点,教师模型性能还高,说出去自己信么?反正我是一个?就打上来了,很难相信。
而图像降噪在工业届,面临的问题其实和学术界基本毫无关系,我大致罗列一些我自己在工作过程中遇到的问题,大家可以看一下在论文里有没有提出过解决的办法的,也可能是我从业不久看的论文还不够多。
  • Q1:图像采集问题
  • Q2:噪声的建模问题
  • Q3:评价指标问题
  • Q4:算力限制
  • Q5:Sensor链路问题

Q1:图像采集问题

是的,在图像降噪,或者说绝大部分的low-level中,都存在论文不会说,在high-level不会遇到的问题,就是图像采集。众所周知,数据是深度学习最重要的东西,然而在实际的工作中,就连数据的采集都有一堆问题,随便说几个
  • 模型的泛化性怎么保证?
  • gt图像怎么获取?
  • 噪声图像怎么获取?
单说泛化性,训练分类网络的时候,我要检测xxx就给模型使劲的塞各种xxx就行了,但是降噪任务中最大的特点就是,需要cover任意场景,毕竟用户要拍什么,不知道。用户在什么噪声强度下拍,不知道。这就需要数据覆盖各种场景和各种噪声强度,但是如果用户要拍海里的,天上的,难道上天下海去给他拍数据集么,显然不靠谱,所以只能堆一堆数据,期望模型能学习到任意场景是什么意思,但是根据我在做检测的经验,这种期望可能只是期望,真遇到复杂的,抽象的场景可能还是会出问题。
其次是gt图像,众所周知深度学习的上限是数据的上限,你给的gt是啥样,代表模型最多能学成啥样。然而,在high-level当中,图片满大街都是,拍了下了标注就完了,但是在降噪任务中存在一个问题,你直接拍的数据就是传统的成像链路的结果,但是使用AI的目标就是超越传统,如果上限和传统的算法一样,那没有做的意义。如何获得一个高质量的gt图像,本身就是问题,特别是很多论文,传统的链路都表明,降噪最好在bayer域做,但是人类是看不懂bayer域的,这中间又存在一个gap,如何获得高质量的gt图像已经面临一个困难了(有想过能不能用生成模型生成,但是现在的AIGC油画涂抹感太重了,说实话和现实的图像还是能一眼看出区别来,训出来的模型也会有点油画的感觉)。
相比gt,更难的还有一个是噪声图像,噪声图像哪儿来呢?最简单的思路,就算拿两台相机一起拍,一个长曝光算gt,一个短曝光算含噪图像,相机位置不一样怎么做到图像一样?再加个配准算法叠起来那又增加了gap,而且过于复杂了,所以一般被认为是在gt图像上对噪声进行建模,但是这又会引申出下一个问题,噪声咋建模?

Q2:噪声的建模问题

噪声的建模问题其实一直以来都是一个大问题,然而很少有人谈。一个错误的噪声建模,就会让你在测试的时候自我感觉非常良好,图像非常干净,结果一上实机检测就歇菜,因为你模型训练的和真实的本来就是两个东西。
论文中,90%都是直接用高斯泊松噪声进行噪声建模,画了一个不存在的靶子射箭。也许可能会有人说这是因为人家的motivation不是建模,统一的标准结果更好就行了。这时候就不得不提一下任务问题了,大家应该都做过图像的分类检测分割任务,不同的模型对于不同的类别的检测能力是不一样的,所以很难说如果做下游任务的时候,一个在公开的xx数据集上性能很好的模型,在下游那个具体类别上也效果很好。而去噪网络也存在这个问题,你的数据不同,噪声建模不同,模型对对应的噪声建模的适应性也不同,很难说你的模型在高斯泊松噪声上建模好,对于真实噪声的特征提取就很好了。
除了90%不管不顾直接用高斯泊松噪声的,还有9.9%的论文意识到了这个问题,于是他们提出了各种自监督,噪声适应算法,让模型能cover不同类型的噪声,只能说想的很美好,但是属于曲线救国,这就和降噪任务的时候最大的难点在于细节和噪声的trade-off问题,这种噪声适应的算法基本都存在降噪能力和适应能力的trade-off,终究比不上正确建模后训练的性能。
只有可能0.1%的论文,会研究如何进行正确的噪声建模,例如:Physics-Based Noise Modeling for Extreme Low-Light Photography,Learnability Enhancement for Low-light Raw Denoising: Where Paired Real Data Meets Noise Modeling。这些论文在努力的研究和设计真实的噪声建模方式,力图还原最真实的噪声,还是相当有参考价值的,就是只能说,还得等待大佬们的研究,这些噪声建模方式和实际噪声显然还是有差距的。

Q3:评价指标问题

没错,在low-level领域里,其实就连评价指标都很成问题,high-level的指标,准确率,IOU,再清晰明了不过了。然而在low-level中,一般来说指标是PSNR,然而这个指标,问题很大,根据我自己的经验,PSNR越高,一般越模糊,然而很少有客户可以接受糊的东西,所以在测试中一般就是训完看结果,连指标都懒得算。
学术界也思考过这个问题,于是提出了感知loss,要用感知loss来解决这个问题, @黄哲威 hzwer也在回答里提过可以用lpips,我之前试过一次,由于显卡资源有限,感觉这个算的有点慢就还是直接肉眼看了。而且由于我自己的任务算力很小,铁定降噪是降低不干净的,在验收的时候,说白了还是人眼看的,但是人眼的关注重点其实并不相同,有的人关注边缘轮廓是否清晰,有的人关注降噪降的干净与否,有的人考虑的是平坦的地方是不是真的足够平坦。你和别人说我的指标到了xxx,除了写论文的时候,实际场景里没有人会理你的PSNR是多少的。最终结果还是看人的主观认知,这也就导致了模型的训练方向,监督函数,优化模式都存在问题。例如我经此遇到的事儿,训练结果有点网格,有拉链,动态有拖影,有紫边,这一系列的bug,反应在pipeline里,甚至很多时候都不知道是从哪里来的,更别说优化了。

Q4:算力限制

由于降噪任务一般都是被使用在成像之前的ISP链路当中,所以一般都是作为边缘设备的部署上,例如单反相机,手机相机,车载影像。这就导致降噪任务的算力其实限制非常大,毕竟效果再好如果只能在A100上跑毫无意义。我问过不少同行一般算力都是在0.4~3T之间,而且硬件的限制也非常大,绝大部分的算子都不支持,除非很大的公司可以直接和硬件厂商谈算子支持。直接用市面上的硬件现有的论文大部分都落不了,确实巧妇难为无米之炊。所以对轻量化也有各种挑战,基本量化蒸馏剪枝都是必须上的东西,但是low-level对于这些轻量化操作也比high-level来的难的多,这又是另一个话题了,以后有机会专门再开一章。

Q5:Sensor链路问题

因为图像去噪其实是整个ISP链路中的一环,在去噪前和去噪后还有很多环节,那些环节都可能导致输入Denoising的数据形式不一样,特别是在自己测试和调整的时候,一个不小心整个数据都会出大问题(无数次测试实验发现五花八门奇奇怪怪颜色的图的路过)而且最终结果需要考虑整个ISP链路,例如有些降噪效果不行的地方,其实是可以在后续链路弥补的,那就可以选择不优化这个地方而交给后续链路。而有些是后续链路无法弥补的,则必须修改模型优化。诸如此类的链路问题是在做high-level任务的时候从来没遇到过的。

小结

不小心就写了这么多字,本来打算一次性把问题和看法都写了的,暂时就这样把,以后有空再来填坑。