Skip to content

A framework for change detection using PyTorch

Notifications You must be signed in to change notification settings

swjtulinxi/ChangeDetection

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Change Detection

一个用 PyTorch 编写的,专门针对变化检测 (Change Detection) 任务的模型框架。

English

写在前面

为什么写这个项目?

变化检测(Change Detection,CD)任务与其他任务,如语义分割,目标检测等相比,有其特有的特性(坑),如数据集少(少到可怜那种,尤其是异源,我**),公开的模型也很少,输入常常是成对的(导致一些在 PyTorch 中常用的函数,如Random系列等需要做出一些改变),给初学者带来了很大的困扰(对,没错就是我),所以我将毕设期间写的一些代码,仿照 maskrcnn-benchmark 整理一下发布出来。

特性

  • 边训练边测试(可选)

    由于数据集数量较少,以及 CD 只是一个 “二分类” 问题,所以模型一般较为简单,因此边训练边测试可以更为方便的选到最优解(不增加显存)。

  • “模块式” 搭建模型,方便扩展

    将整个过程从前期数据处理到后期测试拆分为独立的几个部分,方便之后搭建自己的模型、采用新型的优化器方法或者学习率策略以及增加新的数据集。

  • 数据增强

    将数据增强放在了 “dataloader” 部分,在传统 transform 的基础上实现了对 N 个图片同时操作,保证了 Random 系列图片的一致性,默认的数据增强方式:

    • 以概率 $p_1$ 随机水平翻转
    • 以概率 $p_2$ 随机垂直翻转
    • 以概率 $p_3$ 随机旋转任意角度

开始使用

下表是实现的可以直接用的一些模块(持续更新)

model dataset lr scheduler loss optimizer
1. siamese_unet_conc
2. siamese_unet_diff
1. Szada 1. WarmupMultiStepLR
2. WarmupCosineLR
1. BCEWithLogitsLoss+pos_weight 1. SGD

0. 数据集

将对应数据集下载并解压到 data/目录下

  • Szada

    取 7 对大小为 952*640 的图像的左上角大小为 784*448 的图片作为测试集,其余部分按照步进为 56 的滑动窗口划分为大小 112*112 的图片,并以此作为训练集

1. 配置文件

按照 configs/homo/szada_siamese_unet_conc.yaml 的格式设置自己的配置文件,具体参数说明可以参考 configs

2. 训练

-cfg 指向你的配置文件

python train_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml

(可选)打开 tensorboard 查看训练进度,取得满意的结果后可以停止训练

tensorboard --logdir=logs/tensorboard
页面截图 (点击展开) 结果图

3. 测试

-cfg 指向你的配置文件

python eval_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml

使用你自己的模型/数据集/损失函数

模型

  1. 将你的写好的模型文件 MYMODEL.py放在 model/下面(layers下面是一些封装好可以调用的层)
  2. build/model.py 里调用你的模型 from model.MYMODEL import MODEL
  3. build/model.py 中字典 model_map 添加你的模型和对应的 KEY
  4. 修改你的配置文件中,BUILD.MODEL.CHOICE:KEY和其他选项

数据集

data/normal.py 是针对一般数据集写好的 dataloader 文件,里面默认使用上面提到的数据增强对数据进行增强,要想取消数据增强(一些已经增强过的训练集),可以给 Normal 的参数 data_trans 传递普通的数据处理(如 Normal._test_trans()所示)。

  1. 将你的写好的加载数据的脚本 DATALOADER.py放在 data/下面
  2. build/dataloader.py 里调用你的模型 from data.DATALOADER import DATALOADER
  3. build/dataloader.py 中字典 datasets_map 添加你的脚本和对应的 KEY
  4. 修改你的配置文件,BUILD.DATALOADER.CHOICE:KEY

损失函数

同上,放在一个文件夹中,然后引入,然后建立对应关系,最后修改配置文件。

结果

Dataset Method PCC Re F1 Kappa checkpoint
Szada Siamese_unet_conc 96.0 50.9 54.8 52.7 OneDrive
Szada Siamese_unet_diff 95.8 67.0 55.4 53.2 OneDrive

(取 F1 最高值的 checkpoint 作为结果,单位:%)

测试结果可以在 logs/eval.csv(在配置文件中配置) 中查看

结果可视化(部分)

说是部分,当然是选取最好的结果放上来啦~

Siamese_unet_conc + Szada

点击展开 (第一个为输出结果,第二个为Ground-Truth)

Pr_0.785_Re_0.727_F1_0.755_PCC_0.961_Kappa_0.734 gt4_test

TODO

  • 以同样的概率 p 对特征图进行 dropout
  • 网络中间层可视化
  • 可视化输出结果
  • 完成任务后邮件通知
  • 增加预处理代码 (python and C艹)

参考

  1. maskrcnn-benchmark

欢迎 Star, issue, PR (请PR提交到“developing”分支~)

About

A framework for change detection using PyTorch

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Jupyter Notebook 92.2%
  • Python 7.8%