一个用 PyTorch 编写的,专门针对变化检测 (Change Detection) 任务的模型框架。
变化检测(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 |
将对应数据集下载并解压到 data/
目录下
-
取 7 对大小为 952*640 的图像的左上角大小为 784*448 的图片作为测试集,其余部分按照步进为 56 的滑动窗口划分为大小 112*112 的图片,并以此作为训练集
按照 configs/homo/szada_siamese_unet_conc.yaml
的格式设置自己的配置文件,具体参数说明可以参考 configs 。
-cfg
指向你的配置文件
python train_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml
(可选)打开 tensorboard 查看训练进度,取得满意的结果后可以停止训练
tensorboard --logdir=logs/tensorboard
-cfg
指向你的配置文件
python eval_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml
- 将你的写好的模型文件
MYMODEL.py
放在model/
下面(layers
下面是一些封装好可以调用的层) - 在
build/model.py
里调用你的模型from model.MYMODEL import MODEL
- 在
build/model.py
中字典model_map
添加你的模型和对应的KEY
- 修改你的配置文件中,
BUILD.MODEL.CHOICE:KEY
和其他选项
data/normal.py
是针对一般数据集写好的 dataloader
文件,里面默认使用上面提到的数据增强对数据进行增强,要想取消数据增强(一些已经增强过的训练集),可以给 Normal
的参数 data_trans
传递普通的数据处理(如 Normal._test_trans()
所示)。
- 将你的写好的加载数据的脚本
DATALOADER.py
放在data/
下面 - 在
build/dataloader.py
里调用你的模型from data.DATALOADER import DATALOADER
- 在
build/dataloader.py
中字典datasets_map
添加你的脚本和对应的KEY
- 修改你的配置文件,
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
(在配置文件中配置) 中查看
说是部分,当然是选取最好的结果放上来啦~
- 以同样的概率 p 对特征图进行 dropout
- 网络中间层可视化
- 可视化输出结果
- 完成任务后邮件通知
- 增加预处理代码 (python and C艹)
欢迎 Star, issue, PR (请PR提交到“developing”分支~)