单张图像去雨问题( single image deraining)

定义

该问题的目标是从包含雨水的图像生成去除雨水的图像。与图像修复问题不同,单张图像去雨问题中没有给出雨水的位置,也就是需要“修复”的位置,且被雨水遮挡的位置的图像背景信息几乎丢失,因此难度较大

早期的去雨方法利用视频中得到的连续的多帧图像,并对图像取平均得到去雨图像,而单张图像去雨问题缺少这样时序性的信息作为辅助

常用数据集

合成数据:

数据集 数量 说明
DDN-Data 14000对,训练9100对,测试4900对 由1000幅清晰的图像合成,包含14种不同的条纹方向和大小
DIDMDN-Data 12000对 3种密度
Rain100L&Rain100H L:训练200对,测试100对;H:训练1800对,测试100对 L只有1种密度,H有5种方向
Rain800 800对,训练700对,测试100对 rain streak图

真实数据(获取难度较大):

数据集 数量 说明
AttentiveGAN-Data 1119对 raindrop图,在放置在镜头前的玻璃片上喷洒水珠前后进行拍摄得到

指标

常用的指标为两种图像质量评价指标PSNR和SSIM
PSNR(Peak Signal to Noise Ratio)
峰值信噪比,一种全参考的图像质量评价指标,单位为dB
给定一个大小为 m×n 的干净图像 I 和噪声图像 K,均方误差 (MSE) 定义为:
去雨总结(更新中)
PSNR定义为:
去雨总结(更新中)
MAXI2MAX^{2}_{I} 为图片可能的最大像素值,常见的即255

上面是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算:

  • 分别计算 RGB 三个通道的 PSNR,取平均值
  • 计算 RGB 三通道的 MSE ,再除以 3
  • 将图片转化为 YCbCr 格式,只计算 Y 分量也就是亮度分量的PSNR
    SSIM (Structural SIMilarity)
    结构相似性,基于样本 x 和 y 之间的三个比较衡量:亮度 (luminance)、对比度 (contrast) 和结构 (structure)
    去雨总结(更新中)
    去雨总结(更新中)
    则SSIM为:
    去雨总结(更新中)
    每次计算的时候都从图片上取一个 N×N 的窗口,然后不断滑动窗口进行计算,最后取平均值作为全局的 SSIM

