当前位置:网站首页>2D 语义分割——DeepLabV3plus 复现
2D 语义分割——DeepLabV3plus 复现
2022-07-25 16:25:00 【Lemon_Yam】
语义分割简介
语义分割结合了图像分类、目标检测和图像分割,其通过一定的方法将图像分割成具有一定语义含义的区域块,并识别出每个区域块的语义类别,实现从底层到高层的语义推理过程,最终得到一幅具有逐像素语义标注的分割图像。图像语义分割方法有传统方法和基于卷积神经网络的方法,而传统的语义分割方法又可分为基于统计的方法和基于几何的方法。随着深度学习的发展,语义分割技术得到很大的进步,基于卷积神经网络的语义分割方法与传统的语义分割方法最大不同是,网络可以自动学习图像的特征,进行端到端的分类学习,大大提升语义分割的精确度。
基于候选区域的语义分割方法首先从图像中提取自由形式的区域并对他们的特征进行描述,然后再基于区域进行分类,最后将基于区域的预测转换为像素级别预测,并使用包含像素最高得分的区域来标记像素。该方法虽然为语义分割的发展带来很大的进步,但是它需要生成大量的候选区域,此过程要花费大量的时间和内存空间。此外,不同算法提取的候选区域集的质量也千差万别,这将直接影响了最终的语义分割效果。
基于全卷积的深度语义分割模型,主要特点是没有使用全连接层,全部由卷积层构成。该类模型又可细分为基于全卷积的对称语义分割模型、基于全卷积的扩张卷积语义分割模型和基于全卷积的残差网络语义分割模型。目前,基于全卷积的对称语义分割模型主要有 FCN、SegNet、Unet 及其各种变体等,但该类模型得到分割结果较粗糙,其忽略了像素与像素之间的空间一致性关系。于是 Google 提出了一种新的扩张卷积语义分割模型,考虑了像素与像素之间的空间一致性关系,可以在不增加参数量的情况下增加感受野,该类语义分割模型主要有 DeepLab 系列、RefineNet 等。此外,基于全卷积的残差网络语义分割模型主要有 PSPNet 等。其中,DeepLab 系列中的 DeepLabV3plus 的复现为本次大作业的主要工作。
目前流行的深度网络,比如 VGG,ResNet等,由于 pooling 操作和卷积步长的存在,其特征图会越来越小,从而导致损失一些细粒度的信息。对于分类问题而言,只需要深层的强语义信息就能表现较好,但是对于稠密预测问题,比如逐像素的图像分割问题,除了需要强语义信息之外,还需要较高的空间分辨率。针对这些问题,很多方法都提出了解决方案:
- 针对 pooling 下采样过程中的分辨率损失,可采用
deconvolution恢复。但是却很难恢复位置信息。 - 使用空洞卷积保持分辨率,增大感受野,但是这么做会明显增加了计算代价,且空洞卷积是一种
coarse sub-sampling,因此容易损失重要信息。 - 通过
skip connection来产生高分辨率的预测。
DeepLabV3plus
模型结构
DeepLabV3plus 是一个用于语义分割的模型,它提出了一种新的 encoder-decoder 结构,采用 DeepLabv3 作为编码器模块,并使用一个简单而有效的解码器模块。该模型可通过 atrous 卷积(空洞卷积)来控制所提取的编码器特征的分辨率,从而权衡精度和运行时间。此外,该网络还将 Xception 模型用于分割任务,并将 Depthwise Separable Convolution 应用于 ASPP 模块和解码器模块,从而得到更快更强的 encoder-decoder 网络。其网络结构如下:

- 将图像
A送进改造过后的主流深度卷积网络B(其中使用了空洞卷积)提取特征,从而得到高级语义特征C和低级语义特征E - 高级语义特征
C进入到空洞金字塔池化模块 ASPP,分别与四个空洞卷积层和一个池化层进行卷积和池化(需上采样),得到五个特征图(大小一致),然后将这些特征图拼接起来并送入一个1x1的卷积层进行运算后得到D(通道数为原先的1/5),D再经过上采样得到G(方便后面拼接操作) - 低级语义特征
E经过1x1卷积进行降通道数得到F(大小与G一致),将这两者拼接起来通过卷积层得到H(降低通道数)。将H送入3x3卷积层中并上采样至与原图大小一致后输出预测结果I
基础知识点
- 对于语义分割,空间金字塔池化(spatial pyramid pooling)模块可通过池化不同分辨率的特征图来捕获丰富的上下文信息,而 encoder-decoder 结构可以得到清晰的物体边界。通常情况下,encoder 减少特征图的大小并捕捉更高层次的语义信息,而 decoder 用来恢复空间信息。尽管丰富的语义信息存在于最后的特征图中,但由于 backbone 内部的池化或卷积操作,使得与对象边界相关的详细信息缺失。为了缓解这一问题,DeepLabV3plus 引入空洞卷积这一比较特殊的卷积操作。以下是 SPP、encoder-decoder 以及 SPP+encoder-decoder+atrous conv 的结构示意图:

- Depthwise separable convolution 是一个可以减少计算量和参数量,并保持与普通卷积类似(或略好)性能的操作,其相当于 Depthwise 卷积 + Pointwise 卷积。

Depthwise 卷积:一个通道由一个卷积核负责(即第n个通道由第n个卷积核来处理),其输出通道数与输入通道数一致
Pointwise 卷积:卷积核大小为
1x1xc,其中c为输入通道数,输出通道数与卷积核个数一致Atrous卷积:显式地控制深度卷积神经网络中计算的特征图的分辨率,并调整卷积核的感受野(field-of-view)以捕获多尺度信息
Atrous depthwise卷积:DW 卷积中的卷积核改为空洞卷积,deeplabv3+ 中使用的膨胀率为 2,如图中
(c)所示
模型实现
DeepLabV3plus 模型主体在 deeplabv3plus.py 中实现,该文件包含3个类:
- 继承自
nn.Sequential的 CBR 类,其包含卷积、批归一化和激活函数,在卷积中通过参数 dilation 来指定卷积核的膨胀率

- 继承自
nn.Module的 ASPP 类,该模块包含五个分支。branch1 卷积核大小为 1x1,而 branch5 通过池化操作可得到全局性的特征,但需通过上采样及卷积操作使特征图大小、通道大小与其他分支一致;branch2-branch4 的卷积核大小为 3,膨胀率分别为6rate、12rate、18rate,其 rate 根据 output stride 来确定,可分为1和2。

- 继承自
nn.Module的 DeepLabV3plus 类,该类的 backbone 支持 Xception、ResNet 和 MobileNetV2。其中,由于 MobileNetV2 比较轻量级,所以其输入通道(高级语义特征通道数)和低级语义特征通道数相对较小,分别为 320 和 24;骨干网络 ResNet 中参数 layers 的最后一个值在代码中并没有被我所使用,其通过一个长度等于 3 的数组代替;downsample_factor 其实就是论文中的 output stride,大小为16或8。处理低级语义特征的 shortcut_conv 的输出通道根据论文中的建议使用48。


Backbone 设计
- Xception:DeepLabV3plus 所改进的 Xception 拥有更多的 layers,其在 Middle flow 中重复使用 16 次,而原始网络仅重复 8 次。此外,所有的 max pooling 操作都改为 deepwise separable convolution 并且在
3x3的 DW 卷积操作后添加 batch normalization 和 ReLU 激活函数。该骨干网络在xception.py中实现,其网络结构如下:


- ResNet101:DeepLabV3plus 使用的 ResNet101 在网络层数上与原始 ResNet101 相同,只是后面的卷积操作使用了 dilation 来指定膨胀率。该骨干网络在
resnet.py中实现,其网络结构如下:


- MobileNetV2:该骨干网络使用倒残差结构,相对于残存结构,其将降维和升维的顺序进行了调换,并且将
3x3卷积换为3x3的 DW 卷积。此外,网络中的激活函数使用ReLU6。为了得到适用于 DeepLabV3plus 的骨干网络,可将 MobileNetV2 卷积核的膨胀率根据 output stride 来修改,但由于该网络比较轻量级,所以最后得到的低级语义特征和高级语义特征的通道数相对于 Xception 和 ResNet101 会比较小。该网络在mobilenetv2.py中实现,其网络结构如下:



实验结果
本次实验采用数据集为 VOC2012,损失函数为交叉熵损失或 Focal loss,训练集加载时仅做随机旋转、随机翻转和修改大小操作。由于本人计算机显存不足以支持较大规模训练,训练过程使用的 output stride 采用16(训练效果相对于 8 会较差),batch size 为 8(MobileNetV2)和 4(Xception 和 ResNet101)。以下是实验所使用 backbone 相应的 mIOU 值以及骨干网络为 Xception 的部分预测结果:
| Backbone | Xception | ResNet101 | MobileNetV2 |
|---|---|---|---|
| mIOU | 80.3 | 78.5 | 76.1 |
- xception 的部分预测结果

- mobilenetv2 的部分预测结果

若需要代码可以下载我上传的资源,不需要积分,但本资源不包含训练后的权重,仅供参考
边栏推荐
- Recursive menu query (recursion: check yourself)
- tkinter模块高级操作(一)—— 透明按钮、透明文本框、自定义按钮及自定义文本框
- Exclusive lock
- 从业务需求出发,开启IDC高效运维之路
- 0x80131500 solution for not opening Microsoft Store
- High score technical document sharing of ink Sky Wheel - Database Security (48 in total)
- Wechat applet does not use plug-ins, rendering videos in rich text, image adaptation, plus version
- The annualized interest rate of treasury bonds is too low. Is there a financial product with a higher annualized interest rate than the reverse repurchase of treasury bonds?
- Two methods of importing sqllite table from MySQL
- 使用Huggingface在矩池云快速加载预训练模型和数据集
猜你喜欢

leetcode:6127. 优质数对的数目【位运算找规律 + 两数之和大于等于k + 二分】

【小5聊】公众号排查<该公众号提供的服务出现故障,请稍后>

自定义mvc项目登录注册和树形菜单

Win11动态磁贴没了?Win11中恢复动态磁贴的方法

MQTT X CLI 正式发布:强大易用的 MQTT 5.0 命令行工具

Waterfall flow layout

论文笔记:Highly accurate protein structure prediction with AlphaFold (AlphaFold 2 & appendix)

使用Huggingface在矩池云快速加载预训练模型和数据集

easyui datagrid控件使用

可验证随机函数 VRF
随机推荐
[zeloengine] summary of pit filling of reflection system
tkinter模块高级操作(一)—— 透明按钮、透明文本框、自定义按钮及自定义文本框
Leetcode:154. find the minimum value II in the rotation sort array [about the middle and rear positioning dichotomy of the rotation sort array]
MySQL read / write lock
Waterfall flow layout
Record locks
mysql 表写锁
Pagehelper.startpage is not effective
MySQL 元数据锁(MDL)
MYSQL导入sqllite表格的两种方法
MQTT X CLI 正式发布:强大易用的 MQTT 5.0 命令行工具
阿唐的小帮手
Fastadmin TP installation uses Baidu rich text editor ueeditor
【小5聊】公众号排查<该公众号提供的服务出现故障,请稍后>
MySQL全局锁
Typescript learning 1 - data types
Win11自带画图软件怎么显示标尺?
0x80131500 solution for not opening Microsoft Store
意向锁(Intention Lock)
可验证随机函数 VRF