@@ -87,8 +87,8 @@ def forward(self, x):
87
87
return output
88
88
89
89
90
- def _vgg16_mfm_backbone ( pretrained , trainable_layers = 3 ):
91
- backbone = vgg .vgg16 (pretrained = pretrained ).features
90
+ def _vgg_mfm_backbone ( backbone_name , pretrained , trainable_layers = 3 ):
91
+ backbone = vgg .__dict__ [ backbone_name ] (pretrained = pretrained ).features
92
92
93
93
# Gather the indices of maxpools. These are the locations of output blocks.
94
94
stage_indices = [i for i , b in enumerate (backbone ) if isinstance (b , nn .MaxPool2d )]
@@ -113,61 +113,56 @@ def build_feature_map_block(layers, out_channels):
113
113
block .out_channels = out_channels
114
114
return block
115
115
116
+ penultimate_block_index = stage_indices [- 2 ]
116
117
feature_maps = nn .ModuleList ([
117
- # Conv4_3 map
118
118
build_feature_map_block (
119
- backbone [:23 ], # until conv4_3
119
+ backbone [:penultimate_block_index ], # until conv4_3
120
120
# TODO: add L2 nomarlization + scaling?
121
121
512
122
122
),
123
- # FC7 map
124
123
build_feature_map_block (
125
124
(
126
- * backbone [23 :- 1 ], # until conv5_3
127
- nn .MaxPool2d (kernel_size = 3 , stride = 1 , padding = 1 , ceil_mode = True ), # modified maxpool5
125
+ * backbone [penultimate_block_index :- 1 ], # until conv5_3, skip last maxpool
126
+ nn .MaxPool2d (kernel_size = 3 , stride = 1 , padding = 1 , ceil_mode = True ), # add modified maxpool5
128
127
nn .Conv2d (in_channels = 512 , out_channels = 1024 , kernel_size = 3 , padding = 6 , dilation = 6 ), # FC6 with atrous
129
128
nn .ReLU (inplace = True ),
130
129
nn .Conv2d (in_channels = 1024 , out_channels = 1024 , kernel_size = 1 ), # FC7
131
130
nn .ReLU (inplace = True )
132
131
),
133
132
1024
134
133
),
135
- # Conv8_2 map
136
134
build_feature_map_block (
137
135
(
138
136
nn .Conv2d (1024 , 256 , kernel_size = 1 ),
139
137
nn .ReLU (inplace = True ),
140
- nn .Conv2d (256 , 512 , kernel_size = 3 , padding = 1 , stride = 2 ),
138
+ nn .Conv2d (256 , 512 , kernel_size = 3 , padding = 1 , stride = 2 ), # conv8_2
141
139
nn .ReLU (inplace = True ),
142
140
),
143
141
512 ,
144
142
),
145
- # Conv9_2 map
146
143
build_feature_map_block (
147
144
(
148
145
nn .Conv2d (512 , 128 , kernel_size = 1 ),
149
146
nn .ReLU (inplace = True ),
150
- nn .Conv2d (128 , 256 , kernel_size = 3 , padding = 1 , stride = 2 ),
147
+ nn .Conv2d (128 , 256 , kernel_size = 3 , padding = 1 , stride = 2 ), # conv9_2
151
148
nn .ReLU (inplace = True ),
152
149
),
153
150
256 ,
154
151
),
155
- # Conv10_2 map
156
152
build_feature_map_block (
157
153
(
158
154
nn .Conv2d (256 , 128 , kernel_size = 1 ),
159
155
nn .ReLU (inplace = True ),
160
- nn .Conv2d (128 , 256 , kernel_size = 3 ),
156
+ nn .Conv2d (128 , 256 , kernel_size = 3 ), # conv10_2
161
157
nn .ReLU (inplace = True ),
162
158
),
163
159
256 ,
164
160
),
165
- # Conv11_2 map
166
161
build_feature_map_block (
167
162
(
168
163
nn .Conv2d (256 , 128 , kernel_size = 1 ),
169
164
nn .ReLU (inplace = True ),
170
- nn .Conv2d (128 , 256 , kernel_size = 3 ),
165
+ nn .Conv2d (128 , 256 , kernel_size = 3 ), # conv11_2
171
166
nn .ReLU (inplace = True ),
172
167
),
173
168
256 ,
@@ -186,7 +181,7 @@ def ssd_vgg16(pretrained=False, progress=True,
186
181
# no need to download the backbone if pretrained is set
187
182
pretrained_backbone = False
188
183
189
- backbone = _vgg16_mfm_backbone ( pretrained_backbone , trainable_layers = trainable_backbone_layers )
184
+ backbone = _vgg_mfm_backbone ( "vgg16" , pretrained_backbone , trainable_layers = trainable_backbone_layers )
190
185
model = SSD (backbone , num_classes , ** kwargs )
191
186
if pretrained :
192
187
pass # TODO: load pre-trained COCO weights
0 commit comments