A Deeply Supervised Attention Metric-Based Network and an Open Aerial Image Dataset for Remote Sensing Change Detection
摘要
因为CD结果很容易受到外部因素的影响,包括照明、噪声和尺寸,从而导致检测图中出现伪变化和噪声(需要提取高级特征)。DSAMNet中使用了度量模块,该模块集成了卷积块注意力模块(CBAM),引入DS模块来增强特征抽取器的学习能力并生成更多有用的特征。此外因为数据集较少本文采用(SYSU)-CD。
一、介绍
CD对许多领域都具有重要意义,包括环境调查、地质灾害监测、土地覆盖调查和城市规划。近几十年来,由于生态环境的恶化,对土地覆盖变化的定期监测和分析变得越来越重要。同时,可以在不同地区获得高分辨率多源和多时相遥感图像,由于其覆盖范围广、时间分辨率高和数据类型多样,已被证明是变化检测(CD)原始数据的关键来源。
传统的方法(CVA、PCA、MAD)利用遥感图像中的光谱信息来检测变化,但是这类方法要在决策阶段选择最佳阈值,使得传统方法过分依赖场景且耗时。
机器学习方法(支持向量机、决策树、随机森林)可以自动决策,但是这些方法严重依赖手工制作的特征,难以有效捕获高级特征表示,导致精度较低。
现阶段,深度学习方法可以自动提取高级特征,主要分两个方面:1)提取具有独特变化信息的特征(Unet++);2)设计决策函数,以根据提取的特征生成变化图(Siamese)。
本文提供了一个全新的大型数据集用来得到具有更好新能的模型、将Siamese提取器和深度监督(DS)结合增强特征提取器的能力、引入CBAM模块使来自不同相位的特征在信道和空间方面都更容易区分。
二、相关方法
传统方法:将简单代数应用于获得查分图像作为特征,包括图像比率、图像差分和图像回归。由于严重依赖图像的统计特性,提出了基于典型相关分析的MAD来学习两个分量之间的相关性。虽然这些方法易于实现,但在浅层提取特征和重复阈值调整以生成变化图的情况下,难以满足大规模、细粒度的CD。
深度学习方法:CNN、Siamese等
三、方法介绍
1、预备知识
CBAM:
https://zhuanlan.zhihu.com/p/101590167
https://blog.csdn.net/m0_45447650/article/details/123983483
1 class ChannelAttention(nn.Module):
2 def __init__(self, in_planes, ratio=16):
3 super(ChannelAttention, self).__init__()
4 self.avg_pool = nn.AdaptiveAvgPool2d(1)
5 self.max_pool = nn.AdaptiveMaxPool2d(1)
6
7 self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
8 self.relu1 = nn.ReLU()
9 self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
10 self.sigmoid = nn.Sigmoid()
11
12 def forward(self, x):
13 avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))
14 max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))
15 out = avg_out + max_out
16 return self.sigmoid(out)
17
18 class SpatialAttention(nn.Module):
19 def __init__(self, kernel_size=7):
20 super(SpatialAttention, self).__init__()
21
22 assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
23 padding = 3 if kernel_size == 7 else 1
24
25 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
26 self.sigmoid = nn.Sigmoid()
27
28 def forward(self, x):
29 avg_out = torch.mean(x, dim=1, keepdim=True)
30 max_out, _ = torch.max(x, dim=1, keepdim=True)
31 x = torch.cat([avg_out, max_out], dim=1)
32 x = self.conv1(x)
33 return self.sigmoid(x)
34
35
36 class CBAM(nn.Module):
37 def __init__(self, in_planes, ratio, kernel_size):
38 super(CBAM, self).__init__()
39 self.ca = ChannelAttention(in_planes, ratio)
40 self.sa = SpatialAttention(kernel_size)
41
42 def forward(self, x):
43 x = self.ca(x) * x
44 x = self.sa(x) * x
45 return x
DS Module深度监督网络
https://blog.csdn.net/qq_40507857/article/details/121025445
1 class DS_layer(nn.Module):
2 def __init__(self, in_d, out_d, stride, output_padding, n_class):
3 super(DS_layer, self).__init__()
4
5 self.dsconv = nn.ConvTranspose2d(in_d, out_d, kernel_size=3, padding=1, stride=stride,
6 output_padding=output_padding)
7 self.bn = nn.BatchNorm2d(out_d)
8 self.relu = nn.ReLU(inplace=True)
9 self.dropout = nn.Dropout2d(p=0.2)
10 self.outconv = nn.ConvTranspose2d(out_d, n_class, kernel_size=3, padding=1)
11
12 def forward(self, input):
13 x = self.dsconv(input)
14 x = self.bn(x)
15 x = self.relu(x)
16 x = self.dropout(x)
17 x = self.outconv(x)
18 return x
2、特征提取
研究表明,借用带有预训练参数的CNN特征提取器有助于模型收敛,因此,本文基于ResNet构建特征提取器。利用ResNet解决梯度消失。
为了避免卷积运算的平滑效果并增加接收场,使用步长为2的最大池层将特征调整为输入图像大小的一半。其余四个阶段由四个基本块组成,每个阶段由两层组成。基本块也有两种形式,如下图所示:一种是传递初始输入x,而公式与(2)相同。另一种利用1×1卷积层进行维数增加和降采样。
3、Metric Module
度量模块通过比较双时态图像的嵌入特征向量来学习变化图。因此,构建用于比较的双时态特征对结果至关重要。为了充分利用低层特征中充分的空间信息和高层特征中丰富的语义信息,提出了一种多尺度特征融合策略,利用特征抽取器各分支的多级特征重构成对特征,其中首先应用1×1卷积层将每个特征的通道统一为96,然后应用双线性插值将其大小调整为输入图像的一半。然后,将来自同一分支的特征依次串联并馈送到卷积块中,卷积块由两个卷积层组成,核大小分别为3和1。此重建将生成通道大小为64的特征对。
将CMBA模块运用进去
4、网络结构
六、代码链接
https://github.com/liumency/DSAMNet