语义分割之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通道。
    stage2
  • stage2由四个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:
在这里插入图片描述
原图:
在这里插入图片描述
测试输出图:
在这里插入图片描述

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

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
根据提供的引用内容,DeepLabv3是一个基于PyTorch框架的语义分割网络,它是在resnet101基础网络的基础上进行复现的。DeepLabv3源码包括以下几个部分: 1. ASPP模块:ASPP模块是DeepLabv3中的一个重要组成部分,它用于捕捉不同尺度的上下文信息。ASPP模块包括多个并行的空洞卷积层,每个卷积层具有不同的空洞率,以捕捉不同尺度的上下文信息。 2. Final_block:Final_block是DeepLabv3中的最后一个模块,它接收ASPP模块的输出作为输入,并生成num_class张分割掩码结果图。Final_block包含两个卷积层和一个上采样操作。第一个卷积层是一个3×3卷积,用于进行特征图的拼接操作。第二个卷积层是一个1×1卷积,用于改变输出通道数为num_class。最后,使用双线性插值的方式将num_class张特征图插值到输入图片的尺寸,实现输出结果的上采样。 3. 插值法:在DeepLabv3中,使用双线性插值的方式将特征图插值到输入图片的尺寸。双线性插值是一种常用的图像插值方法,它通过对周围像素的加权平均来计算新像素的值,从而实现图像的缩放或上采样。 4. aux_block分支:aux_block是DeepLabv3中的一个辅助分支,用于提供额外的监督信号。它通常在训练过程中使用,可以帮助网络更好地学习特征表示。关于aux_block分支的具体实现细节在提供的引用中没有给出。 由于没有提供具体的源码,无法给出完整的DeepLabv3源码。但是,根据提供的信息,你可以根据DeepLabv3的论文或其他开源实现来查找完整的源码
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值