news 2026/7/9 1:46:19

变化检测—BIT

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
变化检测—BIT

BIT(Bitemporal Image Transformer)是 2021 年提出的双时态图像 Transformer 变化检测模型,用CNN 提取局部特征 + Transformer 捕捉全局时序依赖,专门用于遥感二值变化检测。

输入:T1 影像 + T2 影像(同一地点、不同时间)

输出:变化图(0 :未变,1:变化)

一、程序下载

1.官方地址:https://github.com/justchenhao/BIT_CD

2.数据集下载

进入上述网址,下滑到图中位置,点击LEVIR-CD,可跳转到下载页面

将下载的数据集整理成如下结构

"""

Change detection data set with pixel-level binary labels;

├─A

├─B

├─label

└─list

"""

A:T1相的图像,不用划分train\val\test,图片全放在A文件夹里;

B:T2相的图像,同A;

label:标签映射,同A;

list:train.txt、val.txt、test.txt,每个txt里只存放对应的图片名。

二、环境配置

Python 3.6

pytorch 1.6.0

torchvision 0.7.0

einops 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_size=1024; 第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_size=1024): 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', default='test_1024', type=str) parser.add_argument('--gpu_ids', type=str, default='0', help='gpu ids: e.g. 0 0,1,2, 0,2. use -1 for CPU') parser.add_argument('--checkpoint_root', default='checkpoints', type=str) parser.add_argument('--output_folder', default='test_results', type=str) parser.add_argument('--num_workers', default=0, type=int) parser.add_argument('--dataset', default='CDDataset', type=str) parser.add_argument('--data_name', default='test', type=str) parser.add_argument('--batch_size', default=1, type=int) parser.add_argument('--split', default="test", type=str) parser.add_argument('--img_size', default=1024, type=int) parser.add_argument('--n_class', default=2, type=int) parser.add_argument('--net_G', default='base_transformer_pos_s4_dd8', help='base_resnet18 | base_transformer_pos_s4_dd8') parser.add_argument('--checkpoint_name', default='best_ckpt.pt', type=str) 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_ok=True) # 加载无标签数据 dataset = TestDataset(img_dir='./test', img_size=args.img_size) data_loader = DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0) 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()

写在最后的话:

夏天已经到了,接下来是悠长且无忧无虑的日子。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 1:43:40

记录AI学习之路Day13:Skill浅记

AI Agent 中的 Skill — 什么是"技能" 一、从一个问题开始 你招了一个实习生,第一天上班。你不会对 ta 说"用 SQL 的 SELECT JOIN 查表"这种微观指令, 你会说"来了新订单就走这个 SOP:查库存→锁商品→建订单→扣余…

作者头像 李华
网站建设 2026/7/9 1:43:12

Mybatis-Flex 踩坑 @Column注解

问题所在:### SQL: INSERT INTO tts_record(id, user_id, api_key_id, model_id, model_key, text, voice, audio_url, audio_data, format, characters, duration, status, client_ip, create_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, …

作者头像 李华
网站建设 2026/7/9 1:42:28

如何高效找回加密压缩包的密码:ArchivePasswordTestTool完全指南

如何高效找回加密压缩包的密码:ArchivePasswordTestTool完全指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经遇到…

作者头像 李华
网站建设 2026/7/9 1:41:44

2026年天津音乐培训新选择:哪家机构更受家长信赖?

随着社会的发展和教育观念的不断更新,越来越多的家长开始重视孩子的艺术培养。在天津,音乐培训市场蓬勃发展,各种培训机构如雨后春笋般涌现。然而,在众多的选择中,家长们最关心的是如何找到一家既专业又值得信赖的音乐…

作者头像 李华
网站建设 2026/7/9 1:41:33

#100DaysOfAgent Day 5

#100DaysOfAgent Day 5 今天学习了 LangGraph 工具系统进阶,重点掌握了 Reducer 机制、工具错误处理、并行工具调用与循环保护。 收获 1. Reducer 的真正绑定方式 Reducer 是告诉 LangGraph「字段更新时该怎么合并」的函数,必须通过 Annotated 显式绑…

作者头像 李华