目 录
第一章 绪论 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
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))