EGNet: Edge Guidance Network for Salient Object Detection 论文及代码解读

EGNet: Edge Guidance Network for Salient Object Detection
论文及代码解读

注:本文原创作者为Jia-Xing Zhao, Jiang-Jiang Liu, Deng-Ping Fan, Yang Cao, Ju-Feng Yang, Ming-Ming Cheng* TKLNDST, CS, Nankai University
本人仅对论文和代码进行注释讲解,如有侵权请联系删除文章即可。

论文分析:
1、论文的研究初衷,为什么要研究这个课题或者研究这个课题解决了什么问题?
因为现在流行的显著性检测大都是基于深度学习而衍生出来的,所以显著性目标的检测大多存在边缘轮廓不清晰、显著性不能精确提取的问题,因此本文作者提出了一种新颖的方法,即将在深度学习过程中,利用VGG网络的特性,即第二个池化层输出的特征图具有良好的边缘信息特征,而最后一层具有丰富的显著性特征,作者将边缘信息特征与显著性特征进行像素级的融合,得到具有清晰轮廓的显著性目标。
2、论文所基于的网络框架,特征提取方式,以及边缘信息和显著性息如何进行融合?
论文是以VGG16为base net,但并不是全部进行套用,而是截取其中池化以及卷积层进行特征的提取,作者利用了U-net的思想,对每个池化层进行了side path处理,即将每个池化层的输出都通过三层卷积输出,但并不对输出的大小进行改变。因为边缘信息以及显著目标信息的输出尺寸不一致,所以作者通过上采样的方式,将显著目标的特征信息进行上采样,采样的输出与边缘特征输出大小一致,然后进行像素级的相加,得到融合后的边缘信息。
3、模块分析:
1、Complementary information modeling
以VGG为基础,删除最后三个全连接层,在最后一个pooling 层加入一个side path,然后从vgg中得到六个side features,因为第一层输入太小,不合适所以舍去第一层。将其余五个side features放到一个集合中,其中第二层的特征c2因为有更好的边缘信息所以用作提取边缘特征。
以下是该模块代码实现的部分:

vgg16


    for m in self.modules():
        if isinstance(m, nn.Conv2d):
            n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
            m.weight.data.normal_(0, 0.01)
        elif isinstance(m, nn.BatchNorm2d):
            m.weight.data.fill_(1)
            m.bias.data.zero_()

2、Progressive salient object features extraction
为了得到更丰富的显著性目标特征,采用U-Net结构,并且在每一个side path后加入三个卷积层,在每层卷积层后加入ReLU层以确保得到的结果呈非线性。在最后加入了深度监督,在每个side path后加入一个卷积层,用来将得到的显著性图转换为单通道的预测标记。
以下是该模块代码实现的部分:

class MergeLayer1(nn.Module): # list_k: [[64, 512, 64], [128, 512, 128], [256, 0, 256] ... ]
    def __init__(self, list_k):
        super(MergeLayer1, self).__init__()
        self.list_k = list_k
        trans, up, score = [], [], []
        for ik in list_k:
            if ik[1] > 0:         # 如果ik中的第二项大于0
                trans.append(nn.Sequential(nn.Conv2d(ik[1], ik[0], 1, 1, bias=False), nn.ReLU(inplace=True)))   #  测路径提取
        up.append(nn.Sequential(nn.Conv2d(ik[0], ik[2], ik[3], 1, ik[4]), nn.ReLU(inplace=True),
                                nn.Conv2d(ik[2], ik[2], ik[3], 1, ik[4]), nn.ReLU(inplace=True),
                                nn.Conv2d(ik[2], ik[2], ik[3], 1, ik[4]), nn.ReLU(inplace=True)))           # 提取后的信息经过三层卷积处理
        score.append(nn.Conv2d(ik[2], 1, 3, 1, 1))                                                          # 将数据转化为单通道进行输出
    trans.append(nn.Sequential(nn.Conv2d(512, 128, 1, 
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值