Texture-guided Saliency Distilling for Unsupervised Salient Object Detection

在这里插入图片描述

Abstract

基于深度学习的无监督显著性检测USOD主要依赖于传统手工方法或预训练网络生成的噪声显著性伪标签。为了解决噪声标签问题,现有的方法只关注具有可靠标签的简单样本easy sample,而忽略了困难样本hard sample中有价值的知识(信息)。
本文,提出新的USOD方法从易分样本、难分样本中挖掘丰富而准确的显著性知识(信息)。

  1. 提出基于样本置信度的显著性蒸馏策略CSD,对样本进行分类,引导模型从易分样本到难分样本的渐进式学习。
  2. 提出边界感知纹理匹配策略BTM,通过匹配预测边界周围的纹理来细化噪声标签的边界。

1.Introduction

  1. 提出基于样本置信度的显著性蒸馏机制CSD,根据样本的置信度对带有噪声标签的样本进行评分,然后通过自适应损失引导网络从易分样本到难分样本渐进地学习显著性知识(信息)。
  2. 提出边界感知纹理匹配机制BTM,通过匹配预测边界周围的纹理来细化噪声标签的边界。在训练过程中,预测的显著性边界在整个图像的外观空间中向周围边缘移动。
  3. 产生高质量的伪标签训练广义显著性检测器

2. Related Works

2.1. Supervised Salient Object Detection

2.2. Unsupervised Salient Object Detection

3. Our Approach

在这里插入图片描述
本文提出两种机制挖掘基于深度网络 Φ \Phi Φ生成的噪声激活图的准确显著性知识。

Activation map generation

在这里插入图片描述
在这里插入图片描述

为获得初始预测,使用本团队相关工作《Activation to Saliency: Forming High-Quality Labels for Completely Unsupervised Salient Object Detection》中的A2S
利用深度网络 Φ ( X ) = Y \Phi(X)=Y Φ(X)=Y将输入图像 X X X生成激活图 Y Y Y,公式表征如下:
E 3 , E 4 , E 5 = E n c o d e r ( X ) E_3,E_4,E_5=Encoder(X) E3,E4,E5=Encoder(X) F i = S E ( E i ) , i ∈ { 3 , 4 , 5 } F_i=SE(E_i),i\in\{3,4,5\} Fi=SE(Ei),i{3,4,5} H = S E ( c o n c a t ( F 3 , F 4 , F 5 ) ) H=SE(concat(F_3,F_4,F_5)) H=SE(concat(F3,F4,F5)) Y = i n v ( S i g m o i d ( s u m ( H − H ‾ ) ) ) Y=inv(Sigmoid(sum(H-\overline H))) Y=inv(Sigmoid(sum(HH)))
其中, H ‾ \overline H H H H H的空间均值。
使用MoCo-v2预训练的ResNet-50作为编码器,无额外手动注释。
解码器中,合成4个SE块。
H − H ‾ H-\overline H HH确保噪声标签在使用固定阈值时自适应输入图像,同时保证正负样本共存。
s u m ( ⋅ ) sum(·) sum()对通道维度上的特征求和。
S i g m o i d ( ⋅ ) Sigmoid(·) Sigmoid()生成最终的显著性分数。
i n v ( ⋅ ) inv(·) inv()识别更多的像素作为背景。

pred = torch.sum(feat, dim=1, keepdim=True)
# inv之前无sigmoid
pred = pred * foreground_sign(pred)

"""
	针对包含更多角的预测区域判断为是背景
	(4个角应当都是背景,如果4个角大于0的个数过多,就应该前景背景翻转,取反操作(此时预测的前景过多,前景远大于背景))
"""
def foreground_sign(pred):
    b, c, w, h = pred.size()
    p = pred.gt(0).float()
    num_pos = p[:, :, 0, 0] + p[:, :, w-1, 0] + p[:, :, w-1, h-1] + p[:, :, 0, h-1]
    sign = ((num_pos < 2).float() * 2 - 1).view(b, c, 1, 1)
    return sign

Training strategy

