SINet-v2阅读笔记

前言

SINet-v2整体设计思想与SINet类似,即将伪装目标分割任务分成搜索和识别两个阶段。首先,通过深层的高级特征学习对象的语义信息,生成粗略的特征图;然后,再通过特征融合的方式细化粗略特征,精确分割出伪装对象。主要改进之处在于,SINet-v2只聚合最深三层的特征,引入邻居连接解码器(NCD)和组反转注意力(GRA)两个模块大大提升了模型效果。

整体网络结构主要包括三个模块:

  • 纹理增强模块(TEM),用于捕捉放大语义线索的细粒度纹理
  • 邻居连接解码器(NCD),提供位置信息
  • 分组-反向注意力模块(GRA),从更深层细化粗略预测

1. 搜索阶段

1.1 特征提取(Res2Net)

Res2Net相比ResNet计算负载不增加,特征提取能力更强。二者区别如下图所示,通俗的理解,就是将原来的resnet中间的 3 × 3 3 \times 3 3×3卷积换成了右侧红色部分。

经过1x1卷积之后,将特征图分成4部分。第一部分线路很简单, x 1 x_1 x1不做处理,直接传到 y 1 y_1 y1;第二部分线路, x 2 x_2 x2经过3x3卷积之后分为两条线路,一条继续向前传播给 y 2 y_2 y2,另一条传到 x 3 x_3 x3,这样第三条线路就获得了第二条线路的信息;第三条线路、第四条线路,以此类推。

使用Res2Net替代ResNet对图像特征进行提取,得到一组特征 f k , k ∈ { 1 , 2 , 3 , 4 , 5 } f_k, k \in \lbrace 1,2,3,4,5 \rbrace fk,k{1,2,3,4,5},每个特征 f k f_k fk的分辨率分别是 H 2 k × W 2 k , k ∈ { 1 , 2 , 3 , 4 , 5 } \frac{H}{2^k} \times \frac{W}{2^k}, k \in \lbrace 1,2,3,4,5 \rbrace 2kH×2kW,k{1,2,3,4,5}

1.2 纹理增强模块(TEM)

与SINet中的RF模块保持一致,通过一组不同膨胀率的膨胀卷积,模仿人类视觉系统中不同大小的分组感受野。

1.3 邻居连接解码器(NCD)

由于低级特征往往空间分辨率因较大而消耗更多的计算资源,但是对于性能的贡献很小,因此在v2中只聚合了三个最深层的特征。

在聚合多层特征时粗在两个关键问题:

  1. 如何保持一个层内的语义一致性?
  2. 如果跨层连接上下文语义?

使用邻居连接函数修改SINet中的部分解码器组件(PDC)解决这些问题。

高级特征虽然有更好的语义强度和定位精度,但是会为目标对象引入噪声,使边缘模糊。因此使用邻居连接的方法兼顾语义特征和底层特征。

2. 识别阶段

2.1 反向引导

由于全局位置图 C 6 C_6 C6来自三个最深的特征层,只能捕捉伪装对象相对粗略的位置,忽略了结构和纹理细节。为了解决这一问题,引入反向注意力机制,通过关注对象区域之外的背景区域,来加强对伪装对象边缘特征的提取。

如下图所示,通过 s i g m o i d sigmoid sigmoid和反向操作获得反向注意力引导 r 1 k r_1^k r1k

2.2 分组引导

