其他分享
首页 > 其他分享> > 【CoSOD】ICNet: Intra-saliency Correlation Network for Co-Saliency Detection

【CoSOD】ICNet: Intra-saliency Correlation Network for Co-Saliency Detection

作者:互联网

ICNet: Intra-saliency Correlation Network for Co-Saliency Detection

原始文档:https://www.yuque.com/lart/papers/abs95w

前言

image.png

这是南开大学发表在NeurIPS 2020上的一篇关于Co-Saliency的文章. 这篇文章同样也是利用现有的SOD方法(EGNet)设计的框架式的模型. 所以研究的关键在于如何同时利用来自SOD模型的intra-saliency cues, 并通过利用correlation techniques将其与inter-saliency cues进行整合.

整体框架

本文针对这个问题, 设计了一个模型. 整体框架如下:

image.png

image.png

提取intra Cues

image.png

现有方法试图使用SISM作为训练目标来训练子网络, 而不是直接集成SISM到网络中端到端训练. 由于SISM的并不能准确的指示single-salient regions, 显式用其监督模型会导致不准确的intra cues.
为了更好地而集成SISM和语义特征以获取更加具有判别力的intra cues, 这里使用了normalized masked average pooling (NMAP)[Amp: Adaptive masked proxies for few-shot segmentation] 操作.

image.png

        # 从VGG16 backbone中提取特征.
        conv1_2 = self.vgg(image_group, 'conv1_1', 'conv1_2_mp')  # shape=[N, 64, 224, 224]
        conv2_2 = self.vgg(conv1_2, 'conv1_2_mp', 'conv2_2_mp')  # shape=[N, 128, 112, 112]
        conv3_3 = self.vgg(conv2_2, 'conv2_2_mp', 'conv3_3_mp')  # shape=[N, 256, 56, 56]
        conv4_3 = self.vgg(conv3_3, 'conv3_3_mp', 'conv4_3_mp')  # shape=[N, 512, 28, 28]
        conv5_3 = self.vgg(conv4_3, 'conv4_3_mp', 'conv5_3_mp')  # shape=[N, 512, 14, 14]

        # 对high-level features的特征先进行一次压缩.
        conv6_cmprs = self.conv6_cmprs(conv5_3)  # shape=[N, 128, 7, 7]
        conv5_cmprs = self.conv5_cmprs(conv5_3)  # shape=[N, 256, 14, 14]
        conv4_cmprs = self.conv4_cmprs(conv4_3)  # shape=[N, 256, 28, 28]

        # 获得co-saliancy features.
        cosal_feat_6 = self.Co6(conv6_cmprs, SISMs)  # shape=[N, 128, 7, 7]
        cosal_feat_5 = self.Co5(conv5_cmprs, SISMs)  # shape=[N, 128, 14, 14]
        cosal_feat_4 = self.Co4(conv4_cmprs, SISMs)  # shape=[N, 128, 28, 28]
    def forward(self, feats, SISMs):
        N, C, H, W = feats.shape
        HW = H * W
        # 将SISMs调整到和输入特征feats一样的尺度.
        SISMs = resize(SISMs, [H, W])  # shape=[N, 1, H, W]
        # NFs: L2标准化(normalize)后的特征.
        NFs = F.normalize(feats, dim=1)  # shape=[N, C, H, W]
        # 计算 SIVs [3.2节, 式1].
        SIVs = F.normalize((NFs * SISMs).mean(dim=3).mean(dim=2), dim=1).view(N, C, 1, 1)  # shape=[N, C, 1, 1]

提取Inter Cues

这部分主要设计来提取intra cues之间的Inter cues. 不同于现有方法通过拼接、或者使用固定数量图片分组(这类方法使用循环结构, 对于输入顺序有依赖, 而固定的数量也会导致, 预定义类别上学习到的语义矢量难以处理看到没有见过的目标类别)来整合特征, 为此作者提出了correlation fusion module (CFM) 来避免以上的这些问题.

