最近在关注一些图像图像重建的方法,正好在机器之心上看到了一篇名为——Deep Image Prior的推送,讲的是一种比较有意思的(不需要进行学习),进行图像重建、超分辨率以及去噪的方法。这虽然是一篇一年前的文章,但在现在仍然有实用的前景。
项目主页:https://dmitryulyanov.github.io/deep_image_prior。
首先我们看一看它能做的事情(下图一张图就能够概括):
我们后面会用几张图片来进行测试,看看算法的实际效果究竟如何,是否有论文中测试图像所展现的那般神奇。首先来聊一聊论文的主要思想。
论文的思想
论文的思想其实非常的厉害,其根本没有有任何的先验知识,也就是根本不需要去根据已有的训练结果来进行填补,而是根据输入图像本身的信息进行训练与预测。
方法流程如下(GAN):
- 初始化深度卷积生成(解码)网络,网络权重随机初始化。此网络主要是通过输入为固定的随机编码向量,生成出一个仿造的图像。
- 真实的图像我们记为。现在我们的目标是使与之间的差异尽可能的小,以此来训练的参数。
- 选择合适的损失函数。例如对于降噪问题可关注整体的MSE,对于填充问题就应该只关心不需要填充的位置的MSE。注意选择合适的损失函数。例如对于降噪问题可关注整体的MSE,对于填充问题就应该只关心不需要填充的位置的MSE。
- 由于在图像复原过程中,图像上的一点点噪声可能就会对复原的结果产生非常大的影响,因为很多复原算法都会放大噪声。这时候我们可以针对损失函数,可以添加正则项(文中举例为Total Variation(TV))来保持图像的光滑性质。此时的损失函数变为:
- 理论上,如网络足够大,训练时间足够久,可实现输出与非常接近的图像,甚至一致(若不添加正则项)。
- 但如果在训练到一半时终止训练,也就是我们给定迭代次数,会发现它会输出一幅“修复过的”。此时生成的图像还没来得及对原图非常细节部分的噪声进行学习。
这说明:深度卷积网络本身会先学会原图中“未被破坏的,符合自然规律的部分”,然后才会学会“被破坏的部分”。例如,它会先学会如何复制出一张没有噪点的x,然后才会学会复制出一张有噪点的x。这来自于卷积的不变性,和深度网络逐层抽象的结构。以论文中的下图为例:
还原最好的是2400轮迭代后的图像,到50000次迭代后,生成的图像将原图的噪声全部都学了进来。
网络结构细节
下面具体到网络结构的细节,本质上是一个decoder-encoder,编码与解码的结构,如下图所示(图片来源于论文的参考材料),可以理解为就是横过来简单版的U-Net(用于语义分割的U-Net为什么这么强?)
上图的含义如下(英文很简单就偷个懒不翻译了): correspond to the number of filters at depth for the upsampling, downsampling and skip-connections respectively. The values correspond to the respective kernel sizes.
针对不同的任务,我们网络的参数也需要进行调整,调整的部分包括(降采样与上采样的卷积通道数、卷积核大小,迭代次数,学习率,上采样的方式(包括双线性插值,以及最近邻填补))。每个任务的细节可查看论文的补充材料,在博客的最后有连接。
网络图片实战
最后我们对网络上的一些图片进行实战。
由于论文中使用的图片效果肯定都很好,我们直接使用作者github上写好的代码,对一些网络图像进行还原。
测试1
网络原图:
针对高糊的卡通图像进行尝试,结果如下(由于是截图,所以可能中间部分有些不全):
初始值:
500次迭代:
1000次迭代:
1500次迭代:
最终2400次迭代结果(左)与原图(右):
可以发现,其实针对这个图而言,最合适的是500-1000次迭代即可,不需要按照论文示例图片,迭代2400次。
测试2
下面我们测试一下图像的超像素分割,用一只可爱的小猫咪为例:
0次迭代:
2000次迭代(无正则项):
2000次迭代(TV Loss):
对于细节非常多,过于复杂的图像,效果还是比较差的。
参考
- guthub: Deep Image Prior
- Deep Image Prior Supplementary Material
- 知乎:Deep Image Prior:深度卷积网络先天就理解自然图像