论文笔记:《Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring》

论文来源:CVPR2017

论文作者:Seungjun Nah,Tae Hyun Kim等

下载链接:PDF | 数据集

论文主要贡献:

  • 提出使用“multi-scale”CNN对图像去模糊,采用“端对端”(end-to-end)的方式,即输入一张模糊图像,网络将输出一张同等大小的清晰图像;提出“multi-scale”损失函数,用于模拟传统的“coarse-to-fine”的去模糊方法
  • 提出较大规模的GOPRO数据集,一共由3214对模糊-清晰图像构成

Introduction

单张图像去模糊(single image deblurring)

相机的抖动、快速运动的物体都会导致拍摄出模糊的图像,景深变化也会使图像进一步模糊。单张图像去模糊问题就是希望通过一张模糊图像重建出清晰的图像。早期的去模糊算法研究主要集中于解决相机移动、旋转产生的模糊;而近期的工作主要希望解决由景深变化、相机抖动和物体运动等因素产生的“non-uniform blurs”。

在传统的去模糊算法中,一般使用如下模型:

B=KS+n

其中, B 是 模糊图像, S 是清晰图像, n 是噪声, K 是一个由多个局部“blur kernel”构成的矩阵,它与潜在的清晰图像 S 相乘产生模糊图像。“blind deblurring”就是指在“blur kernel”未知的情况下,根据模糊图像 B 同时估计出 KS

对于传统方法来说,要想估计出每个像素点对应的“blur kernel”是不可行的。因此,传统方法常常需要对模糊源作出假设,将“blur kernel”参数化。例如,论文[1,2]中假设模糊仅仅由3D(D代表自由度)相机的运动造成。显然,这类方法不足以解决实际中各种复杂因素引起的图像模糊。


GOPRO数据集

为了产生更真实的模糊图像,作者没有使用用清晰图像卷积“blur kernel”的方式,而是使用了一个高速摄像头快速记录下一连串清晰图像,然后将这些间隔时间非常短的清晰图像求平均来获得模糊图像。

因为相机传感器在曝光过程中是不断接收光线的,我们就可以理解成曝光时传感器不断接收到清晰图像的信号,合起来构成了一张模糊的图像。合成的信号然后经过非线性的CRF(相机响应函数,Camera Response Function)转换成离散的像素值,生成一张数字化的模糊图像。于是,我们可以使用高速摄像头模拟这一过程。模糊累积、产生的过程可以表示为:

其中, T 为曝光时间, S(t) 为传感器信号(在 t 时刻获得的清晰图像);M 为采样获得的清晰图像的帧数, S[i] 为第 i 张清晰的采样图像。 g 是CRF,将传感器信号 S(t) 转化为我们观测到的数字图像 \tilde{S} (t) ,即 \tilde{S}(t)=g(S(t))\tilde{S}[i]=g(S[i]) 。注意,对清晰信号累加求平均是在CRF变换之前,而在实际中,原始传感器信号和CRF都是未知的。为了尽量还原成像过程,文中使用了CRF的近似, \gamma=2.2 的gamma曲线:

g(x)=x^{1/\gamma}

于是,我们现在可以获得传感器信号 :S[i]=g^{-1}(\tilde{S}[i])

然后就可以对 S[i] 求平均和CRF变换,获得合成的模糊图像了。过程如下所示:

文中,作者使用GOPRO4 HERO Black相机拍摄了240fps的视频,然后对连续的7到13帧取平均获得模糊程度不一的图像。每张清晰图像的快门速度为1/240s,对15帧取平均相当于获得了一张快门速度为1/16s的模糊图像。作者将模糊图像对应的清晰图像定义为处于中间位置的那一帧图像。最终,一共生成了3214对模糊-清晰图像,分辨率为1280×720。样本示例:

blur
sharp

从上面清晰图像可以看出,虽然已经使用了1/240s的快门速度,画面还是有些模糊,画质比较糟糕。有些“清晰”图像则更加模糊:

使用这样的数据集一定会大大限制模型的表现能力。


Proposed Method

本文中,作者使用了“multi-scale”的结构,输入和输出都采用高斯金字塔(Gaussian pyramid)的形式。网络结构使用了修改过的 residual block,如下图:

