Skip to content

Commit b640680

Browse files
committed
Add experimental FPN-style resnet50 backbone.
1 parent 0c17b0a commit b640680

File tree

1 file changed

+15
-47
lines changed
  • torchvision/models/detection

1 file changed

+15
-47
lines changed

torchvision/models/detection/ssd.py

Lines changed: 15 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -572,70 +572,39 @@ def __init__(self, backbone: resnet.ResNet):
572572
super().__init__()
573573

574574
self.features = nn.Sequential(
575-
backbone.conv1,
576-
backbone.bn1,
577-
backbone.relu,
578-
backbone.maxpool,
579-
backbone.layer1,
580-
backbone.layer2,
575+
nn.Sequential(
576+
backbone.conv1,
577+
backbone.bn1,
578+
backbone.relu,
579+
backbone.maxpool,
580+
backbone.layer1,
581+
backbone.layer2,
582+
),
581583
backbone.layer3,
582584
backbone.layer4,
583585
)
584586

585-
# Patch last block's strides to get valid output sizes
586-
for m in self.features[-1][0].modules():
587-
if hasattr(m, 'stride'):
588-
m.stride = 1
589-
590587
backbone_out_channels = self.features[-1][-1].bn3.num_features
591588
extra = nn.ModuleList([
592589
nn.Sequential(
593-
nn.Conv2d(backbone_out_channels, 256, kernel_size=1, bias=False),
594-
nn.BatchNorm2d(256),
595-
nn.ReLU(inplace=True),
596-
nn.Conv2d(256, 512, kernel_size=3, padding=1, stride=2, bias=False),
597-
nn.BatchNorm2d(512),
598-
nn.ReLU(inplace=True),
599-
),
600-
nn.Sequential(
601-
nn.Conv2d(512, 256, kernel_size=1, bias=False),
602-
nn.BatchNorm2d(256),
603-
nn.ReLU(inplace=True),
604-
nn.Conv2d(256, 512, kernel_size=3, padding=1, stride=2, bias=False),
605-
nn.BatchNorm2d(512),
606-
nn.ReLU(inplace=True),
607-
),
608-
nn.Sequential(
609-
nn.Conv2d(512, 128, kernel_size=1, bias=False),
610-
nn.BatchNorm2d(128),
611-
nn.ReLU(inplace=True),
612-
nn.Conv2d(128, 256, kernel_size=3, padding=1, stride=2, bias=False),
590+
nn.Conv2d(backbone_out_channels, 256, kernel_size=3, padding=1, stride=2, bias=False),
613591
nn.BatchNorm2d(256),
614592
nn.ReLU(inplace=True),
615593
),
616594
nn.Sequential(
617-
nn.Conv2d(256, 128, kernel_size=1, bias=False),
618-
nn.BatchNorm2d(128),
619-
nn.ReLU(inplace=True),
620-
nn.Conv2d(128, 256, kernel_size=3, bias=False),
595+
nn.Conv2d(256, 256, kernel_size=3, padding=1, stride=2, bias=False),
621596
nn.BatchNorm2d(256),
622597
nn.ReLU(inplace=True),
623598
),
624-
nn.Sequential(
625-
nn.Conv2d(256, 128, kernel_size=1, bias=False),
626-
nn.BatchNorm2d(128),
627-
nn.ReLU(inplace=True),
628-
nn.Conv2d(128, 256, kernel_size=2, bias=False),
629-
nn.BatchNorm2d(256),
630-
nn.ReLU(inplace=True),
631-
)
632599
])
633600
_xavier_init(extra)
634601
self.extra = extra
635602

636603
def forward(self, x: Tensor) -> Dict[str, Tensor]:
637-
x = self.features(x)
638-
output = [x]
604+
output = []
605+
for block in self.features:
606+
x = block(x)
607+
output.append(x)
639608

640609
for block in self.extra:
641610
x = block(x)
@@ -667,8 +636,7 @@ def ssd512_resnet50(pretrained: bool = False, progress: bool = True, num_classes
667636
pretrained_backbone = False
668637

669638
backbone = _resnet_extractor("resnet50", pretrained_backbone, trainable_backbone_layers)
670-
anchor_generator = DefaultBoxGenerator([[2], [2, 3], [2, 3], [2, 3], [2], [2]],
671-
scales=[0.07, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05])
639+
anchor_generator = DefaultBoxGenerator([[2], [2, 3], [2, 3], [2, 3], [2]], min_ratio=0.04)
672640
model = SSD(backbone, anchor_generator, (512, 512), num_classes, **kwargs)
673641
if pretrained:
674642
weights_name = 'ssd512_resnet50_coco'

0 commit comments

Comments
 (0)