D-Master_UDA / D-MASTER_1 /models /backbones.py
krbism's picture
Upload 122 files
4f6d7b6 verified
Raw
History Blame Contribute Delete
2.3 kB
import torch
import torchvision.ops.misc as misc
from torchvision.models import resnet18, resnet50, resnet101
from torchvision.models.resnet import ResNet18_Weights, ResNet50_Weights, ResNet101_Weights
from torchvision.models._utils import IntermediateLayerGetter
from utils import is_main_process
class ResNetMultiScale(torch.nn.Module):
def __init__(self):
super().__init__()
backbone, self.num_channels = self.get_backbone()
for name, parameter in backbone.named_parameters():
if 'layer2' not in name and 'layer3' not in name and 'layer4' not in name:
parameter.requires_grad_(False)
self.num_outputs = 3
return_layers = {"layer2": "0", "layer3": "1", "layer4": "2"}
self.strides = [8, 16, 32]
self.intermediate_getter = IntermediateLayerGetter(backbone, return_layers=return_layers)
def get_backbone(self):
raise NotImplementedError('This method should be implemented by subclasses.')
def forward(self, tensor):
out = self.intermediate_getter(tensor)
return [out['0'], out['1'], out['2']]
class ResNet18MultiScale(ResNetMultiScale):
def __init__(self):
super().__init__()
def get_backbone(self):
return resnet18(
replace_stride_with_dilation=[False, False, False],
weights=ResNet18_Weights.DEFAULT if is_main_process() else None,
norm_layer=misc.FrozenBatchNorm2d
), [128, 256, 512]
class ResNet50MultiScale(ResNetMultiScale):
def __init__(self):
super().__init__()
def get_backbone(self):
return resnet50(
replace_stride_with_dilation=[False, False, False],
weights=ResNet50_Weights.IMAGENET1K_V1 if is_main_process() else None,
norm_layer=misc.FrozenBatchNorm2d
), [512, 1024, 2048]
class ResNet101MultiScale(ResNetMultiScale):
def __init__(self):
super().__init__()
def get_backbone(self):
return resnet101(
replace_stride_with_dilation=[False, False, False],
weights=ResNet101_Weights.DEFAULT if is_main_process() else None,
norm_layer=misc.FrozenBatchNorm2d
), [512, 1024, 2048]