实验复现过程

下载数据集

自行百度搜索网盘下载;

或官网下载

注意:loveDA测试集没有标签

支持的网络

文件夹结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
airs
├── GeoSeg (code)
├── pretrain_weights (预训练骨干的权重,如 vit、swin 等)
├── model_weights (保存在 ISPRS vaihingen、LoveDA 等上训练的模型权重)
├── fig_results (保存模型预测的掩码)
├── lightning_logs (CSV 格式的训练日志)
├── 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
│ │ ├── train_val (Merge Train and Val)
│ ├── uavid
│ │ ├── uavid_train (original)
│ │ ├── uavid_val (original)
│ │ ├── uavid_test (original)
│ │ ├── uavid_train_val (Merge uavid_train and uavid_val)
│ │ ├── train (processed)
│ │ ├── val (processed)
│ │ ├── train_val (processed)
│ ├── vaihingen
│ │ ├── train_images (original)
│ │ ├── train_masks (original)
│ │ ├── test_images (original)
│ │ ├── test_masks (original)
│ │ ├── test_masks_eroded (original)
│ │ ├── train (processed)
│ │ ├── test (processed)
│ ├── potsdam (the same with vaihingen)

环境

1
2
3
4
conda create -n airs python=3.8
conda activate airs
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -r GeoSeg/requirements.txt

预训练权重

百度网盘 : 1234

数据处理

在终端的D:\project\pythonProject\project\airs位置

LoveDA

分别执行下面四条语句

1
2
3
4
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

Vaihingen

生成训练集

1
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 

生成测试集

1
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

生成用于可视化的masks_1024_rgb(RGB 格式真值标签)。

1
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

至于验证集,你可以从训练集中选择一些图像来构建它。

训练

1
python GeoSeg/train_supervision.py -c GeoSeg/config/loveda/unetformer.py

loveda数据集,unetformer模型

1
python GeoSeg/train_supervision.py -c GeoSeg/config/Vaihingen/unetformer.py

Vaihingen数据集,unetformer模型

测试

LoveDA

1
python GeoSeg/loveda_test.py -c GeoSeg/geoseg/unetformer.py -o fig_results/loveda/loveda_test --rgb -t d4 --val

-t : 数据增强,可以是 [None, ‘lr’, ‘d4’],默认为 None,‘lr’ 是翻转 TTA,‘d4’ 是多尺度 TTA

–val : 生成评价指标

Vaihingen

1
python GeoSeg/vaihingen_test.py -c GeoSeg/config/vaihingen/unetformer.py -o fig_results/vaihingen/unetformer --rgb -t d4 

论文结果

Method Dataset F1 OA mIoU
UNetFormer UAVid - - 67.63
UNetFormer Vaihingen 90.30 91.10 82.54
UNetFormer Potsdam 92.64 91.19 86.52
UNetFormer LoveDA - - 52.97
FT-UNetFormer Vaihingen 91.17 91.74 83.98
FT-UNetFormer Potsdam 93.22 91.87 87.50

实验结果

在LoveDA数据集跑unetformer模型

在Vaihingen数据集跑unetformer模型

1、预训练权重无法下载问题

训练中

1
2
3
4
5
6
7
## Training

"-c" means the path of the config, use different **config** to train different models.

```
python GeoSeg/train_supervision.py -c GeoSeg/config/uavid/unetformer.py
```

报错

Mapping deprecated model name swsl_resnet18 to current resnet18.fb_swsl_ig1b_ft_in1k.

‘(MaxRetryError("HTTPSConnectionPool(host=‘huggingface.co’, port=443): Max retries exceeded with url: /timm/resnet18.fb_swsl_ig1b_ft_in1k/resolve/main/model.safetensors (Caused by Pro
xyError(‘Cannot connect to proxy.’, timeout(’_ssl.c:1114: The handshake operation timed out’)))"), ‘(Request ID: cc793089-b4d7-4003-9af8-63c759cfbd9a)’)’ thrown while requesting HEAD https://huggingface.co/timm/resnet18.fb_swsl_ig1b_ft_in1k/resolve/main/model.safetensors

raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘huggingface.co’, port=443): Max retries exceeded with url: /timm/resnet18.fb_swsl_ig1b_ft_in1k/resolve/main/model.safetensors (Caused by ProxyError(‘Cannot connect to proxy.’, timeout(‘_ssl.c:1114: The handshake operation timed out’)))

