Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

darknet53.py 4.6 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  1. """
  2. Darknet
  3. credits: https://github.com/ultralytics
  4. """
  5. from torch import nn
  6. from super_gradients.training.models.sg_module import SgModule
  7. def create_conv_module(in_channels, out_channels, kernel_size=3, stride=1):
  8. padding = (kernel_size - 1) // 2
  9. nn_sequential_module = nn.Sequential()
  10. nn_sequential_module.add_module('Conv2d', nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size,
  11. stride=stride, padding=padding, bias=False))
  12. nn_sequential_module.add_module('BatchNorm2d', nn.BatchNorm2d(out_channels))
  13. nn_sequential_module.add_module('LeakyRelu', nn.LeakyReLU())
  14. return nn_sequential_module
  15. # Residual block
  16. class DarkResidualBlock(nn.Module):
  17. """
  18. DarkResidualBlock - The Darknet Residual Block
  19. """
  20. def __init__(self, in_channels, shortcut=True):
  21. super(DarkResidualBlock, self).__init__()
  22. self.shortcut = shortcut
  23. reduced_channels = int(in_channels / 2)
  24. self.layer1 = create_conv_module(in_channels, reduced_channels, kernel_size=1)
  25. self.layer2 = create_conv_module(reduced_channels, in_channels)
  26. def forward(self, x):
  27. residual = x
  28. out = self.layer1(x)
  29. out = self.layer2(out)
  30. out += residual if self.shortcut else out
  31. return out
  32. class Darknet53Base(SgModule):
  33. def __init__(self):
  34. super(Darknet53Base, self).__init__()
  35. # THE MODULES LIST IS APPROACHABLE FROM "OUTSIDE THE CLASS - SO WE CAN CHANGE IT'S STRUCTURE"
  36. self.modules_list = nn.ModuleList()
  37. self.modules_list.append(create_conv_module(3, 32)) # 0
  38. self.modules_list.append(create_conv_module(32, 64, stride=2)) # 1
  39. self.modules_list.append(self._make_layer(DarkResidualBlock, in_channels=64, num_blocks=1)) # 2
  40. self.modules_list.append(create_conv_module(64, 128, stride=2)) # 3
  41. self.modules_list.append(self._make_layer(DarkResidualBlock, in_channels=128, num_blocks=2)) # 4
  42. self.modules_list.append(create_conv_module(128, 256, stride=2)) # 5
  43. self.modules_list.append(self._make_layer(DarkResidualBlock, in_channels=256, num_blocks=8)) # 6
  44. self.modules_list.append(create_conv_module(256, 512, stride=2)) # 7
  45. self.modules_list.append(self._make_layer(DarkResidualBlock, in_channels=512, num_blocks=8)) # 8
  46. self.modules_list.append(create_conv_module(512, 1024, stride=2)) # 9
  47. self.modules_list.append(self._make_layer(DarkResidualBlock, in_channels=1024, num_blocks=4)) # 10
  48. def forward(self, x):
  49. out = x
  50. for i, module in enumerate(self.modules_list):
  51. out = self.modules_list[i](out)
  52. return out
  53. def _make_layer(self, block, in_channels, num_blocks):
  54. layers = []
  55. for i in range(0, num_blocks):
  56. layers.append(block(in_channels))
  57. return nn.Sequential(*layers)
  58. class Darknet53(Darknet53Base):
  59. def __init__(self, arch_params=None, backbone_mode=True, num_classes=None):
  60. super(Darknet53, self).__init__()
  61. # IN ORDER TO ALLOW PASSING PARAMETERS WITH ARCH_PARAMS BUT NOT BREAK YOLOV3 INTEGRATION
  62. self.backbone_mode = arch_params.backbone_mode if hasattr(arch_params, 'backbone_mode') else backbone_mode
  63. self.num_classes = arch_params.num_classes if hasattr(arch_params, 'num_classes') else num_classes
  64. if not self.backbone_mode:
  65. # IF NOT USED AS A BACKEND BUT AS A CLASSIFIER WE ADD THE CLASSIFICATION LAYERS
  66. if self.num_classes is not None:
  67. nn_sequential_block = nn.Sequential()
  68. nn_sequential_block.add_module('global_avg_pool', nn.AdaptiveAvgPool2d((1, 1)))
  69. nn_sequential_block.add_module('view', ViewModule(1024))
  70. nn_sequential_block.add_module('fc', nn.Linear(1024, self.num_classes))
  71. self.modules_list.append(nn_sequential_block)
  72. else:
  73. raise ValueError('num_classes must be specified to use Darknet53 as a classifier')
  74. def get_modules_list(self):
  75. return self.modules_list
  76. def forward(self, x):
  77. """
  78. forward - Forward pass on the modules list
  79. :param x: The input data
  80. :return: forward pass for backbone pass or classification pass
  81. """
  82. return super().forward(x)
  83. # Residual block
  84. class ViewModule(nn.Module):
  85. """
  86. Returns a reshaped version of the input, to be used in None-Backbone Mode
  87. """
  88. def __init__(self, features=1024):
  89. super(ViewModule, self).__init__()
  90. self.features = features
  91. def forward(self, x):
  92. return x.view(-1, self.features)
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...