Skip to content

Commit bffe4bc

Browse files
committed
Making code generic to support all vggs.
1 parent 9779324 commit bffe4bc

File tree

1 file changed

+11
-16
lines changed
  • torchvision/models/detection

1 file changed

+11
-16
lines changed

torchvision/models/detection/ssd.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ def forward(self, x):
8787
return output
8888

8989

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
9292

9393
# Gather the indices of maxpools. These are the locations of output blocks.
9494
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):
113113
block.out_channels = out_channels
114114
return block
115115

116+
penultimate_block_index = stage_indices[-2]
116117
feature_maps = nn.ModuleList([
117-
# Conv4_3 map
118118
build_feature_map_block(
119-
backbone[:23], # until conv4_3
119+
backbone[:penultimate_block_index], # until conv4_3
120120
# TODO: add L2 nomarlization + scaling?
121121
512
122122
),
123-
# FC7 map
124123
build_feature_map_block(
125124
(
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
128127
nn.Conv2d(in_channels=512, out_channels=1024, kernel_size=3, padding=6, dilation=6), # FC6 with atrous
129128
nn.ReLU(inplace=True),
130129
nn.Conv2d(in_channels=1024, out_channels=1024, kernel_size=1), # FC7
131130
nn.ReLU(inplace=True)
132131
),
133132
1024
134133
),
135-
# Conv8_2 map
136134
build_feature_map_block(
137135
(
138136
nn.Conv2d(1024, 256, kernel_size=1),
139137
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
141139
nn.ReLU(inplace=True),
142140
),
143141
512,
144142
),
145-
# Conv9_2 map
146143
build_feature_map_block(
147144
(
148145
nn.Conv2d(512, 128, kernel_size=1),
149146
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
151148
nn.ReLU(inplace=True),
152149
),
153150
256,
154151
),
155-
# Conv10_2 map
156152
build_feature_map_block(
157153
(
158154
nn.Conv2d(256, 128, kernel_size=1),
159155
nn.ReLU(inplace=True),
160-
nn.Conv2d(128, 256, kernel_size=3),
156+
nn.Conv2d(128, 256, kernel_size=3), # conv10_2
161157
nn.ReLU(inplace=True),
162158
),
163159
256,
164160
),
165-
# Conv11_2 map
166161
build_feature_map_block(
167162
(
168163
nn.Conv2d(256, 128, kernel_size=1),
169164
nn.ReLU(inplace=True),
170-
nn.Conv2d(128, 256, kernel_size=3),
165+
nn.Conv2d(128, 256, kernel_size=3), # conv11_2
171166
nn.ReLU(inplace=True),
172167
),
173168
256,
@@ -186,7 +181,7 @@ def ssd_vgg16(pretrained=False, progress=True,
186181
# no need to download the backbone if pretrained is set
187182
pretrained_backbone = False
188183

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)
190185
model = SSD(backbone, num_classes, **kwargs)
191186
if pretrained:
192187
pass # TODO: load pre-trained COCO weights

0 commit comments

Comments
 (0)