Fu jiahao
This is the code for our paper: FSDENet: A Frequency and Spatial Domains-Based Detail Enhancement Network for Remote Sensing Semantic Segmentation https://ieeexplore.ieee.org/document/11051242
conda create -n airs python=3.8
conda activate airs
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
需要先将pip版本降低到24.1以下:
pip install pip==24.0 -i https://mirrors.aliyun.com/pypi/simple/
再安装:
pip install -r GeoSeg/requirements.txt
pip install pytorch_waveletsDownload the datasets from the official website and split them yourself.
- ISPRS Vaihingen and Potsdam
- LoveDA
- Please follow the mmsegmentation to preprocess the iSAID dataset.
Prepare the following folders to organize this repo:
FGHFN
├── GeoSeg (代码)
├── fig_results (save the masks predicted by models)
├── test_log (测试日志)
├── weights (权重目录)
├── data (数据目录)
│ ├── loveDA
│ │ ├── Train
│ │ │ ├── Urban
│ │ │ │ ├── images_png (original images)
│ │ │ │ ├── masks_png (original masks)
│ │ │ │ ├── masks_png_convert (converted masks used for training)
│ │ │ │ ├── masks_png_convert_rgb (original rgb format masks)
│ │ │ ├── Rural
│ │ │ │ ├── images_png
│ │ │ │ ├── masks_png
│ │ │ │ ├── masks_png_convert
│ │ │ │ ├── masks_png_convert_rgb
│ │ ├── Val (the same with Train)
│ │ ├── Test
│ ├── vaihingen
│ │ ├── train_images (original)
│ │ ├── train_masks (original)
│ │ ├── test_images (original)
│ │ ├── test_masks (original)
│ │ ├── test_masks_eroded (original)
│ │ ├── train (processed)
│ │ ├── test (processed)
│ ├── potsdam
│ │ ├── train_images (original)
│ │ ├── train_masks (original)
│ │ ├── test_images (original)
│ │ ├── test_masks (original)
│ │ ├── test_masks_eroded (original)
│ │ ├── train (processed)
│ │ ├── test (processed)
cd FSDENetVaihingen
Only the TOP image tiles were used without the DSM and NDSM. And we utilized ID: 2, 4, 6, 8, 10, 12, 14, 16, 20, 22, 24, 27, 29, 31, 33, 35, 38 for testing, ID: 30 for validation, and the remaining 15 images for training.
python GeoSeg/tools/vaihingen_patch_split.py \
--img-dir "data/vaihingen/train_images" \
--mask-dir "data/vaihingen/train_masks" \
--output-img-dir "data/vaihingen/train/images_1024" \
--output-mask-dir "data/vaihingen/train/masks_1024" \
--mode "train" --split-size 1024 --stride 512
Generate the testing set.
python GeoSeg/tools/vaihingen_patch_split.py \
--img-dir "data/vaihingen/test_images" \
--mask-dir "data/vaihingen/test_masks_eroded" \
--output-img-dir "data/vaihingen/test/images_1024" \
--output-mask-dir "data/vaihingen/test/masks_1024" \
--mode "val" --split-size 1024 --stride 1024 \
--eroded
Generate the masks_1024_rgb (RGB format ground truth labels) for visualization.
python GeoSeg/tools/vaihingen_patch_split.py \
--img-dir "data/vaihingen/test_images" \
--mask-dir "data/vaihingen/test_masks" \
--output-img-dir "data/vaihingen/test/images_1024" \
--output-mask-dir "data/vaihingen/test/masks_1024_rgb" \
--mode "val" --split-size 1024 --stride 1024 \
--gt
Potsdam We utilized ID: 2_13, 2_14,3_13, 3_14, 4_13, 4_14, 4_15, 5_13, 5_14, 5_15, 6_13, 6_14, 6_15, 7_13 for testing, ID: 2_10 for validation, and the remaining 22 images (except image 7_10 with error annotations) for training.
python GeoSeg/tools/potsdam_patch_split.py \
--img-dir "data/potsdam/train_images" \
--mask-dir "data/potsdam/train_masks" \
--output-img-dir "data/potsdam/train/images_1024" \
--output-mask-dir "data/potsdam/train/masks_1024" \
--mode "train" --split-size 1024 --stride 1024 --rgb-image python GeoSeg/tools/potsdam_patch_split.py \
--img-dir "data/potsdam/test_images" \
--mask-dir "data/potsdam/test_masks_eroded" \
--output-img-dir "data/potsdam/test/images_1024" \
--output-mask-dir "data/potsdam/test/masks_1024" \
--mode "val" --split-size 1024 --stride 1024 \
--eroded --rgb-imagepython GeoSeg/tools/potsdam_patch_split.py \
--img-dir "data/potsdam/test_images" \
--mask-dir "data/potsdam/test_masks" \
--output-img-dir "data/potsdam/test/images_1024" \
--output-mask-dir "data/potsdam/test/masks_1024_rgb" \
--mode "val" --split-size 1024 --stride 1024 \
--gt --rgb-imageLoveDA
python GeoSeg/tools/loveda_mask_convert.py --mask-dir data/loveDA/Train/Rural/masks_png --output-mask-dir data/loveDA/Train/Rural/masks_png_convert
python GeoSeg/tools/loveda_mask_convert.py --mask-dir data/loveDA/Train/Urban/masks_png --output-mask-dir data/loveDA/Train/Urban/masks_png_convert
python GeoSeg/tools/loveda_mask_convert.py --mask-dir data/loveDA/Val/Rural/masks_png --output-mask-dir data/loveDA/Val/Rural/masks_png_convert
python GeoSeg/tools/loveda_mask_convert.py --mask-dir data/loveDA/Val/Urban/masks_png --output-mask-dir data/loveDA/Val/Urban/masks_png_convert"-c" means the path of the config, use different config to train different models.
cd FSDENetPotsdam
python GeoSeg/train_supervision.py -c GeoSeg/config/potsdam/FSDENet_potsdam.py Vaihingen
python GeoSeg/train_supervision_dp.py -c GeoSeg/config/vaihingen/FSDENet_vaihingen.pyLoveDA
python GeoSeg/train_supervision_dp.py -c GeoSeg/config/loveda/FSDENet_loveda.pyiSAID
python train_supervision.py -c GeoSeg/config/loveda/FSDENet_isaid.pycd FSDENetPotsdam
python GeoSeg/test_potsdam.py -c GeoSeg/config/potsdam/FSDENet_potsdam.py -o ~/fig_results/potsdam/FGHFN_potsdam --rgb -t 'd4'Vaihingen
python GeoSeg/test_vaihingen.py -c GeoSeg/config/vaihingen/FSDENet_vaihingen.py -o ~/fig_results/FGHFN_vaihingen/ --rgb -t "d4"LoveDA
python GeoSeg/test_loveda.py -c GeoSeg/config/loveda/FSDENet_loveda.py -o ~/fig_results/loveda/FGHFN_loveda --rgb --val -t "d4"iSAID
python GeoSeg/test_isaid.py -c GeoSeg/config/isaid/FSDENet_isaid.py -o ~/fig_results/isaid/convlsrnet_isaid/ -t "d4"Our training scripts comes from GeoSeg. Thanks for the author's open-sourcing code.