解决

运行

1
2
import timm
print(timm.models.create_model('resnet18.fb_swsl_ig1b_ft_in1k').default_cfg)

{‘url’: ‘https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnet18-118f1556.pth’, ‘hf_hub_id’: ‘timm/resnet18.fb_swsl_ig1b_ft_in1k’, ‘architecture’: ‘resnet18’, ‘tag’: ‘fb_swsl_ig1b_ft_in1k’, ‘custom_load’: False, ‘input_size’: (3, 224, 224), ‘fixed_input_size’: False, ‘interpolation’: ‘bilinear’, ‘crop_pct’: 0.875, ‘crop_mode’: ‘center’, ‘mean’: (0.485, 0.456, 0.406), ‘std’: (0.229, 0.224, 0.225), ‘num_classes’: 1000, ‘pool_size’: (7, 7), ‘first_conv’: ‘conv1’, ‘classifier’: ‘fc’, ‘license’: ‘cc-by-nc-4.0’, ‘origin_url’: ‘https://github.com/facebookresearch/semi-supervised-ImageNet1K-models’}

按此地址https://dl.fbaipublicfiles.com/semiweaksupervision/model_files/semi_weakly_supervised_resnet18-118f1556.pth

把权重文件下载下来

手动加载权重

airs\GeoSeg\geoseg\models\UNetFormer.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pretrained_cfg = timm.models.create_model('resnet18.fb_swsl_ig1b_ft_in1k').default_cfg  # 新加  
pretrained_cfg['file'] = r"D:\Download\LoveDA\weight\semi_weakly_supervised_resnet18-118f1556.pth" # 新加
class UNetFormer(nn.Module):
def __init__(self,
decode_channels=64,
dropout=0.1,
# backbone_name='swsl_resnet18',
backbone_name='resnet18.fb_swsl_ig1b_ft_in1k',
pretrained=True,
window_size=8,
num_classes=6
):
super().__init__()

self.backbone = timm.create_model(backbone_name, features_only=True, output_stride=32,
out_indices=(1, 2, 3, 4), pretrained=pretrained,
pretrained_cfg=pretrained_cfg) # 新加
encoder_channels = self.backbone.feature_info.channels()

self.decoder = Decoder(encoder_channels, decode_channels, dropout, window_size, num_classes)

2、多进程问题

问题

​ raise RuntimeError(f’DataLoader worker (pid(s) {pids_str}) exited unexpectedly’) from e

RuntimeError: DataLoader worker (pid(s) 20644, 20204, 2244, 20904) exited unexpectedly

解决

num_workers是Dataloader的概念,默认值是0。num_workers是告诉DataLoader实例要使用多少个子进程进行数据加载(和CPU有关,和GPU无关)

1
2
3
4
5
6
7
8
9
10
11
12
13
train_loader = DataLoader(dataset=train_dataset,
batch_size=train_batch_size,
# num_workers=4, # 太大,注释
pin_memory=True,
shuffle=True,
drop_last=True)

val_loader = DataLoader(dataset=val_dataset,
batch_size=val_batch_size,
# num_workers=4, # 太大,注释
shuffle=False,
pin_memory=True,
drop_last=False)

3、相对引用问题

问题

​ from …geoseg.losses import * ImportError:

attempted relative import with no known parent package

解决

情况1:不能运行

法1:放到同一文件夹下(最简单)

法2:

1
2
3
4
python
>>> import sys
>>> import os
>>> sys.path

显示:[‘’, ‘D:\Miniconda3\envs\airs\python38.zip’, ‘D:\Miniconda3\envs\airs\DLLs’,…],第一个元素为空。

1
2
3
4
>>> pythonpath = os.path.abspath(sys.path[0])
>>> print(pythonpath)
D:\project\pythonProject\project\airs
>>> sys.path.insert(0, pythonpath)

在测试一下

1
>>> sys.path                                                               

显示:[‘D:\project\pythonProject\project\airs’,‘D:\Miniconda3\envs\airs\python38.zip’, ‘D:\Miniconda3\envs\airs\DLLs’,…]

一句话

1
2
3
import sys
import os
sys.path.insert(0, os.path.abspath(sys.path[0]))
  • 其它情况

    引用标红,但仍可运行

4、【解决Pytorch训练模型报错】OSError: [WinError 1455] 页面文件太小,无法完成操作。

参考:https://blog.csdn.net/yxn4065/article/details/128533823