左边是原始的“residual block”,右边是作者修改后的。作者移去了非线性单元 ReLU,因为这样能加快训练时的收敛速度;移去了 Batch Normalization,因为作者在训练时 mini-batch size为2,比平时采用 Batch Normalization 时的 batch size小。

采用残差形式的 CNN 的原因是:

  1. 能构建更深的网络,增大“receptive field”
  2. 模糊图像和清晰图像在数值上本身就比较相近,因此仅仅让网络学习两者的差异也够了

整体网络结构

文中选择了K=3的“multi-scale architecture”,输入、输出的“Gaussian pyramid patches”大小为{256×256,128×128,64×64}。 B_{k},L_{k},S_{k} 分别表示模糊图像、重建的清晰的图像、和 ground truth;下标 k 表示“Gaussian pyramid”中的第 k 级,图像大小降为 1/2^{k} 。输入是一个模糊图像构成的金字塔,输出是一个重建图像构成的金字塔,每一层的图像都要训练成清晰的图像。测试时,就只采用无缩放的输出作为结果。

整个网络结构也由三个相似的CNN构成,分别对应输入金字塔中的每一层。网络最前面是分辨率最低的子网络(coarest level network),在这个子网络最后,是“upconvolution layer”,将重建的低分辨率图像放大为高分辨率图像,然后和高一层的子网络的输入连接在一起,作为上层网络的输入。

再看单个 CNN 的结构:在第一层卷积层后,叠加了19个 ResBlock,最后一个卷积层将feature map 转化为输出,维度与输入图像相同。中间的每一个卷积层都通过 zero padding 保持输入图像的分辨率。每个 CNN 都有40个卷积层。

损失函数

作者使用的是将两个损失函数结合起来训练网络的方法:

其中, L_{cont} 是内容损失, L_{adv} 是对抗损失,常数\lambda=1×10^{-4}

Multi-scale content loss

使用的是 MSE,由于作者遵循的是“coarse-to-fine”的方法,该方法要求每一个中间大小的输出都应该尽量清晰,即网络应该输出一个由清晰图像构成的金字塔,因此这里的 content loss 是“multi-scale”的:

上式中,L_{k}, S_{k} 分别代表高斯金字塔中第 k 层的模型输出和 ground truth。每一层的损失函数都用通道数 c_{k},宽度 w_{k} 和高度 h_{k} 进行了归一化,也就是除以图中所有像素点个数。

Adversarial loss

文中,作者还引入了生成式对抗网络的结构,将上述 multi-scale CNN 当作生成器G,另外构建了一个判别器网络D。作者希望能通过这么做让 CNN 产生更清晰、真实的图像。对抗损失的计算如下:


实验结果

在GOPRO数据集上的结果

可以看出,本文方法的效果相比其他方法有很大提高,而且运算速度也大大提高。提出的大规模数据集也对今后的研究有重要作用。

在 Kohler 标准数据集上的结果

(作者没放图,只有指标的对比)

Lai等人提出的数据集上的结果

这个数据集全部由真实拍摄出来的模糊图像构成,没有“ground truth”,代表了实际的模糊图像。

上面一行是Sun等人的结果,下面是作者的结果。可以看出,在这个数据集上作者的方法没有在自己数据集上效果好,说明对真实的模糊图像的去模糊效果还有待改进。


个人总结

  1. 本文在CNN基础上引入了对抗网络的思想,这有助于生成更清晰的图像。但是content loss采用 MSE 不利于生成清晰的图像
  2. 提出的 GOPRO 数据集:使用高速摄像头生成真实的模糊图像是一个好的思路,但是数据集中场景太少,每一段视频基本就是一个场景,而且ground truth画质太差,有些ground truth也很模糊,本身数据集也不大。但目前相关数据集很少,GOPRO 的提出使得训练深度去模糊模型更加方便了

参考文献

[1] O. Whyte, J. Sivic, A. Zisserman, and J. Ponce. Non-uniform deblurring for shaken images. 2010. 1

[2] A. Gupta, N. Joshi, C. L. Zitnick, M. Cohen, and B. Curless. Single image deblurring using motion density functions. In ECCV, pages 171–184. Springer, 2010. 1

编辑于 2017-12-29