ASCII码 ASCII码

小哥质疑谷歌顶会论文有错 并且拿出了复现代码来证明

发布于:2021-03-04 14:41:13  栏目:技术文档

  来源:量子位(ID:QbitAI)

  文/萧箫发自凹非寺

  景色很好看,可是手机相机分辨率太低,照不出清晰的照片?

  没关系,试试这个超分辨率算法,让 AI“自动”帮你调整分辨率。

  经过算法调整后,照片几乎立刻就清晰了数倍,连角落里模糊的文字都看得清:

  这是来自谷歌的一个手机超分辨率算法,此前登上过 SIGGRAPH 2019 顶会,阐述的是自家手机 Pixel 3 中使用的超分技术。

  现在,这个算法确实被复现了出来,然而,方法却与论文不全一致(复现的作者 Michael Kunz 认为,论文有些地方写错了)。

  来看看这是怎么回事。

  多帧合一帧,效果更清晰

  论文中,这个用手机实现超分辨率的原理,是这样的:

  在用手机拍照的过程中,手部会出现轻微的震颤。


△手抖示例

  这导致在连续拍摄同一景象的过程中,每张照片都会有一个微小的偏移量,这些小偏移量,恰好能提供超分辨率所需要的亚像素信息。

  然后,将这些彼此之间略有差异的图像帧,进行对齐、融合,就可以得到一张每个像素位置都有红、绿、蓝三通道值的图像。

  具体算法是这样的:

  首先,获取多帧 RAW 图像;然后,选择其中一帧作为基准帧,其余图像进行局部对齐,并通过核回归,估计每一帧对结果的局部贡献度;最后,分成 RGB 三种颜色通道,将贡献进行叠加。

  在训练过程中,图像的局部特征会对核形状进行调整,并对采样值进行加权。

  最后,对每个颜色通道进行归一化,获得最后的 RGB 图像。

  整体来说,就是用多帧融合算法,代替了去马赛克的传统超分辨率算法。

  然而,听起来非常完美的算法,有人在复现的过程中,却发现了一些问题。

  实际复现并不容易

  项目的作者表示,在复现这篇论文的过程中,发现了一些 bug,但目前论文原作者、发行方都还没回应他。

  再来看看这个算法:

  首先,在图像帧的获取上,如果采用谷歌相机的单反模式进行拍摄,由于时间间隔较长,手部产生的“震颤”可能比想象得大,需要再通过全局的预对齐来弥补缺陷。

  然后,主要的问题出在b、c两个步骤上。

  第一个不准确的问题,是具体采用的帧数。论文表明“通过分析每个帧的局部梯度结构张量,来计算核的协方差矩阵”,然而作者发现,对每一帧都这样操作其实毫无意义。

  作者放弃了像论文所述那样进行采样,选择了5×5 而非3×3 的核,并对梯度进行了高斯平滑,在全分辨率下计算每个像素的结构张量。

  此外,则是步骤d的情况,经过长时间曝光的图像,包含许多低频噪声,使得精确跟踪无法实现。因此,作者在跟踪步骤前面还加入了一个高通滤波器。

  然而,论文却完全没有提到“高通滤波器”这种东西。

  到了步骤e和f,谷歌论文的作者用了一个专业术语“Wiener shrinkage” ,但这个术语在引用论文中完全没有出现,无法得知具体含义。

  因此,复现的作者,只能根据自己的猜测,结合引用的论文来复现。

  其他还有一些细节上的错误,例如把公式搞错了的情况也有发生:

  好在,最后他还是将这篇论文复现了出来:

  而且做成了一个完整的项目,来看看具体效果。

  具体效果

  先来看看论文中所展示的效果,看上去还是非常不错的:

  不仅噪点去除了不少,边缘也很平滑,没有放大后物体轮廓凸显的棱角。

  而且,看起来也比其他的论文算法要更好:

  那么,实际上复现出来的效果如何呢?

  整体好像不太看得出效果,放大一点试试:

  单栋大楼的窗子确实清晰了不少,原本是模糊一片,现在几乎能数得出数量了。

  不过,相比于论文中的效果,复现出来的实际结果,似乎并没有那么“完美”。

  但用来拍摄风景,效果还挺好:

  拍照如果手抖的话,可以将它装到手机里试一试了~

  项目地址:

  https://github.com/kunzmi/ImageStackAlignator

  论文地址:

  https://dl.acm.org/doi/10.1145/3306346.3323024

相关推荐
阅读 +