受到VOS的启发, 这座认为获得准确CoSOD map的关键在于_dense correlations between the SIVs and single-image features_, 所以CFM主要就是在计算SIV中的V和SISM中的F之间的像素级相关性, 从而可以生成有用的inter cues, 并且处理任意数量的图片组. 主要过程如下:

        # 计算 co-salient attention (CSA) maps [3.3节].
        CSA_maps = CFM(SIVs, NFs)  # shape=[N, 1, H, W]
        def CFM(SIVs, NFs):
            # 计算SIVs和NFs中每个像素的内积, 产生correlation maps [图4].
            # 我们通过 ``F.conv2d()'' 来实现这一过程, 其中将SIVs作为1*1卷积的参数对NFs进行卷积.
            correlation_maps = F.conv2d(NFs, weight=SIVs)  # shape=[N, N, H, W]

image.png

            # 向量化(vectorize)并标准化(normalize) correlation maps.
            correlation_maps = F.normalize(correlation_maps.reshape(N, N, HW), dim=2)  # shape=[N, N, HW]

            # 计算权重向量(weight vectors) [式2].
            correlation_matrix = torch.matmul(correlation_maps, correlation_maps.permute(0, 2, 1))  # shape=[N, N, N]
            weight_vectors = correlation_matrix.sum(dim=2).softmax(dim=1)  # shape=[N, N]
            # 根据权重向量(weight vectors)对correlation maps进行融合, 产生co-salient attention (CSA) maps.
            CSA_maps = torch.sum(correlation_maps * weight_vectors.view(N, N, 1), dim=1)  # shape=[N, HW]
           # Max-min normalize CSA maps (将CSA maps的范围拉伸至0~1之间).
            min_value = torch.min(CSA_maps, dim=1, keepdim=True)[0]
            max_value = torch.max(CSA_maps, dim=1, keepdim=True)[0]
            CSA_maps = (CSA_maps - min_value) / (max_value - min_value + 1e-12)  # shape=[N, HW]
            CSA_maps = CSA_maps.view(N, 1, H, W)  # shape=[N, 1, H, W]
            return CSA_maps

image.png

Rearranged Self-Correlation Feature

获得CSA map之后, 正如[Co-saliency detection via mask-guided fully convolutional networks with multi-scale label smoothing]中建议的, 将其与l2规范化的特征F相乘来专注于co-salient region和最终预测得到Co-SOD map A. 然而, 观察到这种方式下, 模型不能判断有着相似但是却不同类别的像素.这主要是因为A和F之间不一致的类别依赖.

image.png

        # 计算 self-correlation features (SCFs) [3.4节].
        SCFs = get_SCFs(NFs)  # shape=[N, HW, H, W]
        def get_SCFs(NFs):
            NFs = NFs.view(N, C, HW)  # shape=[N, C, HW]
            SCFs = torch.matmul(NFs.permute(0, 2, 1), NFs).view(N, -1, H, W)  # shape=[N, HW, H, W]
            return SCFs
      # 重排列(Rearrange)SCFs的通道顺序, 产生RSCFs [3.4节].
        evidence = CSA_maps.view(N, HW)  # shape=[N, HW]
        indices = torch.argsort(
            evidence, dim=1, descending=True
        ).view(N, HW, 1, 1).repeat(1, 1, H,  W)  # shape=[N, HW, H, W]
        RSCFs = torch.gather(SCFs, dim=1, index=indices)  # shape=[N, HW, H, W]
        cosal_feat = self.conv(RSCFs * CSA_maps)  # shape=[N, 128, H, W]

实验细节

image.png

image.png

失败案例分析

由于本文的模型构建与SISM之上, 当使用的SISM不够可靠的时候, 会出现CoSOD的错误预测. 作者回应道, 虽然失败案例可能会让人怀疑我们的ICNet的健壮性, 但这种极端情况很少发生. 同时, 我们的实验表明, 只要不是大部分的SISM是不可靠的, ICNet就可以稳定地运行.

相关链接

标签:Co,Network,saliency,self,CSA,maps,shape,NFs,correlation
来源: https://www.cnblogs.com/lart/p/14098982.html