234 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # STANet for remote sensing image change detection
 | ||
| 
 | ||
| It is the implementation of the paper: A Spatial-Temporal Attention-Based Method and a New Dataset for Remote Sensing Image Change Detection.
 | ||
| 
 | ||
| Here, we provide the pytorch implementation of the spatial-temporal attention neural network (STANet) for remote sensing image change detection.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| ## Change log
 | ||
| 20210112:
 | ||
| - add the pretraining weight of PAM. [baidupan link](https://pan.baidu.com/s/1O1kg7JWunqd87ajtVMM6pg), code: 2rja
 | ||
| 
 | ||
| 20201105:
 | ||
| 
 | ||
| - add a demo for quick start.
 | ||
| - add more dataset loader modes.
 | ||
| - enhance the image augmentation module (crop and rotation).
 | ||
| 
 | ||
| 20200601:
 | ||
| 
 | ||
| - first commit
 | ||
| 
 | ||
| ## Prerequisites
 | ||
| 
 | ||
| - windows or Linux 
 | ||
| - Python 3.6+
 | ||
| - CPU or NVIDIA GPU
 | ||
| - CUDA 9.0+
 | ||
| - PyTorch > 1.0
 | ||
| - visdom
 | ||
| 
 | ||
| ## Installation
 | ||
| 
 | ||
| Clone this repo:
 | ||
| 
 | ||
| ```bash
 | ||
| git clone https://github.com/justchenhao/STANet
 | ||
| cd STANet
 | ||
| ```
 | ||
| 
 | ||
| Install [PyTorch](http://pytorch.org/) 1.0+ and other dependencies (e.g., torchvision, [visdom](https://github.com/facebookresearch/visdom) and [dominate](https://github.com/Knio/dominate))
 | ||
| 
 | ||
| ## Quick Start
 | ||
| 
 | ||
| You can run a demo to get started. 
 | ||
| 
 | ||
| ```bash
 | ||
| python demo.py
 | ||
| ```
 | ||
| 
 | ||
| The input samples are in `samples`. After successfully run this script, you can find the predicted results in `samples/output`.
 | ||
| 
 | ||
| ## Prepare Datasets
 | ||
| 
 | ||
| ### download the change detection dataset
 | ||
| 
 | ||
| You could download the LEVIR-CD at https://justchenhao.github.io/LEVIR/;
 | ||
| 
 | ||
| The path list in the downloaded folder is as follows:
 | ||
| 
 | ||
| ```
 | ||
| path to LEVIR-CD:
 | ||
|                 ├─train
 | ||
|                 │  ├─A
 | ||
|                 │  ├─B
 | ||
|                 │  ├─label
 | ||
|                 ├─val
 | ||
|                 │  ├─A
 | ||
|                 │  ├─B
 | ||
|                 │  ├─label
 | ||
|                 ├─test
 | ||
|                 │  ├─A
 | ||
|                 │  ├─B
 | ||
|                 │  ├─label
 | ||
| ```
 | ||
| 
 | ||
| where A contains images of pre-phase, B contains images of post-phase, and label contains label maps.
 | ||
| 
 | ||
| ### cut bitemporal image pairs
 | ||
| 
 | ||
| The original image in LEVIR-CD has a size of 1024 * 1024, which will consume too much memory when training. Therefore, we can cut the origin images into smaller patches (e.g., 256 * 256, or 512 * 512).  In our paper, we cut the original image into patches of 256 * 256 size without overlapping.
 | ||
| 
 | ||
| Make sure that the corresponding patch samples in the A, B, and label subfolders have the same name.
 | ||
| 
 | ||
| ## Train
 | ||
| 
 | ||
| ### Monitor training status
 | ||
| 
 | ||
| To view training results and loss plots, run this script and click the URL [http://localhost:8097](http://localhost:8097/).
 | ||
| 
 | ||
| ```bash
 | ||
| python -m visdom.server
 | ||
| ```
 | ||
| 
 | ||
| ### train with our base method
 | ||
| 
 | ||
| Run the following script:
 | ||
| 
 | ||
| ```bash
 | ||
| python ./train.py --save_epoch_freq 1 --angle 15 --dataroot path-to-LEVIR-CD-train --val_dataroot path-to-LEVIR-CD-val --name LEVIR-CDF0 --lr 0.001 --model CDF0 --batch_size 8 --load_size 256 --crop_size 256 --preprocess rotate_and_crop
 | ||
| ```
 | ||
| 
 | ||
| Once finished, you could find the best model and the log files in the project folder.
 | ||
| 
 | ||
| ### train with Basic spatial-temporal Attention Module (BAM) method
 | ||
| 
 | ||
| ```bash
 | ||
| python ./train.py --save_epoch_freq 1 --angle 15 --dataroot path-to-LEVIR-CD-train --val_dataroot path-to-LEVIR-CD-val --name LEVIR-CDFA0 --lr 0.001 --model CDFA --SA_mode BAM --batch_size 8 --load_size 256 --crop_size 256 --preprocess rotate_and_crop
 | ||
| ```
 | ||
| 
 | ||
| ### train with Pyramid spatial-temporal Attention Module (PAM) method
 | ||
| 
 | ||
| ```bash
 | ||
| python ./train.py --save_epoch_freq 1 --angle 15 --dataroot path-to-LEVIR-CD-train --val_dataroot path-to-LEVIR-CD-val --name LEVIR-CDFAp0 --lr 0.001 --model --SA_mode PAM CDFA --batch_size 8 --load_size 256 --crop_size 256 --preprocess rotate_and_crop
 | ||
| ```
 | ||
| 
 | ||
| ## Test
 | ||
| 
 | ||
| You could edit the file val.py, for example:
 | ||
| 
 | ||
| ```python
 | ||
| if __name__ == '__main__':
 | ||
|     opt = TestOptions().parse()   # get training options
 | ||
|     opt = make_val_opt(opt)
 | ||
|     opt.phase = 'test'
 | ||
|     opt.dataroot = 'path-to-LEVIR-CD-test' # data root 
 | ||
|     opt.dataset_mode = 'changedetection'
 | ||
|     opt.n_class = 2
 | ||
|     opt.SA_mode = 'PAM' # BAM | PAM 
 | ||
|     opt.arch = 'mynet3'
 | ||
|     opt.model = 'CDFA' # model type
 | ||
|     opt.name = 'LEVIR-CDFAp0' # project name
 | ||
|     opt.results_dir = './results/' # save predicted images 
 | ||
|     opt.epoch = 'best-epoch-in-val' # which epoch to test
 | ||
|     opt.num_test = np.inf
 | ||
|     val(opt)
 | ||
| ```
 | ||
| 
 | ||
| then run the script: `python val.py`. Once finished, you can find the prediction log file in the project directory and predicted image files in the result directory.
 | ||
| 
 | ||
| ## Using other dataset mode
 | ||
| 
 | ||
| ### List mode
 | ||
| 
 | ||
| ```bash
 | ||
| list=train
 | ||
| lr=0.001
 | ||
| dataset_mode=list
 | ||
| dataroot=path-to-dataroot
 | ||
| name=project_name
 | ||
| 
 | ||
| python ./train.py --num_threads 4 --display_id 0 --dataroot ${dataroot} --val_dataroot ${dataroot} --save_epoch_freq 1 --niter 100 --angle 15 --niter_decay 100  --display_env FAp0 --SA_mode PAM --name $name --lr $lr --model CDFA --batch_size 4 --dataset_mode $dataset_mode --val_dataset_mode $dataset_mode --split $list --load_size 256 --crop_size 256 --preprocess resize_rotate_and_crop
 | ||
| ```
 | ||
| 
 | ||
| In this case, the data structure should be the following:
 | ||
| 
 | ||
| ```
 | ||
| """
 | ||
| data structure
 | ||
| -dataroot
 | ||
|     ├─A
 | ||
|         ├─train1.png
 | ||
|         ...
 | ||
|     ├─B
 | ||
|         ├─train1.png
 | ||
|         ...
 | ||
|     ├─label
 | ||
|         ├─train1.png
 | ||
|         ...
 | ||
|     └─list
 | ||
|         ├─val.txt
 | ||
|         ├─test.txt
 | ||
|         └─train.txt
 | ||
| 
 | ||
| # In list/train.txt, each low writes the filename of each sample,
 | ||
|    # for example:
 | ||
|        list/train.txt
 | ||
|            train1.png
 | ||
|            train2.png
 | ||
|            ...
 | ||
| """
 | ||
| ```
 | ||
| 
 | ||
| ### Concat mode for loading multiple datasets (each default mode is List)
 | ||
| 
 | ||
| ```bash
 | ||
| list=train
 | ||
| lr=0.001
 | ||
| dataset_type=CD_data1,CD_data2,...,
 | ||
| val_dataset_type=CD_data
 | ||
| dataset_mode=concat
 | ||
| name=project_name
 | ||
| 
 | ||
| python ./train.py --num_threads 4 --display_id 0 --dataset_type $dataset_type --val_dataset_type $val_dataset_type --save_epoch_freq 1 --niter 100 --angle 15 --niter_decay 100  --display_env FAp0 --SA_mode PAM --name $name --lr $lr --model CDFA --batch_size 4 --dataset_mode $dataset_mode --val_dataset_mode $dataset_mode --split $list --load_size 256 --crop_size 256 --preprocess resize_rotate_and_crop
 | ||
| ```
 | ||
| 
 | ||
| Note, in this case, you should modify the `get_dataset_info` in `data/data_config.py` to add the corresponding ` dataset_name` and `dataroot` in it.
 | ||
| 
 | ||
| ```python
 | ||
| if dataset_type == 'LEVIR_CD':
 | ||
|     root = 'path-to-LEVIR_CD-dataroot'
 | ||
| elif ...
 | ||
| # add more dataset ...
 | ||
| ```
 | ||
| 
 | ||
| ## Other TIPS
 | ||
| 
 | ||
| For more Training/Testing guides, you could see the option files in the  `./options/`  folder.
 | ||
| 
 | ||
| ## Citation
 | ||
| 
 | ||
| If you use this code for your research, please cite our papers.
 | ||
| 
 | ||
| ```
 | ||
| @Article{rs12101662,
 | ||
| AUTHOR = {Chen, Hao and Shi, Zhenwei},
 | ||
| TITLE = {A Spatial-Temporal Attention-Based Method and a New Dataset for Remote Sensing Image Change Detection},
 | ||
| JOURNAL = {Remote Sensing},
 | ||
| VOLUME = {12},
 | ||
| YEAR = {2020},
 | ||
| NUMBER = {10},
 | ||
| ARTICLE-NUMBER = {1662},
 | ||
| URL = {https://www.mdpi.com/2072-4292/12/10/1662},
 | ||
| ISSN = {2072-4292},
 | ||
| DOI = {10.3390/rs12101662}
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ## Acknowledgments
 | ||
| 
 | ||
| Our code is inspired by [pytorch-CycleGAN](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix).
 | ||
| 
 | ||
|  
 |