/ChangeDetection

A framework for change detection using PyTorch

Primary LanguageJupyter Notebook

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”分支~)