1. 前言:

BIT是用transformer结构进行变化检测的一个孪生网络,它的backbone用的是Resnet结构,具体结构分析可以参考这个链接的作者写的,非常清楚, http://t.csdn.cn/rA9sH。
下面就是来讲我自己的实现过程,比较简单。

2. 数据结构

首先,在官网找到相应的代码,下载解压到自己的本地。github上面的链接为:https://github.com/justchenhao/BIT_CD
然后下载测试数据集LEVIR-CD,链接为:https://justchenhao.github.io/LEVIR/
这个BIT需要的数据结构跟直接下载的LEVIR-CD的数据结构不太一样,我们还需要修改一下数据结构。
我们把数据结构改成下面这种形式的:
在这里插入图片描述

具体就是A文件夹里面放一期影像的训练、验证、测试数据,B里面放另一期影像的训练、验证、测试数据,然后label里面放标签,list里面放train.txt,val.txt,test.txt。
在这里插入图片描述
每一个txt里面放的是用于训练的数据的名称,后面训练的数据就是从这个txt里面读取相应的图片名字,然后读取对应图片进行训练的。
在这里插入图片描述

3. 环境配置

BIT的环境配置相对简单,先看官方给出的Requirements
在这里插入图片描述
也就是说,我们主要有以下几个重要的包就行,同时BIT对于包的版本要求也不高,只需要包的版本跟这个相同或者比这个高就行。
可以在cmd里面输入:pip list命令查看自己是否都安装了这几个包,然后具体的版本是多少, 下面是我的pip list结果,在这里插入图片描述
可以看到我已经安装了pytorch和torchvision了,并且版本比要求的高,所以我就只需要安装einops就行了。我直接用命令行:pip install einops安装了。

然后用pycharm打开我们解压好的代码,选择【File】-【Settings】然后打开python解译器的界面,将我们刚刚安装了满足条件的相关包的那个环境选择为BIT的编译环境,这里是我的环境。
在这里插入图片描述
这样环境就调试好了。

4. 训练

用于训练的文件是main_cd.py,这里有一些参数需要修改一下才能训练,重要的参数可以看下面的截图。
checkpoint_root参数:会默认在项目所在位置生成一个文件夹,
project_name就是在checkpoint_root这个路径下下面生成的一个文件夹,这个文件夹中存放每次训练的模型及相关log文件,每次训练需要一个不同的project_name
dataset 这里建议不用修改,因为这里跟data_config.py文件时关联的。
data_name这里也建议不修改,我们后面来修改data_config.py文件。
其他参数的意义就不用介绍了,有一点深度学习基础的都懂。
在这里插入图片描述
到这里,是不是很懵逼,我训练数据集的路径还没指定呢,怎么训练?在哪里指定呢?
我们需要在data_config.py中修改,这里只需要把root_dir修改成自己的数据集路径就行了。
在这里插入图片描述
下面就可以点击运行main_cd.py了。

我这里还报了一个错,我debug的时候,发现找不到tifffile这个包,原因就是这个tifffile包没有安装**,然后我又安装了这个包。这个包不能直接用pip安装,会找不到合适的版本,推荐在这个网站上安装,https://www.lfd.uci.edu/~gohlke/pythonlibs/
直接搜索tifffile,找到最新的包下载相关的.whl文件,然后pip install 这个.whl文件就行。安装成功之后就可以运行了。
在这里插入图片描述
还遇到了这个错误:
ModuleNotFoundError: No module named ‘torchvision.models.utils
是因为我们的torch版本比较高(高于1.6),所以报错了,需要将报错语句
from torchvision.models.utils import load_state_dict_from_url”改成“from torch.hub import load_state_dict_from_url

就可以了。

5. 预测

预测用到的时demo.py这个文件,这里需要注意的是,checkpoint_rootproject_name需要输入的是我们前面训练时的那个checkpoint_rootproject_name,否则就没办法找到我们训练好的模型了。预测的时候会默认调用project_name文件夹下保存的我们训练过程中最好的那一个模型。
output_folder是预测结果保存的路径,自己根据情况输入想保存的路径就行。
这里的datasetdata_name我还是跟前面训练的时候保持了一致,所以其实我还是用原来的那一批数据,只不过我在“split”里面,改成了“test”,就是说,我用来预测的数据用的是LEVIR数据集里面的test文件夹里面的数据。
在这里插入图片描述
需要注意的是,预测的时候,数据格式跟训练的时候的数据结构要保持一致,也就是说,**预测也需要有label文件夹的,如果没有会报错。**至于为什么,我目前还没弄懂。

一般数据在进行训练和验证的时候需要label,在进行精度评价test的时候也需要label,但是进行推理时,也就是我们在predict的时候是不需要输入label的。后面我会更新如何修改代码,让模型在预测时不需要输入标签数据。

把相关参数设置好之后,就可以点击预测了。

但是,我又遇到了这样一个错误:

RuntimeError: Error(s) in loading state_dict for BASE_Transformer**

在这里插入图片描述
找了好久,一直不明白为什么会遇到这个奇怪的错误,然后终于让我在网上发现了这个大佬的debug过程,这里给大家链接,可以参考一下:
http://t.csdn.cn/9Ws8C

其实就是我们的预测时调用的模型跟我们训练的时候调用的模型不一致。

这是我们预测的模型:
在这里插入图片描述
这是我们训练时用的模型
在这里插入图片描述
可以看出来,两个模型不一样,我们只需要将预测的模型改成与训练的模型一样的就行了。
在这里插入图片描述
完成。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