这篇是2019年CVPR的一篇显著性检测论文。
论文地址
代码地址
1 简介
要解决的问题:
- 不同卷积层由不同的感受野,产生的特征也会有很大的分布特征区别。目前的特征融合方法忽略了这些区别,只是通过加法或者乘法或者联结;
- 目前的边界损失只考虑了位于边界处的像素,而没有考虑边界附近的像素,这些像素也很容易被误分类,也需要更大的权重。
本文贡献:
- 提出了Cross Feature Module (CFM),来进行特征融合,缓和特征之间的矛盾,提取特征之间的共享部分,抑制彼此的背景噪声,弥补彼此的缺失部分。
- 提出了Cascaded Feedback Decoder (CFD)来迭代优化特征。
- 提出了像素位置感知损失,来对不同位置的像素赋予不同的权重,更好地挖掘特征中的结构信息,帮助网络更加关注细节区域。
2 网络结构
2.1 Cross Feature Module
低层特征由于感受野受限,保留了丰富的细节信息和背景噪声,有清晰的边界(对生成显著性图很关键)。高层特征由于多次下采样,边界模糊,损失了很多细节信息,但仍然有一致的语义和清晰的背景。
这两种特征之间存在较大的统计差异。CFM执行特征交叉来缓解这种差异。
具体操作是高层和低层特征经过卷积、BN和ReLU后,元素相乘进行特征融合,来提取特征的公共部分,然后分别和原来的特征进行元素加法进行特征细化。
即作者认为元素乘是提取公共部分,再加到原来分支起到补全信息以及压制噪声的效果,单独的乘法或者加法会污染原来的特征。
2.2 Cascaded Feedback Decoder
这一部分就是一个级联不断refine的过程,每次将最后一个卷积层的特征传播回前面几层,从而对其进行修正和细化。
每个decoder包含两个过程,自底而上和自顶而下。自底而上就是正常的解码器操作,生成一张粗糙的显著性图;自顶而下就是将最后一个卷积层前的特征进行下采样元素加到之前的特征层中进行细化。所有的特征传递到下一个解码器,进行同样的操作。
2.3 Pixel Position Aware Loss
常用的BCE损失有三个缺点:
- 它独立计算每个像素的损失,忽略了图像的全局结构。
- 在以背景为主的图片中,前景像素的损失会被稀释。
- 它对所有像素权重相同。
PPA损失由加权BCE损失和加权IoU损失组成。
L
p
p
a
s
=
L
w
b
c
e
s
+
L
w
i
o
u
s
L_{ppa}^s = L_{wbce}^s+L_{wiou}^s
Lppas=Lwbces+Lwious
加权BCE损失定义如下:
L
w
b
c
e
s
=
−
∑
i
=
1
H
∑
j
=
1
W
(
1
+
γ
α
i
j
)
∑
l
=
0
1
1
(
g
i
j
s
=
l
)
log
P
r
(
p
i
j
s
=
l
∣
Ψ
)
∑
i
=
1
H
∑
j
=
1
W
γ
α
i
j
L^s_{wbce} = - \frac{\displaystyle\sum_{i=1}^H \sum_{j=1}^W (1+\gamma \alpha_{ij}) \sum_{l=0}^1 \bm1 (g_{ij}^s = l) \log \bm {Pr}(p^s_{ij} = l| \Psi) }{\displaystyle \sum^H_{i=1}\sum^W_{j=1}\gamma \alpha_{ij}}
Lwbces=−i=1∑Hj=1∑Wγαiji=1∑Hj=1∑W(1+γαij)l=0∑11(gijs=l)logPr(pijs=l∣Ψ)
其中
1
(
⋅
)
\bm 1 (\cdot)
1(⋅) 是指示函数,
γ
\gamma
γ 是超参。这里每个像素被赋予一个权重
α
\alpha
α,更难预测的像素应该对应于更大的权重,反之亦然。
α
\alpha
α 定义如下:
α
i
j
s
=
∣
∑
m
,
n
∈
A
i
j
g
t
m
n
s
∑
m
,
n
∈
A
i
j
1
−
g
t
i
j
s
∣
\alpha^s_{ij} = \left | \frac{\displaystyle \sum_{m,n \in A_{ij}} gt^s_{mn}}{\displaystyle \sum_{m,n\in A_{ij}}1} - gt^s_{ij} \right |
αijs=∣∣∣∣∣∣∣∣∣m,n∈Aij∑1m,n∈Aij∑gtmns−gtijs∣∣∣∣∣∣∣∣∣
源码中是这样实现这个权重的:
weit = 1+5*torch.abs(F.avg_pool2d(mask, kernel_size=31, stride=1, padding=15)-mask)
可以看出,是选取上下左右15个像素范围的像素作为周围像素。若
α
i
j
s
\alpha^s_{ij}
αijs 越大,代表该像素和周围越不同。
和BCE相比,加权BCE更关注于难像素,同时加入了局部结构信息。
同时为了加入全局结构信息,引入了加权IoU损失,代码如下:
pred = torch.sigmoid(pred)
inter = ((pred*mask)*weit).sum(dim=(2,3))
union = ((pred+mask)*weit).sum(dim=(2,3))
wiou = 1-(inter+1)/(union-inter+1)