Skip to content

Commit a458acf

Browse files
committed
commit
2 parents e30799c + d65d882 commit a458acf

13 files changed

+320
-286
lines changed

.github/CONFIGS.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
## 配置说明
2+
3+
### 修改模型
4+
5+
### 修改数据集
6+
7+
### 修改损失函数
8+
9+
### 修改学习率策略
10+
11+
### 修改优化器
12+
13+
### tensorboard
14+
15+
### checkpoints
16+
17+
### 边训练边测试
18+
19+
### 分析所用指标
20+
21+
22+
(那么多。。。。等我闲下来再写)

.github/README_CN.md

-71
This file was deleted.

.github/README_EN.md

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
# Change Detection
3+
4+
A framework for change detection using PyTorch. It is one part of [easy2train](#change-detection)
5+
6+
7+
8+
9+
## Table of Contents
10+
11+
- [Change Detection](#change-detection)
12+
- [Table of Contents](#table-of-contents)
13+
- [About](#about)
14+
- [Highlights](#highlights)
15+
- [Getting Started](#getting-started)
16+
- [Installing](#installing)
17+
- [Adding your own model](#adding-your-own-model)
18+
- [TODO](#todo)
19+
- [Acknowledgements](#acknowledgements)
20+
21+
22+
## About
23+
24+
25+
26+
### Highlights
27+
28+
## Getting Started
29+
30+
31+
### Installing
32+
33+
## Adding your own model
34+
35+
36+
## TODO
37+
38+
39+
## Acknowledgements
40+

.github/images/augmentation.png

44 KB
Loading

.github/images/tensorboard.png

69.6 KB
Loading

.gitignore

+2-4
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,11 @@ log.log
150150
.ipynb*
151151
__pycache*
152152
tensorboard
153-
models/
154-
xqf/
155153

156154

157155
Untitled.ipynb
158156
data/*/
159157
checkpoint/*
160-
logs/eval.csv
158+
logs/
161159
utils/mail.py
162-
logs/eval.csv
160+

README.md

+100-20
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,120 @@
1-
21
# Change Detection
32

4-
A framework for change detection using PyTorch. It is one part of [easy2train](#change-detection)
3+
一个用 PyTorch 编写的,专门针对变化检测 (Change Detection) 任务的模型框架。
4+
5+
[English](./.github/README_EN.md)
56

6-
[中文版本](.github/README_CN.md)
7+
- [Change Detection](#change-detection)
8+
- [写在前面](#%e5%86%99%e5%9c%a8%e5%89%8d%e9%9d%a2)
9+
- [为什么写这个项目?](#%e4%b8%ba%e4%bb%80%e4%b9%88%e5%86%99%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae)
10+
- [特性](#%e7%89%b9%e6%80%a7)
11+
- [开始使用](#%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8)
12+
- [0. 数据集](#0-%e6%95%b0%e6%8d%ae%e9%9b%86)
13+
- [1. 配置文件](#1-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6)
14+
- [2. 训练](#2-%e8%ae%ad%e7%bb%83)
15+
- [3. 测试](#3-%e6%b5%8b%e8%af%95)
16+
- [使用你自己的模型/数据集/损失函数](#%e4%bd%bf%e7%94%a8%e4%bd%a0%e8%87%aa%e5%b7%b1%e7%9a%84%e6%a8%a1%e5%9e%8b%e6%95%b0%e6%8d%ae%e9%9b%86%e6%8d%9f%e5%a4%b1%e5%87%bd%e6%95%b0)
17+
- [模型](#%e6%a8%a1%e5%9e%8b)
18+
- [数据集](#%e6%95%b0%e6%8d%ae%e9%9b%86)
19+
- [损失函数](#%e6%8d%9f%e5%a4%b1%e5%87%bd%e6%95%b0)
20+
- [结果](#%e7%bb%93%e6%9e%9c)
21+
- [参考](#%e5%8f%82%e8%80%83)
722

23+
## 写在前面
24+
25+
### 为什么写这个项目?
26+
27+
变化检测(Change Detection,CD)任务与其他任务,如语义分割,目标检测等相比,有其特有的特性(坑),如数据集少(少到可怜那种,尤其是异源,我**),公开的模型也很少,输入常常是成对的(导致一些在 PyTorch 中常用的函数,如Random系列等需要做出一些改变),给初学者带来了很大的困扰(对,没错就是我),所以我将毕设期间写的一些代码,仿照 [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark) 整理一下发布出来。
28+
29+
### 特性
30+
31+
- **边训练边测试(可选)**
32+
33+
由于数据集数量较少,以及 CD 只是一个 “二分类” 问题,所以模型一般较为简单,因此边训练边测试可以更为方便的选到最优解(不增加显存)。
34+
35+
- **“模块式” 搭建模型,方便扩展**
36+
37+
将整个过程从前期数据处理到后期测试拆分为独立的几个部分,方便之后搭建自己的模型、采用新型的优化器方法或者学习率策略以及增加新的数据集。
38+
39+
- **数据增强**
40+
41+
将数据增强放在了 “dataloader” 部分,在传统 transform 的基础上实现了对 N 个图片同时操作,保证了 Random 系列图片的一致性,默认的数据增强方式如下
42+
43+
![augmentation](.github/images/augmentation.png)
44+
45+
## 开始使用
46+
47+
下表是实现的可以直接用的一些模块(持续更新)
48+
49+
| model | dataset | lr scheduler | loss | optimizer |
50+
| -------------------------- | -------- | ------------------------------------------- | ------------------------------- | --------- |
51+
| 1. siamese_unet_conc<br />2. siamese_unet_diff | 1. Szada | 1. WarmupMultiStepLR<br />2. WarmupCosineLR | 1. BCEWithLogitsLoss+pos_weight | 1. SGD |
52+
53+
### 0. 数据集
54+
55+
将对应数据集下载并解压到 `data/`目录下
56+
57+
- [Szada]()
58+
59+
取 7 对大小为 952\*640 的图像的左上角大小为 784\*448 的图片作为测试集,其余部分按照步进为 56 的滑动窗口划分为大小 112\*112 的图片,并以此作为训练集
60+
61+
### 1. 配置文件
62+
63+
按照 `configs/homo/szada_siamese_unet_conc.yaml` 的格式设置自己的配置文件,具体参数说明可以参考 [configs](.github/CONFIGS.md)
64+
65+
### 2. 训练
66+
67+
`-cfg` 指向你的配置文件
68+
69+
```bash
70+
python train_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml
71+
```
72+
73+
(可选)打开 tensorboard 查看训练进度,取得满意的结果后可以停止训练
74+
```bash
75+
tensorboard --logdir=logs/tensorboard
76+
```
77+
![结果图](.github/images/tensorboard.png)
878

9-
## Table of Contents
1079

11-
- [Change Detection](#change-detection)
12-
- [Table of Contents](#table-of-contents)
13-
- [About](#about)
14-
- [Highlights](#highlights)
15-
- [Getting Started](#getting-started)
16-
- [Installing](#installing)
17-
- [Adding your own model](#adding-your-own-model)
18-
- [TODO](#todo)
19-
- [Acknowledgements](#acknowledgements)
2080

81+
### 3. 测试
2182

22-
## About
83+
`-cfg` 指向你的配置文件
2384

85+
```bash
86+
python eval_net.py -cfg configs/homo/szada_siamese_unet_conc.yaml
87+
```
2488

89+
## 使用你自己的模型/数据集/损失函数
2590

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

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

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

31-
### Installing
105+
### 损失函数
106+
同上,放在一个文件夹中,然后引入,然后建立对应关系,最后修改配置文件。
32107

33-
## Adding your own model
108+
## 结果
34109

110+
| Dataset | Method | PCC | Re | F1 | Kappa | checkpoint |
111+
| ------- | ----------------- | ---- | ---- | ---- | ----- | ------------------------------------------------------------ |
112+
| Szada | Siamese_unet_conc | 96.0 | 50.9 | 54.8 | 52.7 | [OneDrive](https://drive.google.com/open?id=17WsyAgMByZB-Rcl5BZiqhoGAlKjTqz1V) |
35113

36-
## TODO
114+
(单位:%)
37115

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

39-
## Acknowledgements
118+
### 参考
40119

120+
1. [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark)

build/model.py

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def build_model(cfg):
1313

1414
model_map = {
1515
"Siamese_unet_conc" : Siamese_unet_conc(mcfg.IN_CHANNEL,mcfg.OUT_CHANNEL,mcfg.P_DROPOUT),
16+
"Siamese_unet_diff" : Siamese_unet_conc(mcfg.IN_CHANNEL,mcfg.OUT_CHANNEL,mcfg.P_DROPOUT),
1617
}
1718

1819
assert mcfg.CHOICE in model_map.keys()

build/tensorboard.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ def build_tensorboad(cfg):
1010
name = "%s/%s" % ( time.strftime("%Y-%m-%d-%H-%M"),ID)
1111
path = os.path.join(tcfg.PATH, name)
1212
writer = SummaryWriter(path)
13-
writer.add_text("config", str(cfg), 0)
13+
# writer.add_text("config", str(cfg), 0)
1414
return writer
1515

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
BUILD:
2+
DATALOADER:
3+
CHOICE: "Szada"
4+
LOSS:
5+
CHOICE: "BCEWithLogitsLoss"
6+
REDUCTION: "mean"
7+
USE_POS_WEIGHT: True
8+
POS_WEIGHT: 4.0
9+
MODEL:
10+
CHOICE: "Siamese_unet_diff"
11+
IN_CHANNEL: 3
12+
OUT_CHANNEL: 2
13+
OPTIMIZER:
14+
CHOICE: "SGD"
15+
LR_SCHEDULER:
16+
CHOICE: "WarmupCosineLR"
17+
USE_CHECKPOINT: True
18+
USE_TENSORBOARD: True
19+
TEST_WHEN_TRAIN: True
20+
21+
CHECKPOINT:
22+
PATH: "checkpoint/"
23+
PERIOD: 500
24+
25+
DATASETS:
26+
TRAIN_CSV: "data/Szada/train.csv"
27+
TEST_CSV: "data/Szada/test.csv"
28+
29+
DATALOADER:
30+
NUM_WORKERS: 0
31+
BATCH_SIZE: 32
32+
TEST_BATCH_SIZE: 1
33+
SHUFFLE: True
34+
TEST_SHUFFLE: False
35+
36+
EVAL:
37+
METRIC: ["Pr","Re","F1","PCC","Kappa"]
38+
INITIAL_METRIC: [0.6,0.6,0.6,0.9,0.6]
39+
CHECKPOINTS_PATH: "checkpoint/"
40+
SAVE_PATH: "logs/"
41+
SAVE_NAME: "eval.csv"
42+
43+
MODEL:
44+
DEVICE: "cuda"
45+
46+
SOLVER:
47+
BASE_LR: 0.001
48+
NUM_EPOCH: 2000
49+
MOMENTUM: 0.9
50+
WEIGHT_DECAY: 0.0005
51+
WEIGHT_DECAY_BIAS: 0
52+
TEST_PERIOD: 11
53+
TEST_BETTER_SAVE: True
54+
55+
LR_SCHEDULER:
56+
MAX_ITERS: 20
57+
LAST_EPOCH: -1
58+
WARMUP_FACTOR: 0.05
59+
WARMUP_ITERS: 20
60+
WARMUP_METHOD: "linear"
61+
62+
TENSORBOARD:
63+
ID: ""
64+
PATH: "logs/tensorboard/"

engine/trainer.py

-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ def train_epoch(
5050
writer.add_scalar("train/lr", scheduler.get_lr()[0], current_batch)
5151

5252

53-
5453
if test_loader and not current_batch % cfg.SOLVER.TEST_PERIOD:
5554
step = current_batch // cfg.SOLVER.TEST_PERIOD
5655
del img1,img2,gt,output

0 commit comments

Comments
 (0)