前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像分割之Global Convolutional Network(GCN)

图像分割之Global Convolutional Network(GCN)

作者头像
烤粽子
发布2021-07-19 15:56:59
8060
发布2021-07-19 15:56:59
举报

论文: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,比较清楚。

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

代码如下:

代码语言:javascript
复制
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的效果。

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

代码如下:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 模型
    • GCN
      • 非对称卷积
        • GCN block
          • BR block
            • 整体结构
            • Reference:
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档