Config配置文件
swin-tiny-patch4-window7_upernet_1xb8-20k_levir-256x256.py
_base_ = [
'../_base_/models/upernet_swin.py', # 继承的模型
'../_base_/datasets/levir_256x256.py', # 预训练的数据集
'../_base_/default_runtime.py', # 运行时间策略
'../_base_/schedules/schedule_20k.py' # 训练策略
]
crop_size = (256, 256) # 定义图像剪裁大小(可设置是否随机剪裁)
norm_cfg = dict(type='BN', requires_grad=True)
# 设置归一化为Batch Normalization,requires_grad=True设置Bath Normalization的参数训练中可以更新
data_preprocessor = dict(
size=crop_size,
type='SegDataPreProcessor', # mmsegmentation图像分割专用模块,进行归一化、剪裁、数据增强。
mean=[123.675, 116.28, 103.53, 123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375, 58.395, 57.12, 57.375]
)
# data_preprocessor定义数据预处理,包括均值mean和标准差std用于归一化,适用于包含6通道输入的图像数据。
# backbone只设置了模型的层数和输入维度等信息,没有从0实现swin Transformer。
# Swin Transformer在mmsegmentation或其底层库mmcv中已经被预定义为一个模块。
# 通过配置文件中的backbone=dict(...)配置项来动态实例化模型。
model = dict(
data_preprocessor=data_preprocessor,
backbone=dict(
in_channels=6, # 主干网络输入通道数为6。
embed_dims=96, # 嵌入维度为96,每个输入块被线性变换为96维特征向量。
depths=[2, 2, 6, 2], # 表示主干网络中每个阶段的深度。
# 4个数值对应4个阶段,每个阶段的Swin Transformer块数量分别为2、2、6和2。
num_heads=[3, 6, 12, 24], # 每个阶段的多头自注意力头数分别为3、6、12和24,与嵌入维度相匹配。
window_size=7, # 设置窗口大小为7,代表每个Swin Transformer块中局部自注意力的窗口尺寸。
use_abs_pos_embed=False,
# 是否使用绝对位置嵌入。这里设置为False,表示采用相对位置嵌入,更符合Swin Transformer的设计。
drop_path_rate=0.3, # 随机丢弃率
patch_norm=True # 启用块归一化,即对输入图像块(patch)进行归一化处理。
),
decode_head=dict(in_channels=[96, 192, 384, 768], num_classes=2),
auxiliary_head=dict(in_channels=384, num_classes=2)
)
# in_channels=[96, 192, 384, 768]:定义了解码头输入的通道数,分别对应主干网络每个阶段的输出通道数。
# num_classes=2:表示分割任务的类别数量(此处为二分类)。
# in_channels=384:辅助头的输入通道数为384,对应主干网络某一阶段的输出。
# num_classes=2:辅助头的输出类别数量同样为2。
# 辅助头用于辅助训练过程,提供额外的监督信号,帮助模型更快收敛并提高性能。
optim_wrapper = dict(
_delete_=True,
type='OptimWrapper',
optimizer=dict(
type='AdamW', lr=0.00006, betas=(0.9, 0.999), weight_decay=0.01
),
paramwise_cfg=dict(
custom_keys={
'absolute_pos_embed': dict(decay_mult=0.),
'relative_position_bias_table': dict(decay_mult=0.),
'norm': dict(decay_mult=0.)
}
)
)
# 使用AdamW优化器,学习率lr=0.00006。
# 对绝对位置嵌入、相对位置偏置和归一化层禁用权重衰减,以保留这些参数的特性。
# 学习率调度器
param_scheduler = [
dict(type='LinearLR', start_factor=1e-6, by_epoch=False, begin=0, end=1500),
dict(type='PolyLR', eta_min=0.0, power=1.0, begin=1500, end=20000, by_epoch=False)
]
# LinearLR在前1500次迭代中线性增加学习率。
# PolyLR在1500到20000次迭代中使用多项式衰减,最小学习率eta_min=0.0。
# 数据加载器配置
train_dataloader = dict(batch_size=4)
val_dataloader = dict(batch_size=1)
test_dataloader = val_dataloader
# train_dataloader设置训练批次大小为4。
# val_dataloader和test_dataloader设置批次大小为1。
附录
upernet_swin.py
# model settings
norm_cfg = dict(type='SyncBN', requires_grad=True)
backbone_norm_cfg = dict(type='LN', requires_grad=True)
data_preprocessor = dict(
type='SegDataPreProcessor',
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
bgr_to_rgb=True,
pad_val=0,
seg_pad_val=255)
model = dict(
type='EncoderDecoder',
data_preprocessor=data_preprocessor,
pretrained=None,
backbone=dict(
type='SwinTransformer',
pretrain_img_size=224,
embed_dims=96,
patch_size=4,
window_size=7,
mlp_ratio=4,
depths=[2, 2, 6, 2],
num_heads=[3, 6, 12, 24],
strides=(4, 2, 2, 2),
out_indices=(0, 1, 2, 3),
qkv_bias=True,
qk_scale=None,
patch_norm=True,
drop_rate=0.,
attn_drop_rate=0.,
drop_path_rate=0.3,
use_abs_pos_embed=False,
act_cfg=dict(type='GELU'),
norm_cfg=backbone_norm_cfg),
decode_head=dict(
type='UPerHead',
in_channels=[96, 192, 384, 768],
in_index=[0, 1, 2, 3],
pool_scales=(1, 2, 3, 6),
channels=512,
dropout_ratio=0.1,
num_classes=19,
norm_cfg=norm_cfg,
align_corners=False,
loss_decode=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0)),
auxiliary_head=dict(
type='FCNHead',
in_channels=384,
in_index=2,
channels=256,
num_convs=1,
concat_input=False,
dropout_ratio=0.1,
num_classes=19,
norm_cfg=norm_cfg,
align_corners=False,
loss_decode=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=0.4)),
# model training and testing settings
train_cfg=dict(),
test_cfg=dict(mode='whole'))