(转载:https://www.cnblogs.com/seniusen/p/10012656.html)

雨水模型

一般将雨图建模为雨水层和干净背景层的组合。按照雨水的类型,可以分为以下三种

rain streak

雨线图可以表示为干净背景B和稀疏的线型雨水S的线性叠加:
去雨总结(更新中)

raindrop

雨点图可以视为干净背景B和分散的、小范围、局部区域的雨点带来的模糊效果的组合:
去雨总结(更新中)
M是一个二元掩码,如果该像素属于雨区,则M=1,若属于背景区则M=0

rain and mist

雨图常包含雨水及其带来的雾效。这种雨图可以建模为雨线模型+大气散射霾模型(atmospheric scattering haze model):
去雨总结(更新中)
S是雨线,t和A是透射图(transmission map)和大气光(atmospheric light),它们决定了雾/薄雾成分

全监督方法

现在用深度学习进行去雨的模型绝大部分使用全监督的方法,将包含计算机合成雨水的雨图和相同背景的无雨图作为ground truth的合成数据集进行训练和测试

这些模型为了有效去雨,大都采用多阶段的方式或encoder-decoder的架构,用全卷积学习雨图到无雨图的映射或残差

目前论文中使用的模块大致可看作分别用于解决两个问题:定位雨水保留背景信息
定位雨水需要扩大感知野、得到丰富的contextual info,用到的模块主要有:

  • dilated network
  • non-local block
  • attention

为了保留背景信息,也需要从雨水周围的像素中获得局部信息,同时要在后面的层中尽可能地保留原有特征。对于保留原有特征,常见方法有:

  • RNN
  • 残差连接
  • pooling indices
  • discriminator

Attentive Generative Adversarial Network for Raindrop Removal from A Single Image[CVPR2018]

主要贡献:在generator和discriminator中引入attention机制
去雨总结(更新中)
Generator

  • Attentive-recurrent network:定位雨点
    通过多个时间步生成attention map,找到原图中需要被网络关注的区域:雨点及其周围区域

    • attention map V.S. binary mask:前者是每个值为0~1之间的矩阵,值越大表示该位置越需要关注;后者是二元掩码,值为1表示该位置属于雨点区域,值为0则是背景区域,该掩码由雨图与无雨图相减,再设定一个阈值(threshold)决定雨区与非雨区得到

    每个时间步的输入是前一个时间步产生的attention map和雨图的拼接,包含以下步骤:

    • ResNet:在前一个时间步产生的attention map的指导下,从雨图中提取特征
    • 卷积LSTM:充分利用之前的时间步提取的特征
    • 卷积层:生成attention map

去雨总结(更新中)
attention loss:计算每个时间步生成的attention map与binary mask之间的均方误差
去雨总结(更新中)

  • Contextual Autoencoder:去雨
    attention map与雨图的拼接作为输入
    去雨总结(更新中)
    multi-scale loss+perceptual loss,分别对应局部的像素之间的差异和全局的特征之间的差异
    multi-scale loss:从多个尺度捕捉更多的情境信息。SiS_{i}TiT_{i}分别是相同尺寸的某层decoder输出和ground truth,λ\lambda是不同尺度的权重,尺寸越大,权重越大
    去雨总结(更新中)
    perceptual loss:将autoencoder的输出和ground truth分别输入VGG-16得到提取的特征,计算二者之间的全局差异
    去雨总结(更新中)
    去雨总结(更新中)
    Discriminator
    利用局部和全局的图像内容的一致性作为D的判断条件
    从D的内部层提取到的特征输入一个CNN,将CNN的输出与D的特征相乘,再往后面的层传播,最后使用全连接层判断真假

计算CNN的输出与attention map之间的差异作为损失,引导D将注意力放在attention map关注的位置。R是抽样的无雨图,第二项意在表明对于无雨图,没有需要施加注意力的区域
去雨总结(更新中)
D的总损失如下:
去雨总结(更新中)
结果
去雨总结(更新中)

去雨总结(更新中)

Non-locally Enhanced Encoder-Decoder Network for Single Image De-raining[ACM MM2018]

论文
github
我的博客

主要贡献:将非局部增强加入编码器解码器架构,有效去除各种密度的雨水的同时完美保留图像的细节
去雨总结(更新中)
Non-locally Enhanced Dense Block (NEDB)
去雨总结(更新中)
NEDB的非局部操作,通过对像素矩阵中每个位置i考虑图像中所有可能位置(j)(\forall j)对特征表示进行非局部增强:
去雨总结(更新中)
ff:采用点积形式计算一对值之间的关联
FnF_{n}:输入NEDB的特征**值
g(.)g(.):计算FnF_{n}表示的一元函数
C(F)C(F):归一化因子 C(F)=Σjf(Fn,i,Fn,j)C(F) = \Sigma_{\forall j}f(F_{n,i},F_{n,j})

将非局部增强过的特征表示作为输入送给五个密集连接的卷积层
每一层到所有后续层都直接连接,第ll层接受之前所有层的特征**值D0,...,Dl1D_{0},...,D_{l-1}的拼接作为输入
去雨总结(更新中)
为避免梯度爆炸/梯度消失问题,在每个NEDB中使用局部残差学习

另外,由于NEDB中的非局部操作计算每个空间位置的值之间的相关性,随着尺寸的增大,计算负担显著增加。为了解决这个问题,以多尺度的方式实现非局部操作:将具有较高空间分辨率的特征图划分为区域网格(例如F1被划分为一个8×8的网格),让NEDB在每个划分出来的小区域内进行特征**。对于较低分辨率的特征图,NEDB直接作用于整个图

Pooling Indices Guided Decoding
编码器部分包含三个连续的NEDB,每个NEDBs后面都有一个带striding的最大池化层,对特征**值进行下采样。相对应地,在解码器部分堆叠另外三个NEDB,每一个后面都有一个最大池化层对特征**值进行上采样。在编码时记录pooling indices,之后解码时的上采样将记录的池化索引矩阵作为依据。最后利用残差连接将编码层的特征**与对应的解码层连接

实验证明该方法比双线性插值上采样方法更适合去雨任务

损失函数
输出图像和ground truth之间的平均绝对误差
去雨总结(更新中)

定量分析
与五个模型的不同数据集用两个metric进行对比。PSNR显著提高,较高的SSIM值也表明该方法可以更好地恢复图像的结构信息。
去雨总结(更新中)

Deep Joint Rain Detection and Removal from a Single Image[CVPR2017]

Progressive Image Deraining Networks: A Better and Simpler Baseline[CVPR2019]

论文
github
我的博客

pix2pix->cycleGAN->pix2pixHD

半监督方法

Semi-supervised Transfer Learning for Image Rain Removal[CVPR2019]

论文
我的博客

主要贡献:第一个将单张图像去雨任务视为领域自适应问题,第一个提出半监督模型解决去雨问题

去雨总结(更新中)
该论文提出一种半监督的方法, 将真实雨图(无需对应的无雨图)加入训练集,将雨图和无雨图之间的残差视为一个参数化雨水分布,网络可以通过有监督的合成雨水来适应真实无监督多种雨类型,这样缺少训练样本和真实与合成数据之间存在差别的问题可被显著减轻

模型
用混合模型可以实现对任意连续函数的逼近,因此可以用GMM(Gaussian Mixture Model)来描述无监督数据中的雨水(本文中使用了三层)
去雨总结(更新中)
k表示不同的分布的序号,N\mathcal{N}即高斯分布,πk,μk,k\pi_{k}, \mu_{k}, \sum_{k}分别是混合系数、高斯分布的均值和方差

对无监督样本使用如下的负对数似然(negative log likelihood function)作为无监督部分的损失;对于有监督的样本,采用DerainNet的网络结构fωf_{\omega}生成无雨图,损失即为无雨图与ground truth之间的平方损失;最小化K-L散度,约束真实雨水分布和合成雨水分布之间的差异,使得模型从合成雨水的域转移到真实雨水的域,而不是任意域;加入Total Variation regularizer对图像进行一些平滑,得到的总loss如下:
去雨总结(更新中)
xix_{i}yiy_{i}分别是合成雨图的对应的ground truth,x~\tilde x是真实雨图,x~nfω(x~)n\tilde x_{n}-f_{\omega}(\tilde x)_{n}是提取到的雨层,与Rn\mathcal R_{n}等价。λ,α,β\lambda, \alpha, \beta是对不同loss进行比例控制的超参,为0时则模型退化为全监督。第一项为有监督的loss,第二项为TV正则,第三项为KL散度,最后一项为无监督loss

作者对EM算法进行修改,用于解决损失函数离散不可微的问题。E步计算代表某一混合分量的后验分布,将损失函数展开为关于GMM参数可微分的;在M步中,更新混合分布和卷积神经网络的参数

实验
作者使用两种不同的方式合成两个雨图数据集,一种作为有监督的训练集,一种分为两部分,一部分作为无监督的训练集,一部分作为验证集。因此有监督的训练集和验证集的数据分布是不同的。为了显示该模型的分布转换的能力,作者可视化了训练过程中有监督的训练集和验证集的PSNR值的变化:
去雨总结(更新中)
实线表示有监督的训练集,虚线表示验证集,红、绿、蓝分别代表λ\lambda为0, 0.2, 1的情况,从上到下三排图像分别代表训练数据有500, 5000, 10000个图片块。从第三列可以看到,如果损失函数中不加入无监督项,随着训练过程的推进,如果训练集和验证集的数据分布不同,当训练数据增加时,模型越来越拟合训练数据,但越来越难以泛化到验证集数据。也就是说训练集的效果变好了,但是测试效果没有更好,甚至更差。但从最后两列可以看到,在加入无监督项后,这个问题得到缓解

对于PSNR指标,作者对两种场景的雨图进行测试,一种是带有雾效的大雨场景,一种是雨水比较稀疏,但深浅、长度不一的场景。与其他几种以前的无监督模型,和之后出现的有监督的深度学习模型进行对比
去雨总结(更新中)

无监督方法

DerainCycleGAN: An Attention-guided Unsupervised Benchmark for Single Image Deraining and Rainmaking[2019.12 from arxiv]

主要贡献:

  • 提出无监督的注意力机制引导的雨水提取模型U-ARSE,对雨图和无雨图的空间域都使用注意力机制,使用具有两个约束分支的CycleGAN循环结构来去雨
  • 模型中得到副产品:成对雨图数据集Rain200A

本文对雨图和无雨图的信息都充分利用,并且构建了两对生成器和判别器,充分利用CycleGAN的循环结构,形成一个两个分支的网络,提供更稳定的约束

去雨总结(更新中)
模型包含三个部分:

  • U-ARSE,从雨图中一阶段一阶段地提取雨水
  • 两个生成器GNG_{N}GRG_{R},分别生成无雨图和雨图
  • 两个判别器DND_{N}DRD_{R},区分真图和G生成的图

两个分支:

  • 雨-雨分支(rainy to rainy cycle-consistency branch):r>nr>r~r->n_{r}->\widetilde{r},用雨图生成无雨图,再重构成雨图
  • 无雨-无雨分支(rain-free to rain-free cycle-consistency branch):n>rn>n~n->r_{n}->\widetilde{n},用无雨图生成雨图,再重构成无雨图

U-ARSE(Unsupervised Attention guided Rain Streak Extractor)
U-ARSE同时对雨图和无雨图进行关注,包含6个阶段,每个阶段包含一个Hybrid Block单元(dual-path residual dense block,双路径残差密集块),一个LSTM单元和一个CNN,如下图所示
去雨总结(更新中)
Hybrid Block有两条路径,可以重用前一层学到的通用特征,同时学习当前层的新特征,提取雨水掩码(mask)

为了提取到准确的mask,定义了雨层注意力Att(r)Att(r)和背景层注意力Att(n)Att(n)上的先验作为约束,在多雨域和无雨域之间传输信息,解决两个域之间的不对称。

总的注意力损失如下:
去雨总结(更新中)
NN是高斯分布,N~(0,1);ZZ是与mask相同大小、所有值为0的分布。用LattnrL_{attn_{r}}计算Att(r)Att(r)与N之间的均方误差;因为背景图中没有雨层,因此用LattnnL_{attn_{n}}约束Att(n)Att(n)尽可能与0接近

Generators & Discriminators
作者使用U-Net作为G。G的输入是原始雨图与上一个U-ARSE输出的最后一个attention map的拼接

GNG_{N}利用雨图rrAttrAtt_{r}生成无雨图nrn_{r}GrG_{r}利用无雨图nnAttnAtt_{n}生成雨图rnr_{n}

U-ARSE从生成的nrn_{r}rnr_{n}中提取到雨水信息AttnrAtt_{n_{r}}AttrnAtt_{r_{n}}GrG_{r}利用无雨图nrn_{r}AttnrAtt_{n_{r}}重构雨图r~\widetilde{r}GnG_{n}利用雨图rnr_{n}AttrnAtt_{r_{n}}重构无雨图n~\widetilde{n}

DrD_{r}用于区分真实雨图rr和生成的雨图rnr_{n}DnD_{n}用于区分无雨图nn和生成的无雨图nrn_{r}

D采用多尺度结构,每个尺度上的特征映射经过三个卷积层,然后输入sigmoid

模型总目标函数如下:
去雨总结(更新中)
所有λ\lambda是trade-off参数,LattL_{att}是注意力损失,LadvL_{adv}是对抗损失,LccL_{cc}是在雨水域R和无雨域N上受约束的双分支的循环一致性损失函数LccL_{cc}(Constrained two-branch cycle-consistency loss),LpL_{p}是感知损失,描述生成的无雨图nrn_{r}与原始雨图之间的差异, LgmmL_{gmm}描述用GMM(Gaussian Mixture Model)提取的雨水层,LrL_{r}重构损失(reconstructive loss)对雨图rr与恢复的雨图rr'之间的不匹配进行描述

Rain200A数据集
将200张图像输入该论文模型的第二个分支:n>rn>n~n->r_{n}->\widetilde{n},则雨水层会被自动地加到无雨图上,得到有更多的形状和方向、更接近真实雨水的雨图。通过这个过程得到新的去雨成对数据集Rain200A

实验结果
作者给出了该模型与一些模型驱动的方法、全监督模型、半监督模型、无监督模型在三个合成数据集和一个真实数据集(SPANet-Data)上的定量比较结果。作者提出的模型完胜其他无监督模型,可以与表现最好的全监督模型抗衡,甚至可以比过半监督模型
去雨总结(更新中)

新的数据集和指标

相关文章: