目 录
第一章 绪论 1
1.1问题背景及意义 1
1.2国内外研究现状 1
1.3论文主要研究内容 2
1.4论文组织结构 3
第二章 相关技术 5
2.1遥感图像变化检测 5
2.2 孪生网络 7
2.3 残差网络 8
2.4 注意力机制 9
第三章 基于BIT的遥感影像变化检测 11
3.1 Transformer模型 11
3.2 BIT模型 12
3.3 AC-BIT模型 15
第四章 实验及结果分析 22
4.1 实验环境 22
4.2 实验数据 22
4.3 网络配置 26
4.4 正交实验 29
4.5 对比测试 33
第五章 总结与展望 35
5.1 总结 35
5.2 展望 35
参考文献 37
致 谢 39
1.3论文主要研究内容
本文使用Liver-CD数据集,通过对BIT模型进行改进,将模型用于遥感影像变化检测,主要的工作内容如下:
在数据预处理阶段使用数据增强增加训练样本数,提高模型的泛化能力。样本数据中未变化像素点的个数要远高于变化像素点个数,为了解决由此造成的样本不平衡问题,从两个方面进行了改进:其一,使用重采样增加变化样本的数量。其二,设计适用于不平衡样本的损失函数,在损失函数中加入权重因子,使损失函数更多的关注变化样本和难以检测出的样本。通过对比不同的骨干网络对模型在测试集上F1-Score的大小进行比较,最终选择ResNet34作为模型骨干网络。为了高效的选出最佳的超参数组合方案,采用正交试验方法,通过将不同的因素和水平进行组合,并将其结果用于极差分析,得出对F1-Score影响最大的因素和最优的超参数组合方案,并通过实验证明该方案的结果最优。为了增强模型对多尺寸特征的提取能力,在骨干网络后加入空洞空间卷积模块(ASPP)改善模型对多尺度目标的漏检和预测图边界粗糙的问题。同时,添加双注意力机制(CBAM)增强模型对变化像素点的关注。最后,将AC-BIT模型与其他的变化检测模型进行对比,定量分析AC-BIT在变化检测任务中的性能。
1.4论文组织结构
本文的组织结构安排如下:
第一章 绪论,首先对遥感影像变化检测的背景和意义进行了说明,明确了遥感影像变化检测在国民生产和生活的重要地位。其次,介绍了在变化检测领域国内外的研究现状,介绍了几种常用的变化检测方法,提出了使用机器学习来解决变化检测领域问题的新思路,并列出了变化检测所面临的问题。然后,介绍了本文所做的主要工作。最后对本文的组织结构进行了介绍。
第二章 相关技术,对本文中使用的相关技术进行了介绍。主要用到的技术包括变化检测,孪生网络,残差网络,注意力机制等。
第三章 基于BIT的双时相遥感影像变化检测,对双时相遥感影像变化检测模型的发展进行了详细的分析。从最开始在自然语言处理(NLP)领域使用的Transformer模型;到使用编码解码结构进行变化检测的BIT模型;最后,对BIT模型的骨干网络进行改进,通过添加空洞卷积池化金字塔模块和双注意力机制,提出AC-BIT模型。
第四章 实验及结果分析。在于处理阶段使用数据增强策略增加样本数量,提高模型的泛化能力。为了解决样本不平衡问题,对原来的样本进行重采样以增加变化建筑物在训练样本中的数目。同时,在损失函数的设计上针对样本不平衡进行了优化,通过添加权重因子来增大对变化建筑物计算时的损失,同时,为了区分难以区分和容易分错的样本通过添加因子来进行调节。为了找到最优的超参数组合方案,通过正交试验的方法,通过标准正交表对不同的因素和水平进行组合,将得到的结果进行极差分析,得出对F1-Score影响最大的因素,以及最优的参数组合方案。试验证明该方法最后得到的结果是所有组合方案中最优的结果。最后,通过和其他的变化检测模型进行对比分析,得出本文所提出模型AC-BIT在综合性能上是四个模型中效果最好的模型。
第五章 结论与展望。 首先对本文所做的工作进行了分析,然后对双时相遥感影像变化检测问题的优化方法,分别从算法层面和工程层面进行了分析,提出了以后可以进行改进的地方。
# coding=utf-8
# 当前目录
current_directory = '/root/paddlejob/workspace/code/'
# 数据集文件目录
datasets_prefix = '/root/paddlejob/workspace/train_data/datasets/'
# 输出文件目录. 任务完成后平台会自动把该目录所有文件压缩为tar.gz包,用户可以通过「下载输出」可以将输出信息下载到本地.
output_dir = "/root/paddlejob/workspace/output/"
# 数据集名称
datasets_name = 'data134796'
import os
import sys
import os.path as osp
if __name__ == "__main__":
print(os.getcwd())
# print('1.解压数据集')
# dataset_path = osp.join(datasets_prefix, datasets_name)
# os.system("unzip -o -d {}/dataset/ {}/train_data.zip > /dev/null".format(current_directory, dataset_path))
# os.system("unzip -o -d {}/dataset/ {}/test_data.zip > /dev/null".format(current_directory, dataset_path))
print('2.解压源代码')
os.system("unzip code.zip -d ./ > /dev/null")
# print('3.对数据集进行划分')
# os.system("python ./code/data_config.py {}/dataset/".format(current_directory))
print('4.安装PaddleRS库')
os.system("pip install --upgrade pip")
os.system("pip install pyarrow==0.13.0")
os.system("pip install cloudpickle==1.2.1")
os.system("pip install filelock")
os.system("pip install matplotlib==3.4")
os.system("pip install ./code/PaddleRS")
print('5.手动更新PaddleRS')
sys.path.append('./code/PaddleRS')
print('6.开始训练')
os.system("python ./code/main.py")
print('7.保存结果文件')
file_path = osp.join(current_directory, 'code', 'exp', 'out')
os.system("zip -j submisson.zip {}/* > /dev/null".format(file_path))
os.system("mv ./submisson.zip {}".format(output_dir))