深度学习利用篇-计算机视觉-语义宰割综述[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的深度可拆散卷积代替
- 每个3x3的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时,加倍了采样率。所有特色通过1x1级联到一起,生成最终的分数。
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 在65x65尺寸特色图上应用3x3卷积时标准化计数随空洞率的变动</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