去噪、去水印、超分辨率,这款不用学习的神经网络无所不能
2019-01-29
不同的神经网络可以实现给图像去噪、去水印、消除马赛克等等功能,但我们能否让一个模型完成上述所有事?事实证明AI确实有这样的能力。来自 Skoltech、Yandex 和牛津大学的学者们提出了一种可以满足所有大胆想法的神经网络。
事情是这样的:研究人员们让一个深度卷积网络去学习复制被破坏的图像(例如加入噪点的图像),随后竟发现这个网络可以自行先学会如何重建图像。该研究的论文《Deep Image Prior》已被收录在 CVPR 2018 大会,而 GitHub 则已有 3800 个 star。
Deep Image Prior 的重要特点是,网络由始至终仅使用了输入的,被破坏过的图像做为训练,没有经历过大多数神经网络所需要的学习过程即可完成任务。它没有「看过」任何其它图像,也没有看过未受破坏的正常图像,但最终恢复的效果依然很好。这说明自然图像的局部规律和自相似性确实很强。
在 GitHub 项目中,作者如下展示了 5 种常见图像重构的效果。他们表示单个卷积网络可以完成缺失图像的修复、痕迹的移除、图像去噪、超分辨率和去除水印等,可以说该模型在理解图像先验信息下显得无所不能。当然作者表示这个项目的超参数和架构都是可以调整的,它们远没有达到最优,所以感兴趣的读者快试试吧。
项目地址:https://github.com/DmitryUlyanov/deep-image-prior
其实上图中的每一项任务都有很多研究,它们假设模型能从大型真实图像数据集中学习到图像的先验信息,即像素怎样才能组合成一张「正常」的图像,这样学习到通用图像信息的模型就能用来修补图像或生成高分辨率图像了。但是这种观点正确吗?该项目的研究论文表示否定,它们只在损坏的「非正常」图像上训练同样能学习到图像的「先验」,注意这种「训练」仅表示模型在单张损坏图像上反复迭代。
网友使用 AKB-48 照片进行超分辨率的尝试。
与传统观点相反,该项目的研究论文表示未经任何「学习过程」的卷积图像生成器架构可以捕捉到大量图像数据,尤其是解决不同图像修复问题的图像数据。在卷积网络对损坏图像反复迭代时,它能自动利用图像的全局统计信息重构丢失的部分。
研究者使用未经训练的卷积网络来解决几种此类问题。研究者未在大量示例图像数据上训练卷积网络,而是直接将生成器网络应用于单个退化图像,即有损坏的自然图像。在此方法中,网络权重作为修复图像的参数。权重经过随机初始化和拟合,以在提供特定退化图像和任务相关模型时能够最大化似然度。
本研究展示了,这个非常简单的方法在标准图像处理问题(如去噪、图像修复和超分辨率)中极具竞争力。除了标准图像修复任务外,该技术还可用于理解深度神经网络激活函数中的信息。
论文:Deep Image Prior
论文地址:https://sites.skoltech.ru/app/data/uploads/sites/25/2018/04/deep_image_prior.pdf
摘要:深度卷积网络已经成为图像生成和修复的常用工具。通常,其优秀性能要归功于从大量示例图像中学习逼真图像先验的能力。而这篇论文反其道而行之,展示了一种生成器网络架构,它可以在学习之前先捕捉大量低级图像数据。本论文展示了随机初始化神经网络可在标准逆问题(如去噪、超分辨率和图像修复)中作为手工先验知识(handcrafted prior)使用,且性能优越。此外,同样的先验知识还可用于反转深度神经表征以作出判断,并基于 flash-no flash 输入对来修复图像。
该方法应用广泛,且强调了标准生成器网络架构捕捉的归纳偏置(inductive bias)。它还弥补了图像修复两大流行方法之间的距离:使用深度卷积网络的基于学习的方法、基于手工图像先验知识(如自相似性)的无学习方法。
项目使用
该项目为不同的任务提供了对应的实现文档,例如 inpainting.ipynb 展示了如何做图像修复与去水印、super-resolution.ipynb 展示了如何做图像超分辨率。如下展示了项目的环境配置与安装,注意其主要使用了 PyTorch 0.4,所以已经更新到 1.0 的读者可以借助 conda 或其它工具配置一个新环境。
安装
在执行代码之前,你需要安装下列库:
python = 3.6
pytorch = 0.4
numpy
scipy
matplotlib
scikit-image
jupyter
以上库均可通过 conda (anaconda) 安装,如:
conda install jupyter
Docker 镜像
你也可以使用具备全部依赖项的 Docker 镜像完成环境的配置,并连接到 Jupyter Notebook。你需要确保安装了 docker 和 nvidia-docker,然后运行以下命令:
nvidia-docker build -t deep-image-prior .
然后,启动容器,如下所示:
nvidia-docker run --rm -it --ipc=host -p 8888:8888 deep-image-prior
你会得到一个 URL,使用它可连接至 Jupyter notebook。