HybridSN+2D SENet

1、在HybridSN模块中添加注意力机制:

class_num = 16
rate = 16	# SENet论文中建议rate=sqrt(256)=16
class HybridSN(nn.Module):
  def __init__(self):
    super(HybridSN, self).__init__()

    self.conv1 = nn.Conv3d(1, 8, kernel_size=(7, 3, 3), stride=1, padding=0)
    self.conv2 = nn.Conv3d(8, 16, kernel_size=(5, 3, 3), stride=1, padding=0)
    self.conv3 = nn.Conv3d(16, 32, kernel_size=(3, 3, 3), stride=1, padding=0)

    inputX = self.get2Dinput()
    inputConv4 = inputX.shape[1] * inputX.shape[2]
    self.conv4 = nn.Conv2d(inputConv4, 64, kernel_size=(3, 3), stride=1, padding=0)
    #加入atention机制
    self.fc_41 = nn.Conv2d(64, 64//rate, kernel_size=1)
    self.fc_42 = nn.Conv2d(64//rate, 64, kernel_size=1)

    num = inputX.shape[3]-2 #二维卷积后(64, 17, 17)-->num = 17
    inputFc1 = 64 * num * num
    self.fc1 = nn.Linear(inputFc1, 256) # 64 * 17 * 17 = 18496
    self.fc2 = nn.Linear(256, 128)
    self.fc3 = nn.Linear(128, class_num)
    self.dropout = nn.Dropout(0.4)

  def get2Dinput(self):
    with torch.no_grad():
      x = torch.zeros((1, 1, self.L, self.S, self.S))
      x = self.conv1(x)
      x = self.conv2(x)
      x = self.conv3(x)
    return x

  def forward(self, x):
    x = F.relu(self.conv1(x))
    x = F.relu(self.conv2(x))
    x = F.relu(self.conv3(x))

    x = x.view(x.shape[0], -1, x.shape[3], x.shape[4])
    x = F.relu(self.conv4(x))

    # Squeeze 操作:global average pooling
    w = F.avg_pool2d(x, x.size(2))
    # Excitation 操作: fc(压缩到16分之一)--Relu--fc(激到之前维度)--Sigmoid(保证输出为 0 至 1 之间)
    w = F.relu(self.fc_41(w))
    w = F.sigmoid(self.fc_42(w))
    x = x * w

    x = x.view(-1, x.shape[1] * x.shape[2] * x.shape[3])

    x = F.relu(self.fc1(x))
    x = self.dropout(x)
    x = F.relu(self.fc2(x))
    x = self.dropout(x)
    x = self.fc3(x)
    return x

在HybridSN网络的基础上得到提高,比起之前的96.75%,得到最高98.51%的准确率

2、视频学习

  • 很喜欢听报告的这种形式,李夏前辈对语义分割中的自注意力机制的系统介绍,给自己在该方向的入门指了一条道路——可以从这些优秀的论文开始学习。程明明教授的两篇报告清楚明晰,听了收获颇深。对于Res2net和strip pooling的结构设计,感觉很精巧,却又不容易想到。李夏前辈的报告内容很多,但自己的积淀太少,第一遍听睡着了而第二遍仍很懵,所以很大程度上听不懂,便决定把大佬所提的论文看一下整理一下,目前仅整理两篇,后续补充。

  • 北京大学李夏前辈的报告《语义分割中的自注意力机制和低秩重重建》

  • 南开大学程明明教授的报告《图像语义分割前沿进展》

    • 报告主要从卷积、池化角度降低计算量和参数量

    • Res2Net:A New Multi-scale Backbone Architecture

      res2net(层内和层间的多尺度):将原来resnet模块3×3的卷积换成多个小滤波器,每个小滤波器通道数为原来卷积的一部分(如图b的x1、x2、x3、x4),最终网络计算量降低得多。同时随着小滤波器的叠加,其深度加强,感受野也能得到增强。网络性能得到提升,而且res2net具有很好的复用性。

    HybridSN+2D SENet
    • Strip Pooling:Rethinking Spatial Pooling for Scene Parsing

      strip pooling:带状池化,沿着一个空间维度捕获孤立区域的远程关系,沿其他空间维度捕获本地上下文信息并防止无关区域干扰标签预测

    HybridSN+2D SENet

陈昊:BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation

COCO数据集不容易过拟合,但是数据集本身标注不太准

Top-Down:丢失细节性信息、背景计算浪费

语义分割 vs 实例分割

语义分割结果更精细,实例分割更完整

上一篇:语义分割之ENet, LinkNet


下一篇:梯度消失和解决方案