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

快速拯救超分辨率

萧箫 发自 凹非寺
量子位 报道 | 公众号 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

版权所有,未经授权不得以任何形式转载及使用,违者必究。