图像分割之Global Convolutional Network(GCN)

论文:Large Kernel Matters ——
Improve Semantic Segmentation by Global Convolutional Network

主要工作(创新点):

  • 提出全局卷积网络(Global Convolutional Network,GCN),用以同时提高语义分割中分类和定位的准确度。
  • 提出Boundary Refinement block(BR), 用以提高物体边界的定位。

在早期的网络中,有不少大卷积核。后来因为在相同计算复杂度下,堆叠的小滤波器比大内核更高效,比如一个 5 × 5 5\times5 5×5卷积核使用两个 3 × 3 3\times3 3×3卷积核来代替,所以目前的网络大多使用的是 3 × 3 , 1 × 1 3\times3,1\times1 3×3,1×1卷积核。然而,在语义分割领域,我们需要进行密集的逐像素预测,我们发现当我们必须同时进行分类和定位任务时,大的核(有效的感受野)起着重要的作用。

简介

文章指出了语义分割遇到的两个挑战:对像素进行分类,定位。一个设计良好的分割模型应该同时处理这两个问题。

但是,这两个任务通常是矛盾的:对于分类任务而言,模型需要对各种变换(比如旋转和平移)具有不变性,但是对于定位任务而言,模型又必须对各种变换保持敏感,因为每个像素都需要在正确的位置上进行分类。

在这里插入图片描述

像上图B中,很多分割网络是主要是为了定位,这样可能会降低分类性能;图C,文章提出的GCN,兼顾分类和定位。

结构设计要求:

  • 从定位角度出发,模型应该使用全卷积以保持定位性能,不使用全连接和全局池化,因为这些层会丢失定位信息;
  • 从分类的角度看,在网络结构中应采用较大size的内核,使feature maps和逐像素分类器之间紧密连接,增强了处理不同transformations的能力。

模型

GCN

作者观察到一些SOTA(这篇paper之前的)语义分割模型,其设计都是为了更好的定位,这可能会降低分类的效果。分类效果变差可能是由感受野造成的。例子如下图所示,注意有效感受野不等同于感受野,对于传统模型,即使感受野和输入图像一样大,有效感受野也只是覆盖了object鸟(A),当输入调整到更大的尺度(B),有效感受野就不能保留整个object了,(B)中可以看到只覆盖了部分,文章提出的GCN在输入图像尺寸变大的时候依然能覆盖整个object。

在这里插入图片描述

基于此,作者开始设计网络,从定位出发要使用全卷积,不使用全连接或者全局池化。从分类出发,卷积核size要尽可能的大。 文章使用了 1 × k + k × 1 1 \times k + k \times 1 1×k+k×1 k × 1 + 1 × k k \times 1 + 1 \times k k×1+1×k卷积核组合的方式来替代 k × k k \times k k×k,注意这后面没有接非线性激活函数。这样做主要是为了保证一定感受野的情况下,减少计算量,GCN结构只有 O ( 2 k ) O(\frac{2}{k}) O(k2)的计算消耗和参数数量。

非对称卷积
GCN block

如下图所示,两条branch,分别是 1 × k + k × 1 1 \times k + k \times 1 1×k+k×1 k × 1 + 1 × k k \times 1 + 1 \times k k×1+1×k,比较清楚。

在这里插入图片描述

代码如下:

class GCM(nn.Module):
    def __init__(self, in_channels, num_class, k=15):
        super(GCM, self).__init__()

        pad = (k-1) // 2

        self.conv1 = nn.Sequential(nn.Conv2d(in_channels, num_class, kernel_size=(1, k), padding=(0, pad), bias=False),
                                   nn.Conv2d(num_class, num_class, kernel_size=(k, 1), padding=(pad, 0), bias=False))

        self.conv2 = nn.Sequential(nn.Conv2d(in_channels, num_class, kernel_size=(k, 1), padding=(pad, 0), bias=False),
                                   nn.Conv2d(num_class, num_class, kernel_size=(1, k), padding=(0, pad), bias=False))

    def forward(self, x):

        x1 = self.conv1(x)
        x2 = self.conv2(x)

        assert x1.shape == x2.shape

        return x1 + x2
BR block

网络使用了较多的Boundary Refinement结构,这是一种残差连接的结构,具体结构如下图所示,顶部 w × h × 21 w\times h \times 21 w×h×21是粗糙score map,侧边的残差连接可以对boundary进行refine,两者相加达到了Boundary Refine的效果。

在这里插入图片描述

代码如下:

class BR(nn.Module):
    def __init__(self, num_class):
        super(BR, self).__init__()

        self.shortcut = nn.Sequential(nn.Conv2d(num_class, num_class, 3, padding=1, bias=False),
                                      nn.ReLU(),
                                      nn.Conv2d(num_class, num_class, 3, padding=1, bias=False))

    def forward(self, x):
        return x + self.shortcut(x)
整体结构

在这里插入图片描述

主要构成,ResNet提取特征,FCN框架,多尺度架构(使用ResNet不同stage的feature map),GCN+BR得到较为精细的边缘,结合反卷积得到最终的结果。

Reference:

[1] 非对称卷积增强CNN特征拟合

https://zhuanlan.zhihu.com/p/38055224

https://zhuanlan.zhihu.com/p/212375354

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值