论文发表于ECCV2018 论文链接 github链接
作者认为现有去雨模型存在两个问题:
- 空间情境信息利用不足。很多模型在图像的patch上学习去雨,无法捕获更大范围内的情境信息
- 因为雨水方向和形状上的复杂性,将去雨视为多阶段任务是很自然的事情,但是许多模型将不同的阶段视为独立的,没有考虑它们之间的联系
基于以上问题,作者提出了RESCAN (REcurrent SE Context Aggregation Net)。该论文的主要贡献在于:
- 使用空洞卷积网络扩大感知野
- 提出squeeze-and-excitation block,对不同的雨层赋予不同的 α \alpha α值
- 第一篇考虑不同阶段之间联系的问题。将去雨视为多阶段任务,使用RNN来利用前面阶段的信息对后面的阶段进行指导
模型
雨水模型
雨图
O
O
O可以分解为干净背景层
B
B
B和雨水层
R
R
R。由于雨水有不同的方向、形状、与摄像机的距离,单层雨水不足以模拟真实场景。故将雨水层视为多层雨水之和,模型如下图所示
但是作者发现在现实生活中,大雨情境下,雨水累积后图像会产生雾效,即远处的雨水与其他目标混合时会带来模糊。作者引入环境光,并根据不同的雨水层的透明度和密度来对其赋予不同的
α
\alpha
α值。下方公式中,
A
A
A是环境光,
α
0
\alpha_{0}
α0是场景传输率(scene transmission),
α
i
\alpha_{i}
αi是雨水层的亮度
去雨模型
Squeeze-and-Excitation Block
Squeeze-and-Excitation Networks(SENet)是由自动驾驶公司Momenta在2017年公布的一种全新的图像识别结构,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。
SENet的Block单元如上图所示,图中的Ftr是传统的卷积结构,X和U是Ftr的输入(C’xH’xW’)和输出(CxHxW)。SENet增加的部分是U后的结构:
- Squeeze过程:对U先做一个Global Average Pooling(图中的Fsq(.)),输出1x1xC数据
- Excitation过程:对上一步的输出经过两级全连接(图中的Fex(.))
- Reweight 操作:用sigmoid(self-gating mechanism)限制到[0,1]的范围,把这个值作为scale乘到U的C个通道上, 作为下一级的输入数据。这种结构的原理是想通过控制scale的大小,把重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。
参考:[1]https://www.jianshu.com/p/59fdc448a33f [2]https://www.cnblogs.com/bonelee/p/9030092.html
作者利用上述模型实现的SE block代码如下:
class SEBlock(nn.Module):
def __init__(self, input_dim, reduction):
super().__init__()
mid = int(input_dim / reduction)
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(input_dim, reduction),
nn.ReLU(inplace=True),
nn.Linear(reduction, input_dim),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y
SE Context Aggregation Net(SCAN)
基于提出的雨水模型,不用人工设置的先验知识来分解图像,而是利用神经网络学习一个函数 f f f,表示雨图O到雨层R的映射。因为雨层R比背景层更稀疏,且有更简单的纹理,所以学习雨图O到雨层R的映射相对简单,且用O-R即可得到干净背景层B。优化f的损失函数为 ∣ ∣ f ( O ) − R ∣ ∣ F 2 ||f(O)-R||^{2}_{F} ∣∣f(O)−R∣∣F2。
SCAN模型示意图如下:
将第一层作为encoder从图像空间转换为特征空间,将最后两层作为decoder反向映射。中间的CNN采用空洞卷积的方式扩大感知野,对于第d层网络,感知野的大小为
(
2
d
−
2
+
3
)
2
(2^{d-2}+3)^{2}
(2d−2+3)2
中间这些CNN的每个feature map视为一个雨水层 R i R_{i} Ri的表示,为每个CNN引入Squeeze-and-Excitation Block,对每个CNN的每个feature map动态地赋予正则化过的 α \alpha α值。将SE block学习到的 α \alpha α值相乘,即可对feature map重新赋权重
另外,SCAN中没有采用Batch Normalization这一常用的正则化方法。因为经过BN之后,每个特征的每个值都是独立、同分布的,但是作者提出的雨水模型中,每个雨水层的值都是不同分布的,BN的特点与模型的特点相违背。去掉BN后,效果有明显提升,且显存消耗降低了40%
Recurrent SE Context Aggregation Net(RESCAN)
由于雨层较多且相互交叠,仅用一个stage很难完全去除,因此作者考虑将上述模型设计为循环结构,采用多阶段的策略去雨,如下图公式所示。
R
s
R_{s}
Rs为第s个阶段的输出(雨层),
O
s
O_{s}
Os为第s个阶段得到的去雨图。但这种简单的模型相当于仅仅将网络做堆叠,每个阶段只是用上了上一个阶段输出的结果,没有考虑不同阶段之间输出的关联。
作者认为,不同阶段接受的输入(
O
s
O_{s}
Os可以被视为雨水不断减少的雨图的时间序列。研究不同阶段的特征之间的循环联系(recurrent connections)比只是使用RNN架构更好,因此作者在上述循环结构的基础上加入了RNN的记忆单元,在每个阶段利用之前的信息,如下图公式所示。
x
s
−
1
x_{s-1}
xs−1是第s-1个阶段的隐藏层,
R
ˉ
s
i
\bar{R}^{i}_{s}
Rˉsi是第s个阶段的第i个雨层。第s个阶段的输出
R
s
R_{s}
Rs是所有雨层的加权和
模型示意图如下图所示,对每个阶段的每一层来说,以第s个阶段的第j层
x
s
j
x^{j}_{s}
xsj为例,输入有两个来源,即上一个阶段相同位置的层的feature map
x
s
−
1
j
x^{j}_{s-1}
xs−1j和当前阶段的上一层的feature map
x
s
j
−
1
x^{j-1}_{s}
xsj−1(图中标橙色的两个部分)
作者一共提出了三种不同的RNN架构:ConvRNN, ConvGRU和ConvLSTM。相对于简单的CNN,它们分别会包含双倍、三倍、四倍的参数量
模型 | ConvRNN | ConvGRU | ConvLSTM |
---|---|---|---|
networks | convx convn | convxz convhz convxr convhr convxn convhn | convxf convhf convxi convhi convxo convho convxj convhj |
参数量 | 2x | 3x | 4x |
输出形式
作者提出了模型的两种输出形式。在第s个阶段,它们都以当前阶段输出的去雨图 O s O_{s} Os和上一个阶段的状态 x s − 1 x_{s-1} xs−1作为输入,但输出的图像不同
Additive Prediction
在每个阶段,模型只预测上一个输出与ground truth之间的残差(residual)。也就是说每个阶段输出的干净背景图为上一个输出减去该阶段预测出的雨层
R
s
R_{s}
Rs
相应的损失函数为所有阶段中,每个阶段当前累积的预测雨层(第一个求和符号)与真实雨层(
R
=
O
−
B
R=O-B
R=O−B)之间的差异之和(第二个求和符号):
Full Prediction
在每个阶段,预测所有雨层R。也就是说每个阶段输出的干净背景图为原始雨图减去该阶段预测出的雨层
R
s
R_{s}
Rs
R
s
R_{s}
Rs表示第s个阶段预测的所有雨层,
O
^
s
+
1
=
B
+
剩
下
的
雨
层
\hat{O}_{s+1}=B+剩下的雨层
O^s+1=B+剩下的雨层
相应的损失函数为所有阶段预测的雨层与真实雨层(
R
=
O
−
B
R=O-B
R=O−B)之间的差异之和:
方便理解,绘制了一个简易图。其中每个五角星代表一个雨层
实验
数据集:Rain800和Rain100H(合成数据集)和两份真实图片数据集
训练设置:对每张图片随机选取100个64x64的patch对,batch size=64,depth=7
对比模型:五个SOTA模型:image decomposition (ID), discriminative sparse coding (DSC) , layer priors (LP), DetailsNet和JORDER
合成图片去雨效果对比
真实雨图去雨效果对比
SCAN不同模块的分析
作者将SCAN与Plain (dilation=1 for all convolutions), DetailsNe中的ResNet,ID-CGAN中的Encoder-Decoder模型和 CAN模型进行对比。其中SCAN在CAN基础上修改,这两个模型都有指级数增加的空洞卷积,SCAN比CAN多了SE block。CAN和SCAN的效果最佳。结果显示:
- 随着模型深度增加,感知野指级数增加的空洞卷积与其他模型深度和感知野成正比的模型相比更有优势
- SE block对效果有较大提升
- 去掉BN层效果更好
RESCAN不同模块的分析
作者对三种RNN模块ConvRNN, ConvLSTM, ConvGRU和两种输出方式Additive Prediction (Add), Full Prediction (Full)的不同组合进行了测试,同时也对比了baseline(SCAN)和仅堆叠SCAN的循环结构(Iter),结果显示: - Iter无法与任何RNN结构匹敌
- GRU和LSTM比简单的RNN效果更佳
- Full prediction效果更好