Skip to content

Commit 3b9f629

Browse files
committed
feat: support specify return_stages to update_res()
1 parent c19b65c commit 3b9f629

File tree

9 files changed

+320
-72
lines changed

9 files changed

+320
-72
lines changed

ppcls/arch/backbone/base/theseus_layer.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,33 @@ def _return_dict_hook(self, layer, input, output):
4444
def _save_sub_res_hook(self, layer, input, output):
4545
self.res_dict[self.res_name] = output
4646

47+
def init_res(self,
48+
stages_pattern,
49+
return_patterns=None,
50+
return_stages=None):
51+
if return_patterns and return_stages:
52+
msg = f"The 'return_patterns' would be ignored when 'return_stages' is set."
53+
logger.warning(msg)
54+
return_stages = None
55+
56+
if return_stages is True:
57+
return_patterns = stages_pattern
58+
if isinstance(return_stages, int):
59+
return_stages = [return_stages]
60+
if isinstance(return_stages, list):
61+
if max(return_stages) > len(stages_pattern) or min(
62+
return_stages) < 0:
63+
msg = f"The 'return_stages' set error. Illegal value(s) have been ignored. The stages' pattern list is {stages_pattern}."
64+
logger.warning(msg)
65+
return_stages = [
66+
val for val in return_stages
67+
if val >= 0 and val < len(stages_pattern)
68+
]
69+
return_patterns = [stages_pattern[i] for i in return_stages]
70+
71+
if return_patterns:
72+
self.update_res(return_patterns)
73+
4774
def replace_sub(self, *args, **kwargs) -> None:
4875
msg = "The function 'replace_sub()' is deprecated, please use 'upgrade_sublayer()' instead."
4976
logger.error(DeprecationWarning(msg))

ppcls/arch/backbone/legendary_models/esnet.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ESNet_x1_0_pretrained.pdparams",
3737
}
3838

39+
MODEL_STAGES_PATTERN = {"ESNet": ["blocks[2]", "blocks[9]", "blocks[12]"]}
40+
3941
__all__ = list(MODEL_URLS.keys())
4042

4143

@@ -214,11 +216,13 @@ def forward(self, x):
214216

215217
class ESNet(TheseusLayer):
216218
def __init__(self,
219+
stages_pattern,
217220
class_num=1000,
218221
scale=1.0,
219222
dropout_prob=0.2,
220223
class_expand=1280,
221-
return_patterns=None):
224+
return_patterns=None,
225+
return_stages=None):
222226
super().__init__()
223227
self.scale = scale
224228
self.class_num = class_num
@@ -269,8 +273,10 @@ def __init__(self,
269273
self.flatten = nn.Flatten(start_axis=1, stop_axis=-1)
270274
self.fc = Linear(self.class_expand, self.class_num)
271275

272-
if return_patterns is not None:
273-
self.update_res(return_patterns)
276+
super().init_res(
277+
stages_pattern,
278+
return_patterns=return_patterns,
279+
return_stages=return_stages)
274280

275281
def forward(self, x):
276282
x = self.conv1(x)
@@ -309,7 +315,8 @@ def ESNet_x0_25(pretrained=False, use_ssld=False, **kwargs):
309315
Returns:
310316
model: nn.Layer. Specific `ESNet_x0_25` model depends on args.
311317
"""
312-
model = ESNet(scale=0.25, **kwargs)
318+
model = ESNet(
319+
scale=0.25, stages_pattern=MODEL_STAGES_PATTERN["ESNet"], **kwargs)
313320
_load_pretrained(pretrained, model, MODEL_URLS["ESNet_x0_25"], use_ssld)
314321
return model
315322

@@ -324,7 +331,8 @@ def ESNet_x0_5(pretrained=False, use_ssld=False, **kwargs):
324331
Returns:
325332
model: nn.Layer. Specific `ESNet_x0_5` model depends on args.
326333
"""
327-
model = ESNet(scale=0.5, **kwargs)
334+
model = ESNet(
335+
scale=0.5, stages_pattern=MODEL_STAGES_PATTERN["ESNet"], **kwargs)
328336
_load_pretrained(pretrained, model, MODEL_URLS["ESNet_x0_5"], use_ssld)
329337
return model
330338

@@ -339,7 +347,8 @@ def ESNet_x0_75(pretrained=False, use_ssld=False, **kwargs):
339347
Returns:
340348
model: nn.Layer. Specific `ESNet_x0_75` model depends on args.
341349
"""
342-
model = ESNet(scale=0.75, **kwargs)
350+
model = ESNet(
351+
scale=0.75, stages_pattern=MODEL_STAGES_PATTERN["ESNet"], **kwargs)
343352
_load_pretrained(pretrained, model, MODEL_URLS["ESNet_x0_75"], use_ssld)
344353
return model
345354

@@ -354,6 +363,7 @@ def ESNet_x1_0(pretrained=False, use_ssld=False, **kwargs):
354363
Returns:
355364
model: nn.Layer. Specific `ESNet_x1_0` model depends on args.
356365
"""
357-
model = ESNet(scale=1.0, **kwargs)
366+
model = ESNet(
367+
scale=1.0, stages_pattern=MODEL_STAGES_PATTERN["ESNet"], **kwargs)
358368
_load_pretrained(pretrained, model, MODEL_URLS["ESNet_x1_0"], use_ssld)
359369
return model

ppcls/arch/backbone/legendary_models/hrnet.py

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
"https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/HRNet_W64_C_pretrained.pdparams"
4444
}
4545