Φ \Phi Φ生成的激活图可以感知输入图像 X X X中的判别区域,但由于存在噪声,激活图质量仍很低。
为提高激活图质量,采用三个策略训练 Φ \Phi Φ
L Φ = λ c ( L c s d + L ^ c s d ) + λ b ( L b t m + L ^ b t m ) + λ m L m s L_\Phi=\lambda_c(L_{csd}+\hat L_{csd})+\lambda_b(L_{btm}+\hat L_{btm})+\lambda_mL_{ms} LΦ=λc(Lcsd+L^csd)+λb(Lbtm+L^btm)+λmLms
其中, L ^ \hat L L^是不同尺度(对原图像进行缩放)下的预测损失。
首先,提出一种置信感知显著性蒸馏策略CSD,从易分样本中挖掘有价值的显著性知识。
其次,提出一种边界感知纹理匹配策略BTM对齐外观上的边界和预测显著图。
同时,多尺度一致性损失 L m s L_{ms} Lms确保对多尺度输入产生一致的预测。

3.1. Confidence-aware Saliency Distilling

提出前提:对于困难样本,隐藏在噪声中的显著性知识没有得到充分挖掘。
CSD根据样本的置信度和训练进度对带有噪声标签的样本进行评分(固定阈值0.5,接近0.5即为困难样本)。
具体来说,简单样本包含可靠的知识,而困难样本的显著性知识隐藏在噪声中,可能在网络训练早期阶段破坏脆弱的显著性模式。受自步学习的启发,通过引入一个因子 ρ \rho ρ动态调整样本的梯度(训练进度)。随着训练的进行, ρ \rho ρ从0线性增加到1。损失计算如下:
L c s d = − 1 N ∑ i N ∣ Φ ( x i ) − 0.5 ∣ ( 2 1 − ρ ) L_{csd}=-\frac{1}{N}\sum^N_i|\Phi(x_i)-0.5|^{(2^{1-\rho})} Lcsd=N1iN∣Φ(xi)0.5(21ρ)
其中, N N N是像素数量, Φ ( x i ) \Phi(x_i) Φ(xi)是像素 x i x_i xi的显著性检测。
省略了噪声标签 G G G,因为它是基于 Φ ( x i ) \Phi(x_i) Φ(xi)生成的。
因此,可以用更简单的方法计算像素 x i x_i xi的置信分数 ∣ k i ∣ |k_i| ki,即 ∣ k i ∣ = ∣ Φ ( x i ) − 0.5 ∣ |k_i|=|\Phi(x_i)-0.5| ki=∣Φ(xi)0.5∣,恒定值0.5与 H ‾ \overline H H相关。
∂ L c s d ∂ Φ ( x i ) = − s i g n ( k i ) 2 ( 1 − ρ ) ∣ k i ∣ 2 ( 1 − ρ ) − 1 \frac{\partial L_{csd}}{\partial\Phi(x_i)}=-sign(k_i)2^{(1-\rho)}|k_i|^{2^{(1-\rho)}-1} Φ(xi)Lcsd=sign(ki)2(1ρ)ki2(1ρ)1
其中, s i g n ( k i ) ∈ { − 1 , 1 } sign(k_i)\in \{-1,1\} sign(ki){1,1}
在这里插入图片描述

3.2. Boundary-aware Texture Matching

提出目的:通过匹配纹理细节, 从而对齐显著性边界和图像边缘
通常,显著性边界的外观与显著性预测具有相似的纹理。因此,匹配不同图map的纹理可以指导产生合理的显著性分数。该策略同样适合其他模态,例如深度图、热图像和光流。
在这里插入图片描述

类似于LBP特征,分别从显著性预测和外观中提取纹理向量。
对于显著性检测,第 i i i个像素的纹理向量 T i s = [ t i , 1 s , t i , 2 s , … … , t i , k 2 s ] T^s_i=[t^s_{i,1},t^s_{i,2},……,t^s_{i,k^2}] Tis=[ti,1s,ti,2s,……,ti,k2s] t i , j s = ∣ Φ ( x i ) − Φ ( x j ) ∣ , j ∈ K i t^s_{i,j}=|\Phi(x_i)-\Phi(x_j)|,j\in K_i ti,js=∣Φ(xi)Φ(xj),jKi,其中 K i K_i Ki是像素 x i x_i xi K × K K\times K K×K领域。
对于外观信息,可以是RGB图像、光流、深度图或热图像。
为了从多模态数据中提取更多的特征,计算纹理向量 T i a = [ t i , 1 a , t i , 2 a , … … , t i , k 2 a ] , t i , j a = e x p ( − α ∑ m ∣ ∣ x i ( m ) − x j ( m ) ∣ ∣ 2 ) , j ∈ K i T^a_i=[t^a_{i,1},t^a_{i,2},……,t^a_{i,k^2}],t^a_{i,j}=exp(-\alpha \sum_m||x_i^{(m)}-x_j^{(m)}||^2), j\in K_i Tia=[ti,1a,ti,2a,……,ti,k2a],ti,ja=exp(αm∣∣xi(m)xj(m)2),jKi,其中 α \alpha α是超参数, x i ( m ) x^{(m)}_i xi(m)是模态m的外观数据。
两个元素之间的微小差异会在 T s T^s Ts中产生小元素,但会在 T a T^a Ta中产生大元素。
因此, T i s ⋅ ( T i a ) T T_i^s \cdot (T_i^a)^T Tis(Tia)T被定义为将像素 x i x_i xi作为显著性边界而非相似性边界的匹配惩罚项。
损失计算如下:
L b t m = ∑ i b i T i s ⋅ ( T i a ) T ∑ i b i L_{btm}=\frac{\sum_ib_iT^s_i\cdot (T^a_i)^T}{\sum_ib_i} Lbtm=ibiibiTis(Tia)T
在这里插入图片描述
如图5所示,对于预测的边缘像素,发现一些附近的像素在显著性得分上有显著差异。一般来说,边界和这些像素之间的外观不同,因为它们分别位于显著物体和背景中。如果不是这种情况,期望边界像素的显著性分数接近附近的像素,这样边界就会向相反的方向移动。经过一个迭代训练,可以将预测的显著性边界与图像边缘对齐。

# 膨胀and腐蚀
def get_contour(label):
    lbl = label.gt(0.5).float()
    ero = 1 - F.max_pool2d(1 - lbl, kernel_size=5, stride=1, padding=2)  # erosion
    dil = F.max_pool2d(lbl, kernel_size=5, stride=1, padding=2)            # dilation
    
    edge = dil - ero
    return edge

def BTMLoss(pred, image, radius, config=None):
        alpha = config['rgb']
        modal = config['trset']
        num_modal = len(modal) if 'c' in modal else len(modal)+1
        
        slices = range(0, 3*num_modal+1, 3)
        sal_map =  F.interpolate(pred, scale_factor=0.25, mode='bilinear', align_corners=True)
        image_ = F.interpolate(image, size=sal_map.shape[-2:], mode='bilinear', align_corners=True)
        mask = get_contour(sal_map)
        features = torch.cat([image_, sal_map], dim=1)
        
        N, C, H, W = features.shape
        diameter = 2 * radius + 1
        kernels = F.unfold(features, diameter, 1, radius).view(N, C, diameter, diameter, H, W)
        kernels = kernels - kernels[:, :, radius, radius, :, :].view(N, C, 1, 1, H, W)
        dis_modal = 1
        # 从外观信息计算纹理表示
        for idx, slice in enumerate(slices):
            if idx == len(slices) - 1:
                continue
            dis_map = (-alpha * kernels[:, slice:slices[idx+1]] ** 2).sum(dim=1, keepdim=True).exp()
            # Only RGB
            if config['only_rgb'] and idx > 0:
                dis_map = dis_map * 0 + 1
            dis_modal = dis_modal * dis_map
            
        # 从显著性信息计算纹理表示
        dis_sal = torch.abs(kernels[:, slices[-1]:])
        distance = dis_modal * dis_sal

        loss = distance.view(N, 1, (radius * 2 + 1) ** 2, H, W).sum(dim=2)
        loss = torch.sum(loss * mask) / torch.sum(mask)
        return loss

3.3. Multi-scale Consistency

显著目标在多尺度输入中是一致的。因此,将输入图像的大小调整为参考尺度,并产生一致的预测:
L m s = ∑ i ∣ y i − r e s i z e ( y ^ i ) ∣ 2 L_{ms}=\sum_i|y_i-resize(\hat y_i)|^2 Lms=iyiresize(y^i)2
其中, y i y_i yi y ^ i \hat y_i y^i是不同尺度的显著性预测。

3.4. Training a Generalized Detector

根据之前USOD方法,基于显著性预测 Y Y Y通过 Y ¨ = C R F ( Y ) \ddot Y=CRF(Y) Y¨=CRF(Y)生成伪标签 Y ¨ \ddot Y Y¨,训练具有IOU损失的额外显著性检测器。
对于RGB SOD,使用与之前相同的检测器。
对于多模态SOD,使用MIDD网络作为检测器。

4. Experiments

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值