嘿嘿嘿,终于到介里辣。
deeplabv3+:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
一.网络架构图1.deeplabv3+的网络架构
从上图的网络架构可以看出v3+分为了编码和解码两个模块,因为encoder-decoder架构能够进一步保护物体的边缘信息。
1.Encoder模块
在编码模块,使用的是v3的结构,其中,前面几个block中使用空洞卷积,然后再输出的特征图上使用不同atrous rate并行空洞金字塔池化去提取特征,用concat融合之后,再使用1x1卷积减少通道数。注意encoder的输出特征图的通道数是256。
亮点1:与v3不同的是,这里将空洞卷积和深度分离卷积结合,得到一个atrous separale convolution(也就是把空洞卷积应用在深度分离卷积上)。这种做法的优点在于:在维持相同性能的情况下,深度分离卷积可以大大减小计算复杂度。具体如何减少参数,加快计算可以看该链接:https://mp.weixin.qq.com/s?src=11×tamp=1564366796&ver=1757&signature=lED4eF9vusZRzG78TWD3EL1VvRtHEcT04pqVP*FuzdDtYy9*f9O9ZBrG-SVvsxkegU8T-Q7vKakX2GUAywjtBgrgtmTaa720O9iDK0vaWVeBNlPlbIxDlayhREw2OMQF&new=1mp.weixin.qq.com
2.Deconder模块
如图1所示,解码部分结合了high-level和low-level(初始通道是256或512)的信息,对于high-level信息,1x1卷积减少通道数后要进行4倍上采样;而low-level的信息也是通过1x1的卷积去减少其通道数,这两部分都是用了1x1卷积减少通道数,但是通道数更多的还是high-level的信息,因为low-level的信息只是为了解码提供更细节的上下文信息,重点还是在于解码编码的输出。二者结合之后,在用3x3的卷积去提取特征,最后上采样之后输出prediction。值得注意的是,在解码过程中,一共进行2次4倍上采样,说明outputstride=16。(对于图像识别任务,output_stride=32,而在语义分割中,outputstride=16)要将output_stride从32变成16,可以加入空洞卷积和去掉最后一个block中stride的方法(代码中将最后一个block的stride变为1)。
3.Xception
在v3+中以Xception作为主干构架,且对Xception架构进行了改变,以下是改变后的架构:图2.modified Xception架构
在Entry flow是和原来的Xception一样的,但是在middle flow中重复了16次;再者将所有的最大池化层变成带striding的深度分离卷积;最后在3x3的卷积后面都加入了BN层和Relu激励函数。
以下是原始Xception的网络架构,以作参考:图3.Xception的原始结构
到如今,倒也大致了解了它的框架及优点,若要再细致,我该去研究研究一下源码了。我走辣,看完源码再记录,我会回来滴。