46+
MODEL_STAGES_PATTERN = {"HRNet": ["st4"]}
47+
4648
__all__ = list(MODEL_URLS.keys())
4749

4850

@@ -368,10 +370,12 @@ class HRNet(TheseusLayer):
368370
"""
369371

370372
def __init__(self,
373+
stages_pattern,
371374
width=18,
372375
has_se=False,
373376
class_num=1000,
374-
return_patterns=None):
377+
return_patterns=None,
378+
return_stages=None):
375379
super().__init__()
376380

377381
self.width = width
@@ -460,8 +464,11 @@ def __init__(self,
460464
2048,
461465
class_num,
462466
weight_attr=ParamAttr(initializer=Uniform(-stdv, stdv)))
463-
if return_patterns is not None:
464-
self.update_res(return_patterns)
467+
468+
super().init_res(
469+
stages_pattern,
470+
return_patterns=return_patterns,
471+
return_stages=return_stages)
465472

466473
def forward(self, x):
467474
x = self.conv_layer1_1(x)
@@ -517,7 +524,8 @@ def HRNet_W18_C(pretrained=False, use_ssld=False, **kwargs):
517524
Returns:
518525
model: nn.Layer. Specific `HRNet_W18_C` model depends on args.
519526
"""
520-
model = HRNet(width=18, **kwargs)
527+
model = HRNet(
528+
width=18, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
521529
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W18_C"], use_ssld)
522530
return model
523531

@@ -532,7 +540,8 @@ def HRNet_W30_C(pretrained=False, use_ssld=False, **kwargs):
532540
Returns:
533541
model: nn.Layer. Specific `HRNet_W30_C` model depends on args.
534542
"""
535-
model = HRNet(width=30, **kwargs)
543+
model = HRNet(
544+
width=30, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
536545
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W30_C"], use_ssld)
537546
return model
538547

@@ -547,7 +556,8 @@ def HRNet_W32_C(pretrained=False, use_ssld=False, **kwargs):
547556
Returns:
548557
model: nn.Layer. Specific `HRNet_W32_C` model depends on args.
549558
"""
550-
model = HRNet(width=32, **kwargs)
559+
model = HRNet(
560+
width=32, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
551561
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W32_C"], use_ssld)
552562
return model
553563

@@ -562,7 +572,8 @@ def HRNet_W40_C(pretrained=False, use_ssld=False, **kwargs):
562572
Returns:
563573
model: nn.Layer. Specific `HRNet_W40_C` model depends on args.
564574
"""
565-
model = HRNet(width=40, **kwargs)
575+
model = HRNet(
576+
width=40, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
566577
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W40_C"], use_ssld)
567578
return model
568579

@@ -577,7 +588,8 @@ def HRNet_W44_C(pretrained=False, use_ssld=False, **kwargs):
577588
Returns:
578589
model: nn.Layer. Specific `HRNet_W44_C` model depends on args.
579590
"""
580-
model = HRNet(width=44, **kwargs)
591+
model = HRNet(
592+
width=44, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
581593
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W44_C"], use_ssld)
582594
return model
583595

@@ -592,7 +604,8 @@ def HRNet_W48_C(pretrained=False, use_ssld=False, **kwargs):
592604
Returns:
593605
model: nn.Layer. Specific `HRNet_W48_C` model depends on args.
594606
"""
595-
model = HRNet(width=48, **kwargs)
607+
model = HRNet(
608+
width=48, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
596609
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W48_C"], use_ssld)
597610
return model
598611

@@ -607,7 +620,8 @@ def HRNet_W60_C(pretrained=False, use_ssld=False, **kwargs):
607620
Returns:
608621
model: nn.Layer. Specific `HRNet_W60_C` model depends on args.
609622
"""
610-
model = HRNet(width=60, **kwargs)
623+
model = HRNet(
624+
width=60, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
611625
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W60_C"], use_ssld)
612626
return model
613627

@@ -622,7 +636,8 @@ def HRNet_W64_C(pretrained=False, use_ssld=False, **kwargs):
622636
Returns:
623637
model: nn.Layer. Specific `HRNet_W64_C` model depends on args.
624638
"""
625-
model = HRNet(width=64, **kwargs)
639+
model = HRNet(
640+
width=64, stages_pattern=MODEL_STAGES_PATTERN["HRNet"], **kwargs)
626641
_load_pretrained(pretrained, model, MODEL_URLS["HRNet_W64_C"], use_ssld)
627642
return model
628643

@@ -637,7 +652,11 @@ def SE_HRNet_W18_C(pretrained=False, use_ssld=False, **kwargs):
637652
Returns:
638653
model: nn.Layer. Specific `SE_HRNet_W18_C` model depends on args.
639654
"""
640-
model = HRNet(width=18, has_se=True, **kwargs)
655+
model = HRNet(
656+
width=18,
657+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
658+
has_se=True,
659+
**kwargs)
641660
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W18_C"], use_ssld)
642661
return model
643662

@@ -652,7 +671,11 @@ def SE_HRNet_W30_C(pretrained=False, use_ssld=False, **kwargs):
652671
Returns:
653672
model: nn.Layer. Specific `SE_HRNet_W30_C` model depends on args.
654673
"""
655-
model = HRNet(width=30, has_se=True, **kwargs)
674+
model = HRNet(
675+
width=30,
676+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
677+
has_se=True,
678+
**kwargs)
656679
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W30_C"], use_ssld)
657680
return model
658681

@@ -667,7 +690,11 @@ def SE_HRNet_W32_C(pretrained=False, use_ssld=False, **kwargs):
667690
Returns:
668691
model: nn.Layer. Specific `SE_HRNet_W32_C` model depends on args.
669692
"""
670-
model = HRNet(width=32, has_se=True, **kwargs)
693+
model = HRNet(
694+
width=32,
695+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
696+
has_se=True,
697+
**kwargs)
671698
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W32_C"], use_ssld)
672699
return model
673700

@@ -682,7 +709,11 @@ def SE_HRNet_W40_C(pretrained=False, use_ssld=False, **kwargs):
682709
Returns:
683710
model: nn.Layer. Specific `SE_HRNet_W40_C` model depends on args.
684711
"""
685-
model = HRNet(width=40, has_se=True, **kwargs)
712+
model = HRNet(
713+
width=40,
714+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
715+
has_se=True,
716+
**kwargs)
686717
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W40_C"], use_ssld)
687718
return model
688719

@@ -697,7 +728,11 @@ def SE_HRNet_W44_C(pretrained=False, use_ssld=False, **kwargs):
697728
Returns:
698729
model: nn.Layer. Specific `SE_HRNet_W44_C` model depends on args.
699730
"""
700-
model = HRNet(width=44, has_se=True, **kwargs)
731+
model = HRNet(
732+
width=44,
733+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
734+
has_se=True,
735+
**kwargs)
701736
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W44_C"], use_ssld)
702737
return model
703738

@@ -712,7 +747,11 @@ def SE_HRNet_W48_C(pretrained=False, use_ssld=False, **kwargs):
712747
Returns:
713748
model: nn.Layer. Specific `SE_HRNet_W48_C` model depends on args.
714749
"""
715-
model = HRNet(width=48, has_se=True, **kwargs)
750+
model = HRNet(
751+
width=48,
752+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
753+
has_se=True,
754+
**kwargs)
716755
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W48_C"], use_ssld)
717756
return model
718757

@@ -727,7 +766,11 @@ def SE_HRNet_W60_C(pretrained=False, use_ssld=False, **kwargs):
727766
Returns:
728767
model: nn.Layer. Specific `SE_HRNet_W60_C` model depends on args.
729768
"""
730-
model = HRNet(width=60, has_se=True, **kwargs)
769+
model = HRNet(
770+
width=60,
771+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
772+
has_se=True,
773+
**kwargs)
731774
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W60_C"], use_ssld)
732775
return model
733776

@@ -742,6 +785,10 @@ def SE_HRNet_W64_C(pretrained=False, use_ssld=False, **kwargs):
742785
Returns:
743786
model: nn.Layer. Specific `SE_HRNet_W64_C` model depends on args.
744787
"""
745-
model = HRNet(width=64, has_se=True, **kwargs)
788+
model = HRNet(
789+
width=64,
790+
stages_pattern=MODEL_STAGES_PATTERN["HRNet"],
791+
has_se=True,
792+
**kwargs)
746793
_load_pretrained(pretrained, model, MODEL_URLS["SE_HRNet_W64_C"], use_ssld)
747794
return model

ppcls/arch/backbone/legendary_models/inception_v3.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@
2929
"https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/InceptionV3_pretrained.pdparams"
3030
}
3131

32+
MODEL_STAGES_PATTERN = {
33+
"InceptionV3": [
34+
"inception_block_list[2]", "inception_block_list[3]",
35+
"inception_block_list[7]", "inception_block_list[8]",
36+
"inception_block_list[10]"
37+
]
38+
}
39+
3240
__all__ = MODEL_URLS.keys()
3341
'''
3442
InceptionV3 config: dict.
@@ -454,7 +462,12 @@ class Inception_V3(TheseusLayer):
454462
model: nn.Layer. Specific Inception_V3 model depends on args.
455463
"""
456464

457-
def __init__(self, config, class_num=1000, return_patterns=None):
465+
def __init__(self,
466+
config,
467+
stages_pattern,
468+
class_num=1000,
469+
return_patterns=None,
470+
stages_pattern=None):
458471
super().__init__()
459472

460473
self.inception_a_list = config["inception_a"]
@@ -496,8 +509,11 @@ def __init__(self, config, class_num=1000, return_patterns=None):
496509
class_num,
497510
weight_attr=ParamAttr(initializer=Uniform(-stdv, stdv)),
498511
bias_attr=ParamAttr())
499-
if return_patterns is not None:
500-
self.update_res(return_patterns)
512+
513+
super().init_res(
514+
stages_pattern,
515+
return_patterns=return_patterns,
516+
return_stages=return_stages)
501517

502518
def forward(self, x):
503519
x = self.inception_stem(x)
@@ -533,6 +549,9 @@ def InceptionV3(pretrained=False, use_ssld=False, **kwargs):
533549
Returns:
534550
model: nn.Layer. Specific `InceptionV3` model
535551
"""
536-
model = Inception_V3(NET_CONFIG, **kwargs)
552+
model = Inception_V3(
553+
NET_CONFIG,
554+
stages_pattern=MODEL_STAGES_PATTERN["InceptionV3"],
555+
**kwargs)
537556
_load_pretrained(pretrained, model, MODEL_URLS["InceptionV3"], use_ssld)
538557
return model

0 commit comments

Comments
 (0)