变化检测—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()

写在最后的话:

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

相关推荐
mykj155111 分钟前
AI景区抓拍系统搭建让旅游多一层乐趣
人工智能·旅游·景区ai抓拍系统·ai抓拍小程序
donoot16 分钟前
《大话文渊慧典》:外二篇-Tesseract+OpenCV自制OCR,我写了三百个if-else,最后代码成了玄学
人工智能·aigc·文渊慧典·大话系列
延凡科技23 分钟前
延凡科技电力数字化平台技术解析:从电力交易到虚拟电厂的全链路架构实践
人工智能·科技·物联网·架构·虚拟电厂·电力平台
Staticy33 分钟前
Claude Code 接国产模型不能识图?一个 MCP 让纯文本模型也能看图
人工智能·ai编程·全栈
极梦网络无忧1 小时前
real-ai-editor:一款轻量、智能的纯前端 AI 富文本与 Markdown 编辑器
前端·人工智能·编辑器
phltxy1 小时前
LangChain v1 Agent核心能力详解
大数据·人工智能·langchain
吴佳浩1 小时前
AI 核心技术解析|OPD:大模型开始复制的不再是知识,而是判断力
人工智能·深度学习·llm
数智化管理手记1 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
thesky1234561 小时前
27届大模型岗面试准备(五):预训练全流程拆解——从数据清洗到 Tokenizer 再到 PT 的每
人工智能·面试·大模型·预训练·tokenizer
attitude.x2 小时前
2026年数据透视分析工具推荐:多维与融合对比
人工智能