Skip to content

Commit 434524a

Browse files
support rcil, prepare for ewf
1 parent 6636888 commit 434524a

21 files changed

+715
-24
lines changed

README.md

+8-7
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ You can star this repository to keep track of the project if it's helpful for yo
5353

5454
#### Supported Runner
5555

56-
| Runner | Model Zoo | Paper Link | Code Snippet |
57-
| :-: | :-: | :-: | :-: |
58-
| ILT | [click](./docs/modelzoo/ilt) | [ICCVW 2019](https://arxiv.org/pdf/1907.13372.pdf) | [click](./csseg/modules/runners/ilt.py) |
59-
| MIB | [click](./docs/modelzoo/mib) | [CVPR 2020](https://arxiv.org/pdf/2002.00718.pdf) | [click](./csseg/modules/runners/mib.py) |
60-
| UCD | [click](./docs/modelzoo/ucd) | [TPAMI 2022](https://arxiv.org/pdf/2203.14098.pdf) | [click](./csseg/modules/runners/ucd.py) |
61-
| PLOP | [click](./docs/modelzoo/plop) | [CVPR 2021](https://arxiv.org/pdf/2011.11390.pdf) | [click](./csseg/modules/runners/plop.py) |
62-
| RCIL | [click](./docs/modelzoo/rcil) | [CVPR 2022](https://arxiv.org/pdf/2203.05402.pdf) | [click](./csseg/modules/runners/rcil.py) |
56+
| Runner | Model Zoo | Paper Link | Code Snippet |
57+
| :-: | :-: | :-: | :-: |
58+
| ILT | [click](./docs/modelzoo/ilt) | [ICCVW 2019](https://arxiv.org/pdf/1907.13372.pdf) | [click](./csseg/modules/runners/ilt.py) |
59+
| MIB | [click](./docs/modelzoo/mib) | [CVPR 2020](https://arxiv.org/pdf/2002.00718.pdf) | [click](./csseg/modules/runners/mib.py) |
60+
| PLOP | [click](./docs/modelzoo/plop) | [CVPR 2021](https://arxiv.org/pdf/2011.11390.pdf) | [click](./csseg/modules/runners/plop.py) |
61+
| RCIL | [click](./docs/modelzoo/rcil) | [CVPR 2022](https://arxiv.org/pdf/2203.05402.pdf) | [click](./csseg/modules/runners/rcil.py) |
62+
| UCD | [click](./docs/modelzoo/ucd) | [TPAMI 2022](https://arxiv.org/pdf/2203.14098.pdf) | [click](./csseg/modules/runners/ucd.py) |
63+
| EWF | [click](./docs/modelzoo/ewf) | [CVPR 2023](https://openaccess.thecvf.com/content/CVPR2023/papers/Xiao_Endpoints_Weight_Fusion_for_Class_Incremental_Semantic_Segmentation_CVPR_2023_paper.pdf) | [click](./csseg/modules/runners/ewf.py) |
6364

6465
#### Supported Datasets
6566

csseg/configs/rcil/base_cfg.py

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'''BASE_CFG for RCIL'''
2+
# SEGMENTOR_CFG
3+
SEGMENTOR_CFG = {
4+
'type': 'RCILSegmentor',
5+
'num_known_classes_list': None,
6+
'selected_indices': (3,),
7+
'align_corners': False,
8+
'encoder_cfg': {
9+
'type': 'ResNetRCIL',
10+
'depth': 101,
11+
'outstride': 16,
12+
'out_indices': (0, 1, 2, 3),
13+
'norm_cfg': {'type': 'InPlaceABNSync', 'activation': 'leaky_relu', 'activation_param': 1.0},
14+
'act_cfg': {'type': 'LeakyReLU', 'negative_slope': 0.01, 'inplace': True},
15+
'pretrained': True,
16+
},
17+
'decoder_cfg': {
18+
'type': 'RCILASPPHead',
19+
'in_channels': 2048,
20+
'out_channels': 256,
21+
'dilations': (1, 6, 12, 18),
22+
'pooling_size': 32,
23+
'norm_cfg': {'type': 'InPlaceABNSync', 'activation': 'leaky_relu', 'activation_param': 1.0},
24+
'act_cfg': {'type': 'LeakyReLU', 'negative_slope': 0.01, 'inplace': True},
25+
},
26+
'losses_cfgs': {
27+
'segmentation_init': {
28+
'loss_seg': {'CrossEntropyLoss': {'scale_factor': 1.0, 'reduction': 'mean', 'ignore_index': 255}}
29+
},
30+
'segmentation_cl' : {
31+
'loss_seg': {'MIBUnbiasedCrossEntropyLoss': {'scale_factor': 1.0, 'reduction': 'mean', 'ignore_index': 255}}
32+
},
33+
'distillation': {'scale_factor': 1.0, 'spp_scales': [4, 8, 12, 16, 20, 24]},
34+
}
35+
}
36+
# RUNNER_CFG
37+
RUNNER_CFG = {
38+
'type': 'RCILRunner',
39+
'algorithm': 'RCIL',
40+
'task_name': '',
41+
'task_id': -1,
42+
'num_tasks': -1,
43+
'work_dir': '',
44+
'save_interval_epochs': 10,
45+
'eval_interval_epochs': 10,
46+
'log_interval_iterations': 10,
47+
'choose_best_segmentor_by_metric': 'mean_iou',
48+
'logfilepath': '',
49+
'num_total_classes': -1,
50+
'pseudolabeling_minimal_threshold': 0.001,
51+
'random_seed': 42,
52+
'segmentor_cfg': SEGMENTOR_CFG,
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug10-1_disjoint'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = False
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(11)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 11):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 10
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '10-1',
28+
'num_tasks': 11,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug10-1_overlap'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = True
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(11)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 11):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 10
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '10-1',
28+
'num_tasks': 11,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug15-1_disjoint'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = False
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(6)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 6):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 30
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '15-5s',
28+
'num_tasks': 6,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug15-1_overlap'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = True
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(6)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 6):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 30
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '15-5s',
28+
'num_tasks': 6,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug15-5_disjoint'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = False
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(2)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 2):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 30
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '15-5',
28+
'num_tasks': 2,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'''rcil_r101iabnd16_aspp_512x512_vocaug15-5_overlap'''
2+
import os
3+
from .base_cfg import RUNNER_CFG
4+
from .._base_ import DATASET_CFG_VOCAUG_512x512, OPTIMIZER_CFG_SGD, SCHEDULER_CFG_POLY, DATALOADER_CFG_BS24, PARALLEL_CFG
5+
6+
7+
# add dataset_cfg
8+
RUNNER_CFG['dataset_cfg'] = DATASET_CFG_VOCAUG_512x512.copy()
9+
RUNNER_CFG['dataset_cfg']['overlap'] = True
10+
# add dataloader_cfg
11+
RUNNER_CFG['dataloader_cfg'] = DATALOADER_CFG_BS24.copy()
12+
# add optimizer_cfg
13+
RUNNER_CFG['optimizer_cfg'] = OPTIMIZER_CFG_SGD.copy()
14+
# add scheduler_cfg
15+
RUNNER_CFG['scheduler_cfg'] = [
16+
SCHEDULER_CFG_POLY.copy() for _ in range(2)
17+
]
18+
RUNNER_CFG['scheduler_cfg'][0]['max_epochs'] = 30
19+
RUNNER_CFG['scheduler_cfg'][0]['lr'] = 0.02
20+
for i in range(1, 2):
21+
RUNNER_CFG['scheduler_cfg'][i]['max_epochs'] = 30
22+
RUNNER_CFG['scheduler_cfg'][i]['lr'] = 0.001
23+
# add parallel_cfg
24+
RUNNER_CFG['parallel_cfg'] = PARALLEL_CFG.copy()
25+
# modify RUNNER_CFG
26+
RUNNER_CFG.update({
27+
'task_name': '15-5',
28+
'num_tasks': 2,
29+
'num_total_classes': 21,
30+
'work_dir': os.path.split(__file__)[-1].split('.')[0],
31+
'logfilepath': f"{os.path.split(__file__)[-1].split('.')[0]}/{os.path.split(__file__)[-1].split('.')[0]}.log",
32+
})

csseg/modules/models/decoders/builder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
'''
77
import copy
88
from .aspphead import ASPPHead
9+
from .rcilaspphead import RCILASPPHead
910

1011

1112
'''BuildDecoder'''
1213
def BuildDecoder(decoder_cfg):
1314
decoder_cfg = copy.deepcopy(decoder_cfg)
1415
# supported decoders
1516
supported_decoders = {
16-
'ASPPHead': ASPPHead,
17+
'ASPPHead': ASPPHead, 'RCILASPPHead': RCILASPPHead,
1718
}
1819
# parse
1920
decoder_type = decoder_cfg.pop('type')

0 commit comments

Comments
 (0)