Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[New configs]Deeplabv3plus loveda #3536

Open
wants to merge 1 commit into
base: dev-1.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions mmseg/configs/_base_/datasets/loveda.py
Original file line number Diff line number Diff line change
@@ -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
32 changes: 32 additions & 0 deletions mmseg/configs/_base_/default_runtime.py
Original file line number Diff line number Diff line change
@@ -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
60 changes: 60 additions & 0 deletions mmseg/configs/_base_/models/deeplabv3plus_r50_d8.py
Original file line number Diff line number Diff line change
@@ -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'))
23 changes: 23 additions & 0 deletions mmseg/configs/_base_/schedules/schedule_80k.py
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
@@ -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))