From ee6b93b0cf48f0a8e5bc47a9a3659c92dba8fb1a Mon Sep 17 00:00:00 2001 From: whu-pzhang Date: Fri, 26 Jan 2024 12:08:33 +0800 Subject: [PATCH] new config for deeplabv3plus_loveda --- mmseg/configs/_base_/datasets/loveda.py | 76 +++++++++++++++++++ mmseg/configs/_base_/default_runtime.py | 32 ++++++++ .../_base_/models/deeplabv3plus_r50_d8.py | 60 +++++++++++++++ .../configs/_base_/schedules/schedule_80k.py | 23 ++++++ ...bv3plus_r101_d8_4xb4_80k_loveda_512x512.py | 6 ++ ...abv3plus_r18-d8_4xb4-80k_loveda-512x512.py | 15 ++++ ...abv3plus_r50_d8_4xb4_80k_loveda_512x512.py | 15 ++++ 7 files changed, 227 insertions(+) create mode 100644 mmseg/configs/_base_/datasets/loveda.py create mode 100644 mmseg/configs/_base_/default_runtime.py create mode 100644 mmseg/configs/_base_/models/deeplabv3plus_r50_d8.py create mode 100644 mmseg/configs/_base_/schedules/schedule_80k.py create mode 100644 mmseg/configs/deeplabv3plus/deeplabv3plus_r101_d8_4xb4_80k_loveda_512x512.py create mode 100644 mmseg/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py create mode 100644 mmseg/configs/deeplabv3plus/deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512.py diff --git a/mmseg/configs/_base_/datasets/loveda.py b/mmseg/configs/_base_/datasets/loveda.py new file mode 100644 index 0000000000..b015fd22be --- /dev/null +++ b/mmseg/configs/_base_/datasets/loveda.py @@ -0,0 +1,76 @@ +from mmcv.transforms.loading import LoadImageFromFile +from mmcv.transforms import RandomResize, RandomFlip, Resize, TestTimeAug +from mmengine.dataset.sampler import DefaultSampler, InfiniteSampler + +from mmseg.datasets.loveda import LoveDADataset +from mmseg.datasets.transforms import LoadAnnotations, RandomCrop, PhotoMetricDistortion, PackSegInputs +from mmseg.evaluation import IoUMetric + +dataset_type = LoveDADataset +data_root = 'data/loveDA' +crop_size = (512, 512) + +train_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=LoadAnnotations), + dict( + type=RandomResize, + scale=(2048, 512), + ratio_range=(0.5, 2.0), + keep_ratio=True), + dict(type=RandomCrop, crop_size=crop_size, cat_max_ratio=0.75), + dict(type=RandomFlip, prob=0.5), + dict(type=PhotoMetricDistortion), + dict(type=PackSegInputs) +] + +test_pipeline = [ + dict(type=LoadImageFromFile), + dict(type=Resize, scale=(1024, 1024), keep_ratio=True), + # add loading annotation after ``Resize`` because ground truth + # does not need to do resize data transform + dict(type=LoadAnnotations), + dict(type=PackSegInputs) +] + +img_ratios = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75] +tta_pipeline = [ + dict(type=LoadImageFromFile, backend_args=None), + dict( + type=TestTimeAug, + transforms=[[ + dict(type=Resize, scale_factor=r, keep_ratio=True) + for r in img_ratios + ], + [ + dict(type=RandomFlip, prob=0., direction='horizontal'), + dict(type=RandomFlip, prob=1., direction='horizontal') + ], [dict(type=LoadAnnotations)], + [dict(type=PackSegInputs)]]) +] + +train_dataloader = dict( + batch_size=4, + num_workers=4, + persistent_workers=True, + sampler=dict(type=InfiniteSampler, shuffle=True), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict( + img_path='img_dir/train', seg_map_path='ann_dir/train'), + pipeline=train_pipeline)) +val_dataloader = dict( + batch_size=1, + num_workers=4, + persistent_workers=True, + sampler=dict(type=DefaultSampler, shuffle=False), + dataset=dict( + type=dataset_type, + data_root=data_root, + data_prefix=dict(img_path='img_dir/val', seg_map_path='ann_dir/val'), + pipeline=test_pipeline)) +test_dataloader = val_dataloader + +val_evaluator = dict(type=IoUMetric, iou_metrics=['mIoU']) +test_evaluator = val_evaluator diff --git a/mmseg/configs/_base_/default_runtime.py b/mmseg/configs/_base_/default_runtime.py new file mode 100644 index 0000000000..0d12e2f41d --- /dev/null +++ b/mmseg/configs/_base_/default_runtime.py @@ -0,0 +1,32 @@ +from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook, + LoggerHook, ParamSchedulerHook) +from mmengine.runner import LogProcessor +from mmengine.visualization import LocalVisBackend + +from mmseg.engine.hooks import SegVisualizationHook +from mmseg.visualization import SegLocalVisualizer + +default_scope = None + +default_hooks = dict( + timer=dict(type=IterTimerHook), + logger=dict(type=LoggerHook, interval=50, log_metric_by_epoch=False), + param_scheduler=dict(type=ParamSchedulerHook), + checkpoint=dict(type=CheckpointHook, by_epoch=False, interval=8000), + sampler_seed=dict(type=DistSamplerSeedHook), + visualization=dict(type=SegVisualizationHook)) + +env_cfg = dict( + cudnn_benchmark=False, + mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), + dist_cfg=dict(backend='nccl'), +) + +vis_backends = [dict(type=LocalVisBackend)] +visualizer = dict( + type=SegLocalVisualizer, vis_backends=vis_backends, name='visualizer') +log_processor = dict(type=LogProcessor, window_size=50, by_epoch=False) + +log_level = 'INFO' +load_from = None +resume = False diff --git a/mmseg/configs/_base_/models/deeplabv3plus_r50_d8.py b/mmseg/configs/_base_/models/deeplabv3plus_r50_d8.py new file mode 100644 index 0000000000..571f0bf0dc --- /dev/null +++ b/mmseg/configs/_base_/models/deeplabv3plus_r50_d8.py @@ -0,0 +1,60 @@ +from mmseg.models.data_preprocessor import SegDataPreProcessor +from mmseg.models.segmentors import EncoderDecoder +from mmseg.models.backbones import ResNetV1c +from mmseg.models.decode_heads import DepthwiseSeparableASPPHead, FCNHead +from mmseg.models.losses import CrossEntropyLoss + +# model settings +norm_cfg = dict(type='SyncBN', 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='open-mmlab://resnet50_v1c', + backbone=dict( + type=ResNetV1c, + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + dilations=(1, 1, 2, 4), + strides=(1, 2, 1, 1), + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + contract_dilation=True), + decode_head=dict( + type=DepthwiseSeparableASPPHead, + in_channels=2048, + in_index=3, + channels=512, + dilations=(1, 12, 24, 36), + c1_in_channels=256, + c1_channels=48, + 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=1024, + 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')) diff --git a/mmseg/configs/_base_/schedules/schedule_80k.py b/mmseg/configs/_base_/schedules/schedule_80k.py new file mode 100644 index 0000000000..8fe789a3c1 --- /dev/null +++ b/mmseg/configs/_base_/schedules/schedule_80k.py @@ -0,0 +1,23 @@ +from torch.optim.sgd import SGD + +from mmengine.optim.optimizer.optimizer_wrapper import OptimWrapper +from mmengine.optim.scheduler.lr_scheduler import PolyLR +from mmengine.runner.loops import IterBasedTrainLoop, TestLoop, ValLoop + +# optimizer +optimizer = dict(type=SGD, lr=0.01, momentum=0.9, weight_decay=0.0001) +optim_wrapper = dict(type=OptimWrapper, optimizer=optimizer, clip_grad=None) +# learning policy +param_scheduler = [ + dict( + type=PolyLR, + eta_min=1e-4, + power=0.9, + begin=0, + end=80000, + by_epoch=False) +] +# training schedule for 80k +train_cfg = dict(type=IterBasedTrainLoop, max_iters=80000, val_interval=8000) +val_cfg = dict(type=ValLoop) +test_cfg = dict(type=TestLoop) diff --git a/mmseg/configs/deeplabv3plus/deeplabv3plus_r101_d8_4xb4_80k_loveda_512x512.py b/mmseg/configs/deeplabv3plus/deeplabv3plus_r101_d8_4xb4_80k_loveda_512x512.py new file mode 100644 index 0000000000..e5c47de076 --- /dev/null +++ b/mmseg/configs/deeplabv3plus/deeplabv3plus_r101_d8_4xb4_80k_loveda_512x512.py @@ -0,0 +1,6 @@ +from mmengine.config import read_base + +with read_base(): + from .deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512 import * + +model.update(pretrained='open-mmlab://resnet101_v1c', backbone=dict(depth=101)) diff --git a/mmseg/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py b/mmseg/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py new file mode 100644 index 0000000000..ddeed37ea0 --- /dev/null +++ b/mmseg/configs/deeplabv3plus/deeplabv3plus_r18-d8_4xb4-80k_loveda-512x512.py @@ -0,0 +1,15 @@ +from mmengine.config import read_base + +with read_base(): + from .deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512 import * + +model.update( + pretrained='open-mmlab://resnet18_v1c', + backbone=dict(depth=18), + decode_head=dict( + c1_in_channels=64, + c1_channels=12, + in_channels=512, + channels=128, + ), + auxiliary_head=dict(in_channels=256, channels=64)) diff --git a/mmseg/configs/deeplabv3plus/deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512.py b/mmseg/configs/deeplabv3plus/deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512.py new file mode 100644 index 0000000000..a5fdc3e8c2 --- /dev/null +++ b/mmseg/configs/deeplabv3plus/deeplabv3plus_r50_d8_4xb4_80k_loveda_512x512.py @@ -0,0 +1,15 @@ +from mmengine.config import read_base + +with read_base(): + from .._base_.datasets.loveda import * + from .._base_.models.deeplabv3plus_r50_d8 import * + from .._base_.schedules.schedule_80k import * + from .._base_.default_runtime import * + +crop_size = (512, 512) +data_preprocessor.update(size=crop_size) + +model.update( + data_preprocessor=data_preprocessor, + decode_head=dict(num_classes=7), + auxiliary_head=dict(num_classes=7))