为了更有效地利用反向注意力先验,使用了分组引导的操作。主要包含两个步骤:

  1. 将候选特征 { p i k ∈ R H 2 k × W 2 k × C , k = 3 , 4 , 5 , i = 1 , 2 , 3 } \lbrace p_i^k \in \mathbb R^{\frac{H}{2^k} \times \frac{W}{2^k} \times C}, k=3,4,5, i=1,2,3 \rbrace {pikR2kH×2kW×C,k=3,4,5,i=1,2,3}沿通道维度拆分为 m i m_i mi组( m i = C / g i m_i=C / g_i mi=C/gi),其中 g i g_i gi代表拆分后每个组的大小。
  2. 在分组特征 p i , j k ∈ R H 2 k × W 2 k × g i p_{i,j}^k \in \mathbb R^{\frac{H}{2^k} \times \frac{W}{2^k} \times g_i} pi,jkR2kH×2kW×gi之间周期性地内插反向注意引导。其中, i ∈ { 1 , 2 , 3 } i \in \lbrace 1,2,3 \rbrace i{1,2,3} j ∈ { 1 , … , m i } j \in \lbrace 1,\ldots, m_i \rbrace j{1,,mi} k ∈ { 3 , 4 , 5 } k \in \lbrace 3,4,5 \rbrace k{3,4,5}

PraNet中候选特征直接与反向注意先验相乘,有可能导致两个问题:

  1. 由于网络的分辨能力有限而导致的特征混淆
  2. 简单的乘法引入了true和false的引导先验,从而容易积累不准确性。

相比之下,分组引导操作可以在后续细化过程之前明确地分离出引导先验特征和候选特征。

2.3 分组-反向注意力(GRA)

将反向注意力引导和分组引导与残差学习过程相结合,称之为GRA模块。由于多级细化可以提高性能,所以将多个GRA模块结合起来,通过不同深度的特征层逐步细化粗略预测。

总的来说,每个GRA模块有三个残差学习步骤:

  1. 通过分组引导操作将候选特征 p k p_k pk与反向引导特征 r 1 k r_1^k r1k组合,然后使用残差阶段来产生细化的特征 p i + 1 k p_{i+1}^k pi+1k
  2. 得到单通道残差引导 r i + 1 k r_{i+1}^k ri+1k
  3. 只输出 C k = r i + 1 k + δ ( C k + 1 ) C_k=r_{i+1}^k+\delta (C_{k+1}) Ck=ri+1k+δ(Ck+1)作为残差预测。

GRA结构如下图所示。

3.损失函数

损失函数可表示为:

L = L I O U W + L B C E W L=L^W_{IOU}+L^W_{BCE} L=LIOUW+LBCEW

其中 L I O U W L^W_{IOU} LIOUW L B C E W L^W_{BCE} LBCEW代表加权的IOU和二元交叉熵损失,参考F3Net。与在分割任务中广泛采用的标准IoU损失不同, L I O U W L^W_{IOU} LIOUW增加了难以分辨的像素的权重,以突出其重要性。此外,与标准BCE损失相比, L B C E W L^W_{BCE} LBCEW更关注难以分辨的像素,而不是为所有像素分配相等的权重。

def structure_loss(pred, mask):
    """
    loss function (ref: F3Net-AAAI-2020)
    """
    weit = 1 + 5 * torch.abs(F.avg_pool2d(mask, kernel_size=31, stride=1, padding=15) - mask)
    wbce = F.binary_cross_entropy_with_logits(pred, mask, reduce='none')
    wbce = (weit * wbce).sum(dim=(2, 3)) / weit.sum(dim=(2, 3))

    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)
    return (wbce + wiou).mean()

在源代码中,加权损失实际上是在标准损失的基础上,利用gt生成了一个权重参数weit,其数学表达式如下:

w e i t = 1 + 5 × ∣ ∑ m , n ∈ A i , j g m n s ∑ m , n ∈ A i , j 1 − g i j s ∣ weit = 1+5 \times \lvert \frac{\sum_{m,n \in A_{i,j}}g_{mn}^s}{\sum_{m,n \in A_{i,j}}1} - g_{ij}^s \rvert weit=1+5×m,nAi,j1m,nAi,jgmnsgijs

其中 g i j s g_{ij}^s gijs表示 ( i , j ) (i,j) (i,j)位置的真值(1对应前景,0对应背景), A i j A_{ij} Aij表示 ( i , j ) (i,j) (i,j)周围的像素。

我们取几个特殊值讨论。假设 g m n s g_{mn}^s gmns均为0, g i j s g_{ij}^s gijs均为1,相当于当前像素为前景,而周围像素均为背景,是一个小目标,应该给予高权重。类似的,如果 g m n s g_{mn}^s gmns均为0, g i j s g_{ij}^s gijs也均为0,表明当前位置与周围位置均为背景,此时对应着一个低权重。所以加权损失会给小目标和边缘像素分配更高的权重,权重越高对损失函数求导后梯度也就越大,模型参数也就对小目标和边缘像素更加关注。对权重进行可视化如下:

在这里,我们对三个侧输出(即 C 3 C_3 C3 C 4 C_4 C4 C 5 C_5 C5)和全局输出 C 6 C_6 C6进行监督。每个输出都被上采样(例如 C 3 u p C_3^{up} C3up)到与gt相同的大小。因此,所提出的SINet的总损失函数可以表示为:

L t o t a l = L ( C 6 u p , G ) + ∑ i = 3 i = 5 L ( C i u p , G ) L_{total}=L(C_6^{up},G)+\sum_{i=3}^{i=5}L(C_i^{up},G) Ltotal=L(C6up,G)+i=3i=5L(Ciup,G)

源代码如下,其中loss_init代表 ∑ i = 3 i = 5 L ( C i u p ) \sum_{i=3}^{i=5}L(C_i^{up}) i=3i=5L(Ciup),loss_final代表 L ( C 6 u p ) L(C_6^{up}) L(C6up)

def train(train_loader, model, optimizer, epoch, save_path, writer):
    """
    train function
    """
    try:
        for i, (images, gts) in enumerate(train_loader, start=1):
        
            ···
            
            loss_init = structure_loss(preds[0], gts) + structure_loss(preds[1], gts) + structure_loss(preds[2], gts)
            loss_final = structure_loss(preds[3], gts)

            loss = loss_init + loss_final

            loss.backward()

            ···
        
        ···
        
    except KeyboardInterrupt:
    
        ···
            

4. 总结

SINet-v2整体思路与SINet大体一致,在特征融合、注意力机制和损失函数上做了改进。其中吸引我的地方,

一是分组的反向注意力机制。

由于浅层中的低级特征保留了构建对象边界的空间细节,而深层中的高级特征保留了定位对象的语义信息,所以在上一版本中SINet利用深层特征层 X 3 X_3 X3 X 4 X_4 X4作为注意力,将深层的语义信息融入保留了边界信息的浅层特征层 X 2 X_2 X2中。实际上,一方面作为浅层特征层的 X 2 X_2 X2的尺寸是原图的1/8,分辨率较大导致训练过程中参数量较多;另一方面, X 2 X_2 X2对于浅层边界特征没有进行任何增强处理,对于边界和细小目标特征的学习并不理想。

通过分组的反向注意力操作,既学习哪些像素属于前景,又学习哪些像素属于背景,将二者结合从而突出了边缘像素和一些模型难以分类的像素。

二是损失函数的设计。

在标准的IOU和二元交叉熵损失函数的基础上,增加了权重因子,使得边缘像素获得更大的权重,距离边缘越远,权重越小,从而使得模型更加关注边缘和细小目标。

疑问及实验:

  1. 反向注意力与图像特征相加和相乘在性能上有何分别?论文中提到简单的元素乘法会使不准确性累加,元素加法对于不准确性为何不会累加?通过实验比较乘法和加法时模型性能的差别。加入分支判断,根据实际情况使用加法或乘法。
  2. 对比之前所看的PFNet中反向注意力部分,对于假阳和假阴样本点的注意力引入权重进行控制。如果将这一思路引入v2最终模型的性能如何?
  3. v1版中得到两个预测分割图,最终输出将采用哪一个?两个预测特征图的效果上有无区别?
  4. 在边缘检测领域除了反向注意力操作还有哪些处理办法?通过实验对比不同边缘检测方法对于同一模型的性能的影响。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值