DeepLabV3+神经网络解析

  • 论文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
  • 什么是DeeplabV3+网络
  • deeplabV3+主要结构
  • 主干网络(DCNN)
  • 空洞卷积(膨胀卷积)
  • 空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP))
  • 利用特征获得预测结果
  • 损失函数
  • 结果对比


论文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation

https://arxiv.org/pdf/1802.02611.pdf

什么是DeeplabV3+网络

该网络是于2018年提出的语义分割模型,以deeplabv3为encoder为架构,在此基础上加入了Decoder模块细化分割结果。并将Depthwise separable convolution在ASPP和Decoder上的应用,最终得到了更加强大的神经网络deeplabv3+:

python lstm 损失函数 deeplabv3+损失函数_深度学习


Encoder:

首先图片进入Encoder里面进行特征提取,经过DCNN(深度卷积神经网络)生成两个有效特征层,分别为浅层特征层和深层特征层,浅层特征层的高和宽会大一些,而深层特征层的下采样会多一些,所以高和宽会小一些。在Encoder中,我们会使用不同膨胀率的膨胀卷积进行特征提取,其中有膨胀率分别为6,12,18的3x3卷积,用来提高网络的感受野,使得网络有不同的特征感受情况,之后将特征层进行堆叠,再经过1x1卷积进行通道数调整,获得绿色特征层。

Decoder:

由DCNN生成的浅层特征层进入到Decoder解码器中,由编码器生成的具有高语义信息的绿色特征层进入到Decoder中进行上采样,之后与较浅的特征经过1x1卷积得到的结果进行特征融合,之后经过3x3的卷积进行特征提取,最终经过上采样将输出图片与输入图片大小一致,得到预测结果。

deeplabV3+主要结构

主干网络(DCNN)

论文中采用的是Xception系列作为主干特征提取网络,但由于计算机性能问题,本人采用Mobilenetv2作为主干特征提取网络。

python lstm 损失函数 deeplabv3+损失函数_pytorch_02


左边为主干部分,首先经过1x1卷积进行升维,然后利用3x3深度可分离卷积进行特征提取,然后利用1x1卷积进行降维,输入和输出直接相接。

python lstm 损失函数 deeplabv3+损失函数_pytorch_03


需要注意的是,在DeeplabV3当中,一般不会5次下采样,可选的有3次下采样和4次下采样,本文使用的4次下采样。这里所提到的下采样指的是不会进行五次长和宽的压缩,通常选用三次或者四次长和宽的压缩。

在完成MobilenetV2的特征提取后,我们可以获得两个有效特征层,一个有效特征层是输入图片高和宽压缩两次的结果,一个有效特征层是输入图片高和宽压缩四次的结果。

Xception模型

python lstm 损失函数 deeplabv3+损失函数_深度学习_04


整个网络具有14个模块,36个卷积。它引入了Entry/Middle/Exit三个flow,每个flow内部使用不同的重复模块,当然最最核心的属于中间不断分析、过滤特征的Middel flow。

Entry flow主要是用来不断下采样,减小空间维度;中间则是不断学习关联关系,优化特征;最终则是汇总、整理特征,用于交由FC来进行表达。

空洞卷积(膨胀卷积)

Deeplabv3+在Encoder部分引入了大量的空洞卷积,在不损失信息的情况下,增加了感受野大小,捕捉到了较大范围的信息。

python lstm 损失函数 deeplabv3+损失函数_深度学习_05


一为普通卷积,也可理解为膨胀率为0的膨胀卷积。二为膨胀率为1的膨胀卷积

膨胀卷积的优点:

1、常见的图像分割算法通常使用池化层和卷积层来增加感受野(Receptive Filed),同时也缩小了特征图尺寸(resolution),然后再利用上采样还原图像尺寸,特征图缩小再放大的过程造成了精度上的损失,而膨胀卷积可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样操作

1、不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息,

1、空洞卷积可以增大感受野,同时可以不改变图像输出特征图的尺寸

空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP))

在Encoder中,我们对压缩四次的初步有效特征层经过ASPP对给定的输入以不同采样率的空洞卷积进行并行采样,相当于以多个比例捕捉图像的上下文。

python lstm 损失函数 deeplabv3+损失函数_深度学习_06


在Decoder中,我们会对压缩两次的初步有效特征层利用1x1卷积调整通道数,再和空洞卷积后的有效特征层上采样的结果进行堆叠,在完成堆叠后,进行两次深度可分离卷积块。

python lstm 损失函数 deeplabv3+损失函数_python lstm 损失函数_07


这个时候,我们就获得了一个最终的有效特征层,它是整张图片的特征浓缩。

利用特征获得预测结果

我们可以获取输入进来的图片的特征,此时,我们需要利用特征获得预测结果。
利用特征获得预测结果的过程可以分为2步:
1、利用一个1x1卷积进行通道调整,调整成Num_Classes。
2、利用resize进行上采样使得最终输出层,宽高和输入图片一样。

损失函数

本文所使用的LOSS由两部分组成:
1、Cross Entropy Loss。
2、Dice Loss。

Cross Entropy Loss就是普通的交叉熵损失,当语义分割平台利用Softmax对像素点进行分类的时候,进行使用。

Dice loss将语义分割的评价指标作为Loss,Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值范围在[0,1]。

计算公式如下:

python lstm 损失函数 deeplabv3+损失函数_pytorch_08


就是预测结果和真实结果的交乘上2,除上预测结果加上真实结果。其值在0-1之间。越大表示预测结果和真实结果重合度越大。所以Dice系数是越大越好。

如果作为LOSS的话是越小越好,所以使得Dice loss = 1 - Dice,就可以将Loss作为语义分割的损失了。

结果对比

本次训练参数如下:

epoch:40

lrate:0.1

gt

python lstm 损失函数 deeplabv3+损失函数_深度学习_09

pre

python lstm 损失函数 deeplabv3+损失函数_pytorch_10


python lstm 损失函数 deeplabv3+损失函数_python lstm 损失函数_11