Advertisement

深度之眼--图像分割第四周Deeplab

阅读量:

图像分割领风者Deeplab系列

  • 语义分割所面临的主要问题
  • Deeplab系列的核心理念
  • 对ASPP模块的详细阐述
  • 分析模型的发展过程:从Deeplab v1到v3+版本
1.语义分割面临的问题

1.CNN能够准确预测图像中物体的存在位置及其粗糙度特性, 但在精细轮廓定位方面存在一定局限性。连续下采样操作可能导致图像中浅层特征信息丢失, 在卷积神经网络体系中, 分类准确率与目标检测精度间存在着权衡关系: 即使采用更深或更复杂的变换来提取更高层次的空间语义特征, 也仅能提高分类性能, 而无法有效改善目标检测能力。
2.在同一幅图像内, 不同尺寸的目标物体会呈现出不同的分割效果, 这主要归因于所采用的不同尺度卷积核在处理目标物限时表现出异质性特点。当分辨率较低时, 小尺寸目标物往往会在分割过程中失去重要的位置编码信息。

2.Deeplab系列的思想

当前的图像分割CNN是根据classification这种high-level semantics改编的,但CNN做语义分割时精准度不够,根本原因是 DCNNs 的高级特征的平移不变性,即高层次特征映射,根源于重复的池化和下采样会丢失localization信息,即无法对像素点精确定位语义(low-level semantics)。针对下采样或池化降低分辨率,DeepLab采用了空洞卷积代替池化操作来扩展感受野,获取更多的上下文信息。同时DeepLab v1v2 结合了深度卷积神经网络(DCNNs)和概率图模型(DenseCRFs)的方法。
DeepLab v2提出了串行的ASPP模块,大大扩展了卷积核的感受野,但随着感受野越来越接近图像大小,会退化为1x1卷积。为了解决这个问题,DeepLab v3改进了ASPP空洞卷积空间金字塔池化层,不同的dilation卷积并行操作,然后归一尺寸后求和。ASPP模块借鉴PSPNet思想,通过不同采样率的空洞卷积并行采样,捕捉图像不同尺度的上下文信息。

3.简述ASPP模块

由于同一场景中被检测物体的尺寸差异较大时会增加分割任务的难度。传统的处理方式是通过调整图像尺寸后分别进行深度神经网络检测与融合,尽管计算量较大,DeepLab引入了ASPP模块。ASPP是一种用于语义分割的技术模块,其全称为空洞卷积加空间金字塔池化结构。其原理是通过不同空洞率的膨胀卷积对特征图进行并行处理,并结合归一化操作以实现多尺度特征提取。

具体的模块代码如下:

复制代码
    class ASPP_module(nn.Module):
    def __init__(self, inplanes, planes, os):
        super(ASPP_module, self).__init__()
        # ASPP
        if os == 16:
            dilations = [1, 6, 12, 18]  # 空洞率
        elif os == 8:
            dilations = [1, 12, 24, 36]
    
        self.aspp1 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=1, stride=1,
                                                          padding=0, dilation=dilations[0], bias=False),
                                                nn.BatchNorm2d(planes),
                                                nn.ReLU())  # [256, 22, 30]
        self.aspp2 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,   # 空洞率和padding均为6
                                                           padding=dilations[1], dilation=dilations[1], bias=False),
                                                nn.BatchNorm2d(planes),
                                                nn.ReLU())  # [256, 22, 30]
        self.aspp3 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,
                                                           padding=dilations[2], dilation=dilations[2], bias=False),
                                                nn.BatchNorm2d(planes),
                                                nn.ReLU())   # [256, 22, 30]
        self.aspp4 = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,
                                                           padding=dilations[3], dilation=dilations[3], bias=False),  # 通道2048->256,大小不变,原图1/16
                                                 nn.BatchNorm2d(planes),
                                                 nn.ReLU())  # [256, 22, 30]
        self.global_avg_pool = nn.Sequential(nn.AdaptiveAvgPool2d((1, 1)),                   # 全局平均池化,大小缩小为1x1  通道数2048
                                             nn.Conv2d(2048, 256, 1, stride=1, bias=False),  # 1x1卷积降维 2048->256
                                             nn.BatchNorm2d(256),
                                             nn.ReLU())      #  [256, 1, 1]
       # self.conv1 = nn.Conv2d(1280, 256, 1, bias=False) # 1x1降维,此处未调用
       # self.bn1 = nn.BatchNorm2d(256)
    
        self._init_weight()
    
    def forward(self, x):  # 输入是1/16大小的特征图
        x1 = self.aspp1(x)
        x2 = self.aspp2(x)
        x3 = self.aspp3(x)
        x4 = self.aspp4(x)
        x5 = self.global_avg_pool(x)
        x5 = F.interpolate(x5, size=x4.size()[2:], mode='bilinear', align_corners=True)  # 上采样为[256, 22, 30]
    
        x = torch.cat((x1, x2, x3, x4, x5), dim=1)  # 256->1280
    
        return x
    
    def _init_weight(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()
4.模型发展:从Deeplab v1到v3+

Deeplab v1采用VGG16网络基础并结合空洞卷积技术与条件随机场(CRF)模型进行边缘分割后处理工作以提升分割精度。为了解决由于下采样或池化操作导致分辨率下降的问题DeepLab采用了空洞卷积来扩大感受野从而获取更多细节信息同时通过CRF模型增强模型对细节特征的捕捉能力。
Deeplab v2则在VGG16与ResNet网络架构基础上引入了多级空洞卷积结构并设计了一个由不同膨胀因子组成的ASPP模块序列用于特征提取并通过条件随机场(CRF)模型完成边缘分割后的后处理工作以进一步提升分割精度该方法通过不同膨胀因子的空洞卷积依次作用有效替代了传统池化操作从而显著扩大了感受野提升了模型的整体性能。

在这里插入图片描述

在计算机视觉领域中,DensePose v2.0通过引入多尺度卷积操作提升了模型性能。
该方法主要包含两个关键创新:首先,它通过自适应分辨率预测网络(Adaptive Resolution Prediction Network)实现了跨尺度特征表示;其次,它借鉴了 hourglass 网络的思想,通过多级预测框架增强了模型对复杂人体姿态的理解能力。

在这里插入图片描述

DeepLab v3++的核心在于增加一个简洁有效的解码器来补充细节信息(补充分割边界沿物体边缘细化分割结果),从而扩展了DeepLab v3的能力范围。基于Xcepition/ResNet作为主干结构,在多尺度特征提取ASPP之后附加了一个简明扼要的解码器模块。深广度可分离卷积则等同于将输入通道划分为独立处理的部分,并将其视为对每个输入通道进行独立操作的基础结构。这种设计不仅能够有效降低模型参数数量(大幅降低了模型参数数量),还能显著提升网络性能(显著提升了网络性能)。

在这里插入图片描述

Xception结构图(对应上图DCNN):

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~