Skip to content

Commit f5eb7f2

Browse files
yamengxiKID-7391
andauthored
[New model] Support CGNet (open-mmlab#223)
* added cgnet * added testing for cgnet * git test * add cgnet * fix __init__ * rename FGlo with GlobalContextExtractor * add readme.md and rename bn with norm * delete cg_head * fix a language mistake * rename cgnet_m3n21.py to cgnet.py * modify README.md * modify list to tuple * add fcn_head test * add assert to fcn_head * blank * fix fcn_head assert bug * add * add cgnet to README.md and model_zoo.md * modify cgnet README.md Co-authored-by: KID <[email protected]>
1 parent 8a174a3 commit f5eb7f2

File tree

11 files changed

+718
-7
lines changed

11 files changed

+718
-7
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ Supported methods:
8181
- [x] [PointRend](configs/point_rend)
8282
- [x] [EMANet](configs/emanet)
8383
- [x] [DNLNet](configs/dnlnet)
84+
- [x] [CGNet](configs/cgnet)
8485
- [x] [Mixed Precision (FP16) Training](configs/fp16/README.md)
8586

8687
## Installation

configs/_base_/models/cgnet.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# model settings
2+
norm_cfg = dict(type='SyncBN', eps=1e-03, requires_grad=True)
3+
model = dict(
4+
type='EncoderDecoder',
5+
backbone=dict(
6+
type='CGNet',
7+
norm_cfg=norm_cfg,
8+
in_channels=3,
9+
num_channels=(32, 64, 128),
10+
num_blocks=(3, 21),
11+
dilations=(2, 4),
12+
reductions=(8, 16)),
13+
decode_head=dict(
14+
type='FCNHead',
15+
in_channels=256,
16+
in_index=2,
17+
channels=256,
18+
num_convs=0,
19+
concat_input=False,
20+
dropout_ratio=0,
21+
num_classes=19,
22+
norm_cfg=norm_cfg,
23+
loss_decode=dict(
24+
type='CrossEntropyLoss',
25+
use_sigmoid=False,
26+
loss_weight=1.0,
27+
class_weight=[
28+
2.5959933, 6.7415504, 3.5354059, 9.8663225, 9.690899, 9.369352,
29+
10.289121, 9.953208, 4.3097677, 9.490387, 7.674431, 9.396905,
30+
10.347791, 6.3927646, 10.226669, 10.241062, 10.280587,
31+
10.396974, 10.055647
32+
])))
33+
# model training and testing settings
34+
train_cfg = dict(sampler=None)
35+
test_cfg = dict(mode='whole')

configs/cgnet/README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# CGNet: A Light-weight Context Guided Network for Semantic Segmentation
2+
3+
## Introduction
4+
5+
```latext
6+
@article{wu2018cgnet,
7+
title={CGNet: A Light-weight Context Guided Network for Semantic Segmentation},
8+
author={Wu, Tianyi and Tang, Sheng and Zhang, Rui and Zhang, Yongdong},
9+
journal={arXiv preprint arXiv:1811.08201},
10+
year={2018}
11+
}
12+
```
13+
14+
## Results and models
15+
16+
### Cityscapes
17+
18+
| Method | Backbone | Crop Size | Lr schd | Mem (GB) | Inf time (fps) | mIoU | mIoU(ms+flip) | download |
19+
|-----------|----------|-----------|--------:|----------|----------------|------:|--------------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
20+
| CGNet | M3N21 | 680x680 | 60000 | 7.5 | 30.51 | 65.63 | 68.04 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes_20201101_110253-4c0b2f2d.pth) &#124; [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_680x680_60k_cityscapes/cgnet_680x680_60k_cityscapes-20201101_110253.log.json) |
21+
| CGNet | M3N21 | 512x1024 | 60000 | 8.3 | 31.14 | 68.27 | 70.33 | [model](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes_20201101_110254-124ea03b.pth) &#124; [log](https://download.openmmlab.com/mmsegmentation/v0.5/cgnet/cgnet_512x1024_60k_cityscapes/cgnet_512x1024_60k_cityscapes-20201101_110254.log.json) |
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
_base_ = ['../_base_/models/cgnet.py', '../_base_/default_runtime.py']
2+
3+
# optimizer
4+
optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)
5+
optimizer_config = dict()
6+
# learning policy
7+
lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)
8+
# runtime settings
9+
total_iters = 60000
10+
checkpoint_config = dict(by_epoch=False, interval=4000)
11+
evaluation = dict(interval=4000, metric='mIoU')
12+
13+
# dataset settings
14+
dataset_type = 'CityscapesDataset'
15+
data_root = 'data/cityscapes/'
16+
img_norm_cfg = dict(
17+
mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True)
18+
crop_size = (512, 1024)
19+
train_pipeline = [
20+
dict(type='LoadImageFromFile'),
21+
dict(type='LoadAnnotations'),
22+
dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)),
23+
dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),
24+
dict(type='RandomFlip', flip_ratio=0.5),
25+
dict(type='PhotoMetricDistortion'),
26+
dict(type='Normalize', **img_norm_cfg),
27+
dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255),
28+
dict(type='DefaultFormatBundle'),
29+
dict(type='Collect', keys=['img', 'gt_semantic_seg']),
30+
]
31+
test_pipeline = [
32+
dict(type='LoadImageFromFile'),
33+
dict(
34+
type='MultiScaleFlipAug',
35+
img_scale=(2048, 1024),
36+
# img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],
37+
flip=False,
38+
transforms=[
39+
dict(type='Resize', keep_ratio=True),
40+
dict(type='RandomFlip'),
41+
dict(type='Normalize', **img_norm_cfg),
42+
dict(type='ImageToTensor', keys=['img']),
43+
dict(type='Collect', keys=['img']),
44+
])
45+
]
46+
data = dict(
47+
samples_per_gpu=8,
48+
workers_per_gpu=8,
49+
train=dict(
50+
type=dataset_type,
51+
data_root=data_root,
52+
img_dir='leftImg8bit/train',
53+
ann_dir='gtFine/train',
54+
pipeline=train_pipeline),
55+
val=dict(
56+
type=dataset_type,
57+
data_root=data_root,
58+
img_dir='leftImg8bit/val',
59+
ann_dir='gtFine/val',
60+
pipeline=test_pipeline),
61+
test=dict(
62+
type=dataset_type,
63+
data_root=data_root,
64+
img_dir='leftImg8bit/val',
65+
ann_dir='gtFine/val',
66+
pipeline=test_pipeline))
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
_base_ = [
2+
'../_base_/models/cgnet.py', '../_base_/datasets/cityscapes.py',
3+
'../_base_/default_runtime.py'
4+
]
5+
6+
# optimizer
7+
optimizer = dict(type='Adam', lr=0.001, eps=1e-08, weight_decay=0.0005)
8+
optimizer_config = dict()
9+
# learning policy
10+
lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)
11+
# runtime settings
12+
total_iters = 60000
13+
checkpoint_config = dict(by_epoch=False, interval=4000)
14+
evaluation = dict(interval=4000, metric='mIoU')
15+
16+
img_norm_cfg = dict(
17+
mean=[72.39239876, 82.90891754, 73.15835921], std=[1, 1, 1], to_rgb=True)
18+
crop_size = (680, 680)
19+
train_pipeline = [
20+
dict(type='LoadImageFromFile'),
21+
dict(type='LoadAnnotations'),
22+
dict(type='Resize', img_scale=(2048, 1024), ratio_range=(0.5, 2.0)),
23+
dict(type='RandomCrop', crop_size=crop_size),
24+
dict(type='RandomFlip', flip_ratio=0.5),
25+
dict(type='Normalize', **img_norm_cfg),
26+
dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255),
27+
dict(type='DefaultFormatBundle'),
28+
dict(type='Collect', keys=['img', 'gt_semantic_seg']),
29+
]
30+
test_pipeline = [
31+
dict(type='LoadImageFromFile'),
32+
dict(
33+
type='MultiScaleFlipAug',
34+
img_scale=(2048, 1024),
35+
# img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],
36+
flip=False,
37+
transforms=[
38+
dict(type='Resize', keep_ratio=True),
39+
dict(type='RandomFlip'),
40+
dict(type='Normalize', **img_norm_cfg),
41+
dict(type='ImageToTensor', keys=['img']),
42+
dict(type='Collect', keys=['img']),
43+
])
44+
]
45+
data = dict(
46+
samples_per_gpu=8,
47+
workers_per_gpu=8,
48+
train=dict(pipeline=train_pipeline),
49+
val=dict(pipeline=test_pipeline),
50+
test=dict(pipeline=test_pipeline))

docs/model_zoo.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ Please refer to [EMANet](https://github.com/open-mmlab/mmsegmentation/blob/maste
111111

112112
Please refer to [DNLNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/dnlnet) for details.
113113

114+
### CGNet
115+
116+
Please refer to [CGNet](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/cgnet) for details.
117+
114118
### Mixed Precision (FP16) Training
115119

116120
Please refer [Mixed Precision (FP16) Training](https://github.com/open-mmlab/mmsegmentation/blob/master/configs/fp16/README.md) for details.

mmseg/models/backbones/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from .cgnet import CGNet
12
from .fast_scnn import FastSCNN
23
from .hrnet import HRNet
34
from .mobilenet_v2 import MobileNetV2
@@ -8,5 +9,5 @@
89

910
__all__ = [
1011
'ResNet', 'ResNetV1c', 'ResNetV1d', 'ResNeXt', 'HRNet', 'FastSCNN',
11-
'ResNeSt', 'MobileNetV2', 'UNet'
12+
'ResNeSt', 'MobileNetV2', 'UNet', 'CGNet'
1213
]

0 commit comments

Comments
 (0)