File size: 1,212 Bytes
22e1f7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import torch
import torch.nn as nn
from torchvision.models import resnet50, ResNet50_Weights
from torchvision.models._utils import IntermediateLayerGetter
from torchvision.ops import FeaturePyramidNetwork
from torchvision.ops.feature_pyramid_network import LastLevelMaxPool
class ResNet50FPNBackbone(nn.Module):
    def __init__(self, pretrained=True, out_channels=256):
        super().__init__()
        weights = ResNet50_Weights.DEFAULT if pretrained else None
        resnet = resnet50(weights=weights)
        self.body = IntermediateLayerGetter(
            resnet,
            return_layers={
                "layer1": "c2",
                "layer2": "c3",
                "layer3": "c4",
                "layer4": "c5"
            }
        )
        self.fpn = FeaturePyramidNetwork(
            in_channels_list=[
                256,
                512,
                1024,
                2048
            ],
            out_channels=out_channels,
            extra_blocks=LastLevelMaxPool()
        )
        self.out_channels = out_channels
    def forward(self, x):
        features = self.body(x)
        features = self.fpn(features)
        return features