变化检测—BIT BITBitemporal Image Transformer是 2021 年提出的双时态图像 Transformer 变化检测模型用CNN 提取局部特征 Transformer 捕捉全局时序依赖专门用于遥感二值变化检测。输入T1 影像 T2 影像同一地点、不同时间输出变化图0 未变1变化一、程序下载1.官方地址https://github.com/justchenhao/BIT_CD2.数据集下载进入上述网址下滑到图中位置点击LEVIR-CD可跳转到下载页面将下载的数据集整理成如下结构Change detection data set with pixel-level binary labels├─A├─B├─label└─listAT1相的图像不用划分train\val\test图片全放在A文件夹里BT2相的图像同Alabel标签映射同Alisttrain.txt、val.txt、test.txt每个txt里只存放对应的图片名。二、环境配置Python 3.6pytorch 1.6.0torchvision 0.7.0einops 0.3.0三.模型训练训练程序main_cd.py报错ModuleNotFoundError: No module named torchvision.models.utils原因torchvision 版本太高新版里把 torchvision.models.utils 删掉了方法BIT_CD-master/models/resnet.py第三行from torchvision.models.utils import load_state_dict_from_url修改为from torch.hub import load_state_dict_from_url四、模型评估运行eval_cd.py后会输出acc、miou等指标数值。五、模型预测预测程序如下 程序不够简化需要修改的地方如下 第20行预测图像的文件夹路径--img_dir、训练时输入的图像大小--img_size1024 第43行--project_name与训练时保持一致、第46行预测结果输出路径--output_folder 第49行--data_name、第51行--split为预测文件夹名称第50行--batch_size根据实际情况设置 第69行--img_dir与第23行一致. from argparse import ArgumentParser import utils import torch from models.basic_model import CDEvaluator import os from torch.utils.data import Dataset, DataLoader from PIL import Image import torchvision.transforms as transforms # 无标签数据集完全适配你的模型要求 class TestDataset(Dataset): def __init__(self, img_dir./test, img_size1024): self.imgA_dir os.path.join(img_dir, A) self.imgB_dir os.path.join(img_dir, B) self.names sorted(os.listdir(self.imgA_dir)) self.transform transforms.Compose([ transforms.Resize((img_size, img_size)), transforms.ToTensor(), transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) ]) def __len__(self): return len(self.names) def __getitem__(self, idx): name self.names[idx] imgA Image.open(os.path.join(self.imgA_dir, name)).convert(RGB) imgB Image.open(os.path.join(self.imgB_dir, name)).convert(RGB) imgA self.transform(imgA) imgB self.transform(imgB) return {A: imgA, B: imgB, name: name} def get_args(): parser ArgumentParser() parser.add_argument(--project_name, defaulttest_1024, typestr) parser.add_argument(--gpu_ids, typestr, default0, helpgpu ids: e.g. 0 0,1,2, 0,2. use -1 for CPU) parser.add_argument(--checkpoint_root, defaultcheckpoints, typestr) parser.add_argument(--output_folder, defaulttest_results, typestr) parser.add_argument(--num_workers, default0, typeint) parser.add_argument(--dataset, defaultCDDataset, typestr) parser.add_argument(--data_name, defaulttest, typestr) parser.add_argument(--batch_size, default1, typeint) parser.add_argument(--split, defaulttest, typestr) parser.add_argument(--img_size, default1024, typeint) parser.add_argument(--n_class, default2, typeint) parser.add_argument(--net_G, defaultbase_transformer_pos_s4_dd8, helpbase_resnet18 | base_transformer_pos_s4_dd8) parser.add_argument(--checkpoint_name, defaultbest_ckpt.pt, typestr) args parser.parse_args() return args if __name__ __main__: args get_args() utils.get_device(args) device torch.device(cuda:%s % args.gpu_ids[0] if torch.cuda.is_available() else cpu) args.checkpoint_dir os.path.join(args.checkpoint_root, args.project_name) os.makedirs(args.output_folder, exist_okTrue) # 加载无标签数据 dataset TestDataset(img_dir./test, img_sizeargs.img_size) data_loader DataLoader(dataset, batch_size1, shuffleFalse, num_workers0) model CDEvaluator(args) model.load_checkpoint(args.checkpoint_name) model.eval() with torch.no_grad(): for batch in data_loader: print(process:, batch[name][0]) score_map model._forward_pass(batch) model._save_predictions()写在最后的话夏天已经到了接下来是悠长且无忧无虑的日子。