700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 语义分割之Deeplabv3源码解读

语义分割之Deeplabv3源码解读

时间:2021-03-08 04:33:35

相关推荐

语义分割之Deeplabv3源码解读

写在前面,本文的代码是基于Pytorch框架resnet101基础网络的DeepLabv3网络复现

先贴一张代码效果图:

预备知识

本文提到的output_stride来源于deeplabv3论文,指的是(输入图像的分辨率/特征图的分辨率),可以看出,output_stride越大,说明特征图越小,每个特征图网格包含的原图像素越多,越高层。【论文中resnet50对应 8, resnet101对应16】

ResNet101

ResNet101包括一个Init Block和四个stage,以及最后的Avgpool和fc。下采样了32倍。(一般的分类网络都是下采样32倍)

1.Init Block

由1个7×7的卷积层+一个maxpooling层组成,其中卷积层的stride为2,max pooling的stride=2,因此经过Init block后的输出尺寸降了4倍。 Init Block输出为64通道。

2.stage1-4

stage1-4的残差块个数依次为[3,4,23,3]

stage1

stage1由三个unit(残差单元)构成,都是1×1或3×3的小卷积,且stride都为1,因此经过stage1后的输出尺寸相对于原图还是降了4倍(与Init block的输出尺寸相同),stage1输出为256通道。

stage2stage2由四个unit组成,其中unit1的3×3卷积核stride为2,因此,经过stage2后的输出尺寸相对于原图降了8倍,stage2输出为512通道。stage3

stage3由23个unit组成,其中unit1的3×3卷积核stride为2,因此,经过stage3后的输出尺寸相对于原图降了16倍,stage3输出为1024通道。stage4

stage4由三个unit组成,所有unit的3×3卷积核stride为1,因此,经过stage4后的输出尺寸相对于原图降了16倍 ,stage4输出为2048通道。

3. Avgpooling

平均池化层,ResNet50的Avgpooling为:

AvgPool2d(kernel_size=7, stride=1, padding=0)

因为stage4输出的特征图尺寸是7x7,此时再经过一个kernel size为7的平均池化层,输出变成了2048个1x1的特征图。

4. FC

Linear(in_features=2048, out_features=1000, bias=True)

输出向量长度为num_class(分类的数量,这里为1000),后面可以接softmax等用于分类。

Deeplabv3原理分析

backbone为ResNet101的Deeplabv3结构图【其中的backbone用到了上文提到的Resnet101中的1、2两部分】

1.Init Block

输入Image【图片大小513*513】,输出tensor维度【64, 129, 129】

经过Init Block,这里的Init Block类似于ResNet101的Init Block,但是有细微差别,这里的Init Block为三个3×3卷积和一个max pooling(ResNet的Init Block是一个7×7和一个max pooling)。经过Init block后的输出尺寸降了4倍。经过Init block后的输出尺寸降了4倍。(用output_stride=4来描述) 。

2. 四个stage

4个stage分别对应的输出shape

经过stage1阶段,stage1由三个unit(残差单元)构成,且stride都为1,因此经过stage1后的输出尺寸相对于原图还是降了4倍(与Init block的输出尺寸相同)(output_stride=4) stage1输出为256通道。

经过stage2,stage2由4个unit组成,其中unit1的3×3卷积核stride为2,因此经过stage2后的输出尺寸相对于原图降了8倍(output_stride=8) stage2输出为512通道。

经过stage3,stage3由23个unit组成,其中unit1的3×3卷积核stride为2,因此经过stage3后的输出尺寸相对于原图降了16倍(output_stride=16), stage3输出为1024通道。

经过stage4,stage4由三个unit组成,其中所有unit的rate均为2(感受野变化:3x3->7x7->15x15),因此,经过stage4后的输出尺寸相对于原图降了16倍(output_stride=16),但是感受野与原图一样大。 stage4输出为2048通道。

3. ASPP(核心模块)

ASPP的输入:stage4的输出;

ASPP的输出:output_stride=16的特征图(尺寸相当于原图降了16倍),但是感受野相当于原图。

ASPP的结构包括5个branch,第一个branch为1×1卷积,中间三个branch为空洞卷积,第五个branch为全局平局池化层+1×1卷积层。五个branch做融合得到ASPP的输出。

ASPP的具体结构包括(结合模型图一起看):

第一个branch是普通的1×1卷积层前二、三、四个branch为3×3的空洞卷积层,rate分别为12,24,36(output_size=8的时候,rate依次为12,24,36,如果output_size=16,rate应该依次变成6,12,18)第五个branch论文中称为Image Pooling,是一个Avgpooling(获得全局信息)外加一个1×1卷积(改变通道数)(因为pooling无法改变通道数,而为了保证五个branch的输出通道数相等,后面必须再接一个卷积)。五个branch的输出都是256维(一共1280维),使用1×1卷积将这五个branch输出的结果进行融合(concat),最后输出256维的新特征。

4. Final_block

Final_block的输入为:ASPP的输出;

Final_block的输出为:num_class张分割掩码结果图;

Final block包含两个卷积层和一个unsampling:

一个3×3卷积做的是concat操作(过渡作用)一个1×1卷积,改变输出通道数为num_class。

再将num_class张特征图使用bilinear的方式插值到输入图片的尺寸(相当于直接上采样了16倍),至此,得到了deeplabv3的输出。

插值法相关介绍

5. 关于aux_block分支

aux_block分支与Final_block分支很像,也是由两个卷积层+upsampling构成,输出的也是num_class张分割掩码图。aux分支与Final_block的区别是,aux的输入是stage3的输出(相当于从stage3后直接输出结果。)

aux分支往往只用来训练,不用于测试。

6.训练结果记录

resnet101, batchsize = 16, epoch = 50,block4,val score:

原图:

测试输出图:

另,有需要代码的小伙伴可以留下邮箱…

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。