经典分割网络GCN
1.卷积的方式汇总
1.大卷积核:拥有大的感受野,甚至可以扩大到全局卷积,缺点是参数量、计算量过大。
2. 小卷积核堆叠:通过3x3卷积核的堆叠来扩大感受野,减少参数量和计算量,同时可以添加多层非线性激活函数来提高模型判别能力。缺点是堆叠容易出现不可控因素。
3. 非对称卷积:使用非对称的1xk,kx1卷积来进一步减少参数量。GCN采用非对称卷积核来堆叠形成大卷积核,同时大大减少参数量。
4. 空洞卷积:空洞卷积通过增加空洞率来扩大卷积核的感受野,同时减少大卷积核的参数量。用空洞卷积代替池化操作可以避免下采样的信息损失,分割效果更好。
5. 分组卷积:分组卷积是对输入特征图分组,每个组分别进行卷积,可以减少参数量到1/组数。为了使特征之间的相互通信,使用channel shuffle将通道均匀的打乱,可以使信息在不同组之间流转。
6. 深度可分离卷积:一种特殊的分组卷积(每一层为一组),包括了深度卷积和1x1卷积核对特征图的逐点卷积扩大通道数。
7. 可形变卷积:规则形状的卷积核可能会限制特征的提取,可形变卷积可以更好的提取特征。
8. 特征重标定卷积:之前的几种卷积方式都是不分权重直接结合不同通道的特征图,而这种卷积方式通过学习的方式来自动获取到每个特征通道的重要程度,然后根据重要性区提升有用的特征并一直对当前任务用处不大的特征。例如:SENet网络的通道注意力模块使用了特征重标定卷积:为卷积得到的每一层特征图进行加权,使网络通过训练自动学习到权重,来突出某些特征。
2.定位和分类的权衡
图像分割中的分类和定位精度是有天然的平衡的,小卷积核不能两者兼得,浅层网络定位效果高,但分类不够精确;深层网络可以学到更抽象的特征,分类准确,但池化操作会损失局部信息。本文提出使用大的卷积核可以解决这个问题,同时满足定位和分类准确性。遵从两个原则:(1)从定位精度来看,全卷积网络且不使用池化层来保证定位精度;(2) 从分类的角度来看,网络体系结构中应该采用大的卷积核大小,以使特征映射和每像素分类器之间能够密集地连接。
3.实现GCN网络
GAN提出了一种全局卷积的思想:使用大卷积核来同时执行定位和分类任务,将kxk卷积核拆分为kx1,1xk卷积核堆叠,大大减少了模型参数。同时使用残差模块来改进对象边界的分割。
具体的模块代码如下:
import torch.nn as nn
from torchvision import models
resnet152_pretrained = models.resnet152(pretrained=False)
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