【语义分割|代码解析】空洞卷积!DSNet-1: A Novel Way to Use Atrous Convolutions in Semantic Segmentation
【语义分割|代码解析】空洞卷积!DSNet-1: A Novel Way to Use Atrous Convolutions in Semantic Segmentation
文章目录
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz
论文地址:https://arxiv.org/pdf/2406.03702v1
前言
DSNet模型是一种基于膨胀卷积(Atrous Convolution)的语义分割网络,应用在遥感图像分析中能够提高对复杂场景的细节捕捉能力。DSNet模型的整体结构包括多尺度特征提取、特征融合以及分割头输出,以下是对代码的逐层解析,帮助理解每一个模块的功能和设计思想。
1. DSNet总体结构概述
DSNet模型的主要结构由以下模块组成:
- I分支(Image Branch):用于对输入图像进行初步卷积和降采样。
- 多尺度特征提取层:使用基本块(BasicBlock)、瓶颈块(Bottleneck)和膨胀卷积等结构,从不同尺度提取特征。
- 特征融合模块:多尺度特征在不同阶段进行融合,以增强语义信息。
- 空间金字塔池化(Spatial Pyramid Pooling, SPP)模块:用于捕获多尺度上下文信息。
- 分割头(Segment Head):将多尺度特征进行解码并输出语义分割结果。
下面对关键部分进行逐句解析。
2. 初始化与基本配置
BatchNorm2d = nn.BatchNorm2d
bn_mom = 0.1
algc = False
- 以上代码定义了批归一化的常数,其中
bn_mom
表示批归一化层的动量,BatchNorm2d
直接调用PyTorch的批归一化模块,保持数据分布稳定。
3. DSNet类初始化
class DSNet(nn.Module):
def __init__(self, m=2, n=3, num_classes=19, planes=64, name='s128', augment=True):
super(DSNet, self).__init__()
self.augment = augment
self.name = name
- 该模型构造函数中,
m
和n
分别控制层数,num_classes
定义分类类别数量,planes
是通道基数,name
决定模型结构的配置。augment
用于选择是否进行数据增强训练。
4. I分支(初始卷积层)
self.conv1 = nn.Sequential(
nn.Conv2d(3, planes, kernel_size=3, stride=2, padding=1),
BatchNorm2d(planes, momentum=bn_mom),
nn.ReLU(inplace=True),
nn.Conv2d(planes, planes, kernel_size=3, stride=2, padding=1),
BatchNorm2d(planes, momentum=bn_mom),
nn.ReLU(inplace=True),
)
- 作用:该分支对输入图像进行初步卷积、下采样和激活,将特征通道从RGB扩展到指定通道数
planes
。 - 卷积操作:使用两个3x3卷积层,步长为2,每层之后接批归一化和ReLU激活,最终输出大小为原始输入的四分之一。
5. 多尺度特征提取层
self.layer1 = self._make_layer(BasicBlock, planes, planes, m)
self.layer2 = self._make_layer(BasicBlock, planes, planes * 2, m, stride=2)
- 通过调用
_make_layer
方法,构造了多个包含基本块的特征提取层。layer1
和layer2
分别提取低级和中级特征。
6. MFACB多尺度膨胀卷积块
self.layer3 = nn.Sequential(
MFACB(planes * 2, planes * 2, planes * 4, dilation=[2,2,2]),
MFACB(planes * 4, planes * 4, planes * 4, dilation=[2,2,2]),
MFACB(planes * 4, planes * 4, planes * 4, dilation=[3,3,3]),
)
- 作用:利用不同膨胀率的卷积捕获多尺度特征。
- MFACB模块:此模块使用多尺度膨胀卷积(Multi-Scale Atrous Convolutional Block),通过不同膨胀率
[2,2,2]
和[3,3,3]
,获取更大感受野下的特征。
7. SPP模块与融合层
self.spp = SPASPP(planes*4, planes*4, planes*4)
- SPASPP模块:即空间金字塔池化模块,用于捕获更多的上下文信息,使模型能够适应不同的目标尺度。
- 融合层:特征融合层结合了浅层和深层的特征,以增强对细节的解析力。
Muti_AFF
模块用于融合不同尺度的特征。
8. 输出分割头
self.lastlayer = segmenthead_c(planes*5, planes*4, num_classes)
- 分割头:
segmenthead_c
是分类头,将提取到的多尺度特征进行解码并输出至最终的分割结果。 - 功能:用于将提取的多尺度特征整合到语义分类中,输出与输入图像大小一致的预测结果。
9. 前向传播forward
方法解析
在forward
中,输入图像经过初始卷积层处理后,依次通过不同层级的特征提取层、膨胀卷积块、SPP和特征融合模块,最终获得高分辨率分割结果。
def forward(self, x):
width_output = x.shape[-1]
height_output = x.shape[-2]
x = self.conv1(x)
x = self.layer1(x)
x_a = self.layer1_a(x)
x = self.relu(self.layer2(self.relu(x)))
- 步骤1:初始卷积和特征提取(
conv1
和layer1
)。 - 步骤2:将低级特征(
x_a
)保留备用,用于后续拼接增强精度。
x_ = self.layer3_(x)
x = self.layer3(x)
x_ = self.aff1(x_, self.compression3(x))
if self.augment:
temp_1 = x_
- 步骤3:通过
layer3
和layer3_
提取不同尺度的特征,并利用AFF
(Adaptive Feature Fusion)模块进行特征压缩和融合。
x = self.layer4(x)
x_ = self.layer4_(self.relu(x_))
x_ = self.aff2(x_, self.compression4(x))
- 步骤4:进一步提取深层特征,进行多尺度特征融合。
x_ = self.lastlayer(x_)
x_ = F.interpolate(x_, size=[height_output, width_output], mode='bilinear', align_corners=False)
- 最终输出:通过分割头获取最终分割结果,并进行上采样使其恢复至输入图像的大小。
10. 训练与推理模式
def get_seg_model(cfg, imgnet_pretrained):
if 's' in cfg.MODEL.NAME:
if cfg.MODEL.NAME == 'dsnet_head128':
model = DSNet(m=2, n=2, num_classes=cfg.DATASET.NUM_CLASSES, planes=32, name='s128', augment=True)
- 获取分割模型:根据不同的输入参数
cfg
和name
选择不同的分辨率配置,支持多种输入尺寸(如s128
,s64
,s256
)。
总结
DSNet的设计特点在于使用膨胀卷积块、SPP模块、多尺度特征融合等技术以捕捉复杂的上下文信息,适应不同的目标尺寸,同时有效利用了浅层和深层的特征。
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文:
可访问艾思科蓝官网,浏览即将召开的学术会议列表。会议入口:https://ais.cn/u/mmmiUz