共计 12746 个字符,预计需要花费 32 分钟才能阅读完成。
深度学习利用篇 - 计算机视觉 - 语义宰割综述[6]:DeepLab 系列简介、DeepLabV3 深刻解读翻新点、训练策略、次要奉献
0.DeepLabV3 深刻解读
1、DeepLab 系列简介
1.1.DeepLabV1
作者发现 Deep Convolutional Neural Networks (DCNNs) 可能很好的解决的图像级别的分类问题,因为它具备很好的平移不变性(空间细节信息已高度形象),然而 DCNNs 很难解决像素级别的分类问题,例如姿势预计和语义宰割,它们须要精确的地位信息。
1.1.1 翻新点:
- 将深度神经网络 DCNN 与全连贯 CRF 联合起来,进步图像宰割的宰割精度。
- 提出空洞卷积的思维。
- 利用尝试了多尺度、多层次的信息交融。
1.1.2. 动机:
DCNN 利用在语义宰割工作上存在两个缺点:
- 反复重叠的 池化 和下采样 操作导致分辨率大幅降落,地位信息失落难以复原。
- 从分类器取得以对象为核心的决策须要空间转换的不变性,疏忽对细节处的把控,这从实质上限度了 DCNN 模型的空间准确性。
分类工作具备空间不变性,图像的仿射变换不会影响最初的分类后果,而且恰好通过仿射变换等操作(数据增广)能够减少数据量,进步模型的精度;然而像宰割和检测这类问题,不具备空间不变性。
1.1.3. 应答策略:
- 空洞卷积
- Fully-connected Conditional Random Field (CRF)
1.2.DeepLabV2
1.2.1. 翻新点:
- 空洞卷积,作为密集预测工作的弱小工具。空洞卷积可能明确地管制 DCNN 内计算特色响应的分辨率。它还容许咱们无效地扩充滤波器的视线以并入较大的上下文,而不减少参数的数量或计算量。
- 提出了空洞空间卷积池化金字塔(atrous spatial pyramid pooling (ASPP)),以多尺度的信息失去更准确的宰割后果。ASPP 并行的采纳多个采样率的空洞卷积层来探测,以多个比例捕获对象以及图像上下文。
- 通过组合 DCNN 和概率图模型(CRF),改良宰割边界后果。在 DCNN 中最大池化和下采样组合实现可平移不变性,但这对精度是有影响的。通过将最终的 DCNN 层响应与全连贯的 CRF 联合来克服这个问题。
1.2.2. 动机
DCNNs 中语义宰割存在三个挑战:
- 间断下采样和池化操作,导致最初特色图分辨率低。
- 图像中存在多尺度的物体(相比 V1 而言提出的新的挑战)
- 空间不变性导致细节信息失落
1.2.3. 应答策略:
- 移除局部池化操作,应用空洞卷积。
- 利用不同收缩因子的空洞卷积交融多尺度信息—atrous spatial pyramid pooling(ASPP)(新的翻新点)
- 全连贯 CRF。
1.3.DeepLabV3
1.3.1 翻新点:
- 减少了多尺度 (multiple scales) 宰割物体的模块
- 设计了串行和并行的空洞卷积模块,采纳多种不同的 atrous rates(采样率)来获取多尺度的内容信息
1.3.2. 动机:
DCNN 中语义宰割存在三个挑战:
- 间断下采纳和反复池化,导致最初特色图分辨率低
- 图像中存在多尺度的物体
1.3.3. 应答策略:
- 应用空洞卷积,避免分辨率过低状况
- 串联不同膨胀率的空洞卷积或者并行不同膨胀率的空洞卷积(v2 的 ASPP),来获取更多上下文信息
1.3.4. 次要奉献:
- 从新探讨了空洞卷积的应用,这让咱们在级联模块和空间金字塔池化的框架下,可能获取更大的感触野从而获取多尺度信息
- 改良了 ASPP 模块:由不同采样率的空洞卷积和 BN 层组成,咱们尝试以级联或并行的形式布局模块
- 探讨了一个重要问题:应用大采样率的 3×3 的空洞卷积,因为图像边界的起因无奈捕获远距离信息,会进化为 1×1 的卷积, 作者提出将图像级特色交融到 ASPP 模块中
- 论述了训练细节并分享了训练教训,论文提出的 ”DeepLabv3″ 改良了以前的工作,取得了很好的后果
1.4.DeepLabV3+
1.4.1. 翻新点:
- 更深的 Xception 构造,不同的中央在于不批改 entry flow network 的构造,为了疾速计算和无效的应用内存
- 所有的 max pooling 构造被 stride= 2 的深度可拆散卷积代替
- 每个 3 ×3 的 depthwise convolution 都跟 BN 和 Relu
- 将改良后的 Xception 作为 encodet 骨干网络,替换本来 DeepLabv3 的 ResNet101
1.4.2. 动机:
语义宰割次要面临两个问题:
- 物体的多尺度问题(DeepLabV3 解决)
- DCNN 的多次下采样会造成特色图分辨率变小,导致预测精度升高,边界信息失落(DeepLabV3+ 解决指标)
1.4.3. 应答策略:
- 改良 Xception,层数减少
- 将所有最大值池化层替换为带步长的深度可拆散卷积层
2、DeepLabV3 详解
2.1. 提出问题
首先,语义宰割问题存在两大挑战:
- 第一个挑战:间断池化操作或卷积中的 stride 导致的特色分辨率升高。这使得 DCNN 可能学习更形象的特色示意。然而,这种不变性可能会妨碍密集预测工作,因为不变性也导致了具体空间信息的不确定。为了克服这个问题,提倡应用空洞卷积。
- 第二个挑战:多尺度物体的存在。几种办法曾经被提出来解决这个问题,在本文中咱们次要思考了这些工作中的四种类型,如图 1 所示。
图 1 用于捕捉多尺度上下文的代替体系结构
- 第一种:Image Pyramid,将输出图片放缩成不同比例,别离利用在 DCNN 上,将预测后果交融失去最终输入
- 第二种:Encoder-Decoder,将 Encoder 阶段的多尺度特色使用到 Decoder 阶段上来复原空间分辨率
- 第三种:在原始模型的顶端叠加额定的模块,以捕获像素间长距离信息。例如 Dense CRF,或者叠加一些其余的卷积层
- 第四种:Spatial Pyramid Pooling 空间金字塔池化,应用不同采样率和多种视线的卷积核,以捕获多尺度对象
DeepLabV3 的提出是为了解决多尺度下的指标宰割问题。如图 2 所示,不同指标在图中的尺寸大小不同,这也导致模型思考不同尺寸的宰割精度。
图 2 多尺度指标宰割示例
2.2. 提出解决方案
2.2.1. 用级联的形式设计了空洞卷积模块
具体而言,DeepLabV3 取 ResNet 中最初一个 block(ResNet 的 block4),并将他们级联到了一起,如图 3 所示。
<center> 图 3 带 Atrous 和不带 Atrous 卷积的级联模块 </center>
有三个 3×3 卷积在这些块中,除了最初一个块,其余的模块中最初的一个卷积步长为 2,相似于原来的 ResNet。这么做背地的动机是,引入的 stride 使得更深的模块更容易捕捉长距离的信息。如图 3(a),整个图像的特色都能够汇聚在最初一个小分辨率的特色图中。
然而,咱们发现间断的 stride 对语义宰割是无害的,会造成细节信息的失落(如下表)。
<center> 表 1 应用 ResNet-50 和 block7 和不同的输入步长的更深层空洞卷积 </center>
从表中看得出,输入步长 out_stride = 8 时占用更多的内存,但同时带来了更好的性能。例如图 3(b)中,输入步长为 out_stride = 16。这样不减少参数量和计算量的同时无效的放大了步幅。
2.2.2. 应用了 Multi-Grid 策略
受到了采纳不同大小网格层次结构的多重网格办法的启发,咱们提出的模型在 block4 和 block7 中采纳了不同的空洞率。
特地的,咱们定义 $ Multi\_Grid = ({r_1},{r_2},{r_3}) $ 为 block4 到 block7 内三个卷积层的 unit rates。卷积层的最终空洞率等于 unit rate 和 corresponding rate 的乘积。例如,当 $ output\_stride = 16,Multi\_Grid = (1,2,4)$,三个卷积就会在 block4 有。$ rates = 2 \cdot (1,2,4) = (2,4,8)$
2.2.3. 将 batch normalization 退出到 ASPP 模块.
Atrous Spatial Pyramid Pooling(ASPP):
<center> 图 6 Deeplab 系列 ASPP 构造 </center>
上图是 DeeplabV2 中的 ASPP,在特色顶部映射图应用了四中不同采样率的空洞卷积。我这表明以不同尺度采样时无效的,在 Deeolabv3 中向 ASPP 中增加了 BN 层。不同采样率的空洞卷积能够无效捕捉多尺度信息,但会发现随着采样率的减少,滤波器无效权重(权重无效的利用在特色区域,而不是填充 0)逐步变小。
当 output_stride= 8 时,加倍了采样率。所有特色通过 1 ×1 级联到一起,生成最终的分数。
ASPPModule 代码:
class ASPPModule(nn.Layer):
"""
Atrous Spatial Pyramid Pooling.
Args:
aspp_ratios (tuple): The dilation rate using in ASSP module.
in_channels (int): The number of input channels.
out_channels (int): The number of output channels.
align_corners (bool): An argument of F.interpolate. It should be set to False when the output size of feature
is even, e.g. 1024x512, otherwise it is True, e.g. 769x769.
use_sep_conv (bool, optional): If using separable conv in ASPP module. Default: False.
image_pooling (bool, optional): If augmented with image-level features. Default: False
"""
def __init__(self,
aspp_ratios,
in_channels,
out_channels,
align_corners,
use_sep_conv=False,
image_pooling=False,
data_format='NCHW'):
super().__init__()
self.align_corners = align_corners
self.data_format = data_format
self.aspp_blocks = nn.LayerList()
for ratio in aspp_ratios:
if use_sep_conv and ratio > 1:
conv_func = layers.SeparableConvBNReLU
else:
conv_func = layers.ConvBNReLU
block = conv_func(
in_channels=in_channels,
out_channels=out_channels,
kernel_size=1 if ratio == 1 else 3,
dilation=ratio,
padding=0 if ratio == 1 else ratio,
data_format=data_format)
self.aspp_blocks.append(block)
out_size = len(self.aspp_blocks)
if image_pooling:
self.global_avg_pool = nn.Sequential(
nn.AdaptiveAvgPool2D(output_size=(1, 1), data_format=data_format),
layers.ConvBNReLU(
in_channels,
out_channels,
kernel_size=1,
bias_attr=False,
data_format=data_format))
out_size += 1
self.image_pooling = image_pooling
self.conv_bn_relu = layers.ConvBNReLU(
in_channels=out_channels * out_size,
out_channels=out_channels,
kernel_size=1,
data_format=data_format)
self.dropout = nn.Dropout(p=0.1) # drop rate
def forward(self, x):
outputs = []
if self.data_format == 'NCHW':
interpolate_shape = paddle.shape(x)[2:]
axis = 1
else:
interpolate_shape = paddle.shape(x)[1:3]
axis = -1
for block in self.aspp_blocks:
y = block(x)
y = F.interpolate(
y,
interpolate_shape,
mode='bilinear',
align_corners=self.align_corners,
data_format=self.data_format)
outputs.append(y)
if self.image_pooling:
img_avg = self.global_avg_pool(x)
img_avg = F.interpolate(
img_avg,
interpolate_shape,
mode='bilinear',
align_corners=self.align_corners,
data_format=self.data_format)
outputs.append(img_avg)
x = paddle.concat(outputs, axis=axis)
x = self.conv_bn_relu(x)
x = self.dropout(x)
return x
2.2.4. 将全局上下文信息纳入模型
具备不同 atrous rates 的 ASPP 可能无效的捕捉多尺度信息。不过,论文发现,随着 sampling rate 的减少,无效 filter 特色权重 (即无效特色区域,而不是补零区域的权重) 的数量会变小,极其状况下,当空洞卷积的 rate 和 feature map 的大小统一时,$ 3~\times 3 $ 卷积会进化成 $ 1~\times 1 $:
<center> 图 4 在 65×65 尺寸特色图上应用 3 ×3 卷积时标准化计数随空洞率的变动 </center>
为了克服这个问题,并将全局上下文信息纳入模型,采纳了图像级特色。具体来说,在模型的最初一个特色图采纳全局均匀池化,将从新生成的图像级别的特色提供给带 256 个滤波器 (和 BN) 的 1×1 卷积,而后双线性插值将特色晋升到所需的空间维度。
最初改良后的 ASPP 包含:
- (a)一个 $ 1~\times 1 $ 的卷积与三个 $ 3~\times 3 $ 的 $ rates = (6,12,18) $ 的空洞卷积,滤波器数量都为 256,蕴含 BN 层。针对 output_stride=16 的状况
- (b)图像级特色,如图 5 所示。当 output_stride= 8 时,加倍了采样率。而后将所有分支的特色图通过一个 $ 1~\times 1 $ 卷积(有 256 个滤波器和 BN)concatenate 起来,送入最初的 1×1 卷积以产生最终分数.
<center> 图 5 ASPP,减少了多级特色图 </center>
2.2.5. 勾销 DenseCRF
CRF
CRF 的全称是 Conditional Random Field. 它的模式如下所示:
$$
{\rm{P}}(Y|X) = \frac{1}{{Z(X)}}\tilde P(Y,X)
$$
$$
\tilde P(Y,X) = \exp (\sum\limits_i {{w_i} * {f_i}(Y,X)} )
$$
$$
Z(X) = \sum\limits_Y {\exp (\sum\limits_i {{w_i} * {f_i}(Y,X)} )}
$$
能够看出,条件随机场在建模的时候同样须要计算联结概率,只不过这一次参加计算的有两局部随机变量——X 和 Y。一般来说,咱们把 X 称作察看变量,也就是已知的变量;Y 称作指标变量或者隐含变量,是咱们想晓得的变量。
比方说图像宰割的问题,X 就是图像的像素,Y 就是每个像素所归属的类别。当然对于二维的图像问题还是有点简单,那么咱们用一个简略的一维问题做了例子:比方说自然语言解决中的词性标注问题,那么它的建模模式如下所示:
$$
\tilde P(Y,X) = \exp (\sum\limits_i {{f_1}({X_i},{Y_i}) + {f_2}({Y_i},{Y_{i + 1}})} )
$$
Dense CRF
咱们看过了它的模型模式,上面间接来看看模型的能量函数表达形式:
$$
E(x) = \sum\limits_i {{\varphi _u}({x_i}) + } \sum\limits_{i < j} {{\varphi _p}({x_i},{x_j})}
$$
能够看出每一个像素都有一个 unary 的函数,也就是说在这个特征函数里 w,剩下的参数都呈现在图像的像咱们只思考以后像素的类别,而临时不思考别的像素的类别信息。
而前面的 pairwise 函数里,每一个像素的类别都和其余像素计算一个 energy feature。于是就有了下面的公式模式。留神这里的能量函数是所有像素点的联结能量和不是某一个像素点的能量,所以前面的 pairwise 项,咱们有 n(n-1)/ 2 组特色,总的来说,特色数量是像素数量的平方级别,如果咱们有一张 100 万像素的图片,那么咱们就会建设 4950 亿组 pairwise 特色。正是因为这种简单的模式,所以这个模型被称作 Dense CRF。满满的全是 dense 啊!
对于 unary 函数的内容,咱们能够纵情施展,在 denseCRF 中咱们并没有对这一部分做具体的限度。因而对于这部分咱们就临时略去不谈了,在前面的文章中咱们会从新回来,开掘 unary 函数的后劲。上面咱们专一于解决 pairwise 这个大坑。
上面咱们讲 piarwise 局部开展,其中
$$
{\varphi _p}({x_i},{x_j}) = \mu ({x_i},{x_j})\sum\limits_{m = 1}^K {{w^{(m)}}{k^{(m)}}({f_i},{f_j})}
$$
能够看出,pairwise 函数中还是比较复杂的,咱们从左往右以此介绍。
首先是 $ \mu ({x_i},{x_j}) $,这一项被称作 label compatibility 项,简略来说这里束缚了“力”传导的条件,只有雷同 label 条件下,能量才能够互相传导。具体来说,“一个像素可能是飞机”的能量能够和“另一个像素可能是飞机”的能量互相传导,从而减少或者缩小后者“可能是飞机”的能量,从而影响“可能是飞机”的概率,而“一个像素可能是飞机”的能量是不能影响“另一个像素是人”的概率的。
文章中也提到了,这个简略地一刀切仿佛有点不兽性。拿 Pascal-VOC 中的 20 类 + 背景类来说,有些类别之间的相似性是很强的,而另外一些类别则齐全不类似,所以作者前面提到了一些学习相干的事件,这里咱们就不再深刻上来了。
加和项外面就是经典的权重 *feature 的套路了,其中
$$
k(m)({f_i},{f_j}) = {w^{(1)}}\exp (– \frac{{{{\left| {{p_i} – {p_j}} \right|}^2}}}{{2\theta _\alpha ^2}} – \frac{{{{\left| {{I_i} – {I_j}} \right|}^2}}}{{2\theta _\beta ^2}}) + {w^{(2)}}\exp (– \frac{{{{\left| {{p_i} – {p_j}} \right|}^2}}}{{2\theta _\gamma ^2}})
$$
这一项以特色的模式示意了不同像素之前的“亲密度”。后面咱们提到了特色不同于 tabular 模式的 factor,咱们看不到表格,只能看到公式。下面的公式中,第一项被称作 appearance kernel,第二项被称作 smooth kernel。这外面有很多变量,咱们一一来看。
appearance kernel 外面的 p 示意像素的地位——position,咱们的图像是 2 维的,那么 position 就有 2 维。I 示意图像的像素值——Intensity,咱们的图像是黑白的,那么 Intensity 就有 3 维。分式上面的两个参数无论从地位还是长相都像高斯分布中的方差,这里的含意也差不多的。
于是乎咱们能够看出,如果两个像素间隔近且色彩近,那么这个 feature 特色就会很强,反之则不强。同时分母也管制了强弱性,分母越大越难强起来。其实这一项和图像处理中的 bilateral filter 很像。咱们相当于在一个 5 维的空间内寻找相近的像素对并给予它们的特色增强。
DeepLabV3 勾销 DenseCRF 的起因
语义宰割与分类不同。分类次要是辨认物体,而语义宰割岂但要辨认物体,还要找出物体的地位信息。DCNN 卷积网络越深,其地位信息失落的越重大。所以在 deeplab v1/v2 中用到了,全局 CRF 加强其地位信息。
然而在 deeplabv3 中,应用大采样率的 3X3 空洞卷积,图像边界响应无奈捕获远距离信息,会进化为 1×1 的卷积, 所以 deeplabv3 将图像级特色交融到 ASPP 模块中。交融图像级特色,相当于交融了其地位信息。所以就不须要最初再用 CRF 了。这就是用了 CRF,其精度也减少的不多的起因。
2.3. 训练策略
2.3.1.Learning rate policy:
- 采纳 poly 策略,在初始学习率根底上乘 $ {(1 – \frac{{iter}}{{\max iter}})^{power}} $, 其中 $ power = 0.9 $
2.3.2.Crop size:
- 为了大采样率的空洞卷积可能无效,须要较大的图片大小;否则,大采样率的空洞卷积权值就会次要用于 padding 区域。
- 在 Pascal VOC 2012 数据集的训练和测试中咱们采纳了 513 的裁剪尺寸。
2.3.3.Batch normalization:
- 咱们在 ResNet 之上增加的模块都包含 BN 层
- 当 output_stride=16 时,采纳 batchsize=16,同时 BN 层的参数做参数衰减 0.9997。
- 在加强的数据集上,以初始学习率 0.007 训练 30K 后,解冻 BN 层参数,而后采纳 output_stride=8,再应用初始学习率 0.001 在 PASCAL 官网的数据集上训练 30K。
- 训练 output_stride=16 比 output_stride= 8 要快很多,因为其中间的特色映射在空间上小四倍。但 output_stride=16 在特色映射上绝对毛糙,快是因为就义了精度。
2.3.4.Upsampling logits:
- 在先前的工作上,咱们是将 output_stride= 8 的输入与 Ground Truth 下采样 8 倍做比拟。
- 当初咱们发现放弃 Ground Truth 更重要,故咱们是将最终的输入上采样 8 倍与残缺的 Ground Truth 比拟。
2.3.5.Data augmentation:
在训练阶段,随机缩放输出图像 (从 0.5 到 2.0) 和随机左 - 右翻转
2.4. 次要代码
DeepLabV3
class DeepLabV3(nn.Layer):
"""
The DeepLabV3 implementation based on PaddlePaddle.
The original article refers to
Liang-Chieh Chen, et, al. "Rethinking Atrous Convolution for Semantic Image Segmentation"
(https://arxiv.org/pdf/1706.05587.pdf).
Args:
Please Refer to DeepLabV3P above.
"""
def __init__(self,
num_classes, #宰割类别数
backbone, # 骨干网络
backbone_indices=(3,),
aspp_ratios=(1, 6, 12, 18), # aspp 空洞卷积率
aspp_out_channels=256, # aspp 输入通道数
align_corners=False, # 是否对齐
pretrained=None): # 是否预处理
super().__init__()
self.backbone = backbone #骨干网络
backbone_channels = [backbone.feat_channels[i] for i in backbone_indices
]
#定义头模块
self.head = DeepLabV3Head(num_classes, backbone_indices,
backbone_channels, aspp_ratios,
aspp_out_channels, align_corners)
self.align_corners = align_corners
self.pretrained = pretrained
self.init_weight() # 初始化权重
def forward(self, x):
feat_list = self.backbone(x)
logit_list = self.head(feat_list)
return [
# 执行上采样,填充形式应用‘bilinear’F.interpolate(
logit,
paddle.shape(x)[2:],
mode='bilinear',
align_corners=self.align_corners) for logit in logit_list
]
def init_weight(self):
if self.pretrained is not None:
utils.load_entire_model(self, self.pretrained) # 载入预处理模型
DeepLabV3Head
class DeepLabV3Head(nn.Layer):
"""
The DeepLabV3Head implementation based on PaddlePaddle.
Args:
Please Refer to DeepLabV3PHead above.
"""
def __init__(self, num_classes, backbone_indices, backbone_channels,
aspp_ratios, aspp_out_channels, align_corners):
super().__init__()
#定义 ASPP 模块
self.aspp = layers.ASPPModule(
aspp_ratios,
backbone_channels[0],
aspp_out_channels,
align_corners,
use_sep_conv=False,
image_pooling=True)
#定义分类头
self.cls = nn.Conv2D(
in_channels=aspp_out_channels,
out_channels=num_classes,
kernel_size=1)
self.backbone_indices = backbone_indices
def forward(self, feat_list):
logit_list = []
x = feat_list[self.backbone_indices[0]]
x = self.aspp(x)
logit = self.cls(x)
logit_list.append(logit)
return logit_list
3. 试验后果
咱们首先试验级联更多的空洞卷积模块。
ResNet50:
应用 ResNet-50 时,咱们探索 output_stride 的影响。如表 1 所示。
- 当 output_stride 为 256 时,因为重大的信号抽取,性能相比其余 output_stride 大大的降落了。
- 当应用不同采样率的空洞卷积时,性能回升,这阐明了语义宰割中应用空洞卷积的必要性。
ResNet-50 vs. ResNet-101:
用更深的模型,并扭转级联模块的数量。
<center> 表 2 应用不同叠块数的 ResNet-50 和 ResNet-101 时,应用输入步长 Output_stride= 16</center>
- 当 block 减少,性能也随之减少。
- 随着增加更多的 block,晋升变得更小。
- 值得注意的是,ResNet-50 应用 block7 会略微升高性能,同时 ResNet-101 应用后依然能够晋升性能。
Multi-grid:
采纳 Multi-gird 策略,在 ResNet-101 应用变体残差模块。block4 和其余增加进来的 block 中,主分支中的三个卷积都应用空洞卷积,采样率设置 Multi-gird 策略。
<center> 表 3 应用 ResNet-101 对不同叠块数采纳多重网格法,Output_stride = 16。</center>
试验察看到的:
- 利用 Multi-gird 策略通常比单倍数 $ ({r_1},{r_2},{r_3}) = (1,1,1) $ 成果要好
- 简略的晋升倍数例如 $ ({r_1},{r_2},{r_3}) = (2,2,2) $ 是有效的
- 减少网络深度再配合 Multi-gird 能够晋升性能。图中最好的模型即 block7 下 $ ({r_1},{r_2},{r_3}) = (1,2,1) $
Inference strategy on val set:
模型训练阶段应用 output_stride=16,在推理过程中利用 output_stride= 8 以取得更精密的特色图。
<center> 表 4 推理策略. MG: 多重网络. OS: 输入步长. MS: 多尺度输出. Flip: 输出左右翻转.</center>
- 评估时 output_stride= 8 比 output_stride=16 性能进步了 1.39%。
- 应用多尺度输出 (scales={0.5, 0.75, 1.0, 1.25, 1.5, 1.75}) 和左 - 右翻转,进行数据加强后,进一步提高了性能。
- 最初,计算每个尺度和翻转图像的均匀概率来作为最终后果。
Atrous Spatial Pyramid Pooling:
DeepLab V3 的 ASPP 模块与 DeepLab V2 的次要区别在于,减少了 BN 层,减少了图像级别的特色。表 5 记录了 ASPP 模块 block4 应用 multi-grid 策略和图像级特色后的成果。
<center> 表 5 在 Output_stide = 16 下,应用多重网格办法和图像级特色的 ASPP</center>
Inference strategy on val set:
推断期间应用 output_stride = 8,采纳多尺度输出和左 - 右翻转数据加强。
<center> 表 6 推理策略 MG:多重网格办法。ASPP:空洞空间金字塔。OS:Output_stride。MS:多尺度输出。Flip:输出左右翻转。COCO:在 MS-COCO 上预训练。</center>
4. 总结
总的来说,本文从 DeepLab 系列登程,别离介绍了各版本的 Deeplab 的动机,并给予动机进行改良的翻新点和策略。而后针对 DeeplabV3 具体的解释了该模型从问题的提出到试验后果相干内容。从解决问题的角度登程,DeeplabV3 次要解决了物体的多尺度问题,在 DCNN 问题上并没有进行深刻探讨。DCNN 的多次下采样会造成特色图分辨率变小,导致预测精度升高,边界信息失落,该问题于 DeeplabV3+ 中进行了深刻的探讨与解决。从试验后果来看,DeeplabV3 体现出相较于以前版本更好的性能。
更多文章请关注公重号:汀丶人工智能
参考文献
[1] Rethinking Atrous Convolution for Semantic Image Segmentation