论文: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