|
@@ -88,8 +88,29 @@ class Bottleneck(nn.Module):
|
|
|
# ResNet 主类
|
|
# ResNet 主类
|
|
|
# ----------------------------
|
|
# ----------------------------
|
|
|
|
|
|
|
|
|
|
+def resnet18fpn(out_channels=256):
|
|
|
|
|
+ backbone = ResNet(Bottleneck,[2,2,2])
|
|
|
|
|
+ return_layers = {
|
|
|
|
|
+ 'encoder0': '0',
|
|
|
|
|
+ 'encoder1': '1',
|
|
|
|
|
+ 'encoder2': '2',
|
|
|
|
|
+ 'encoder3': '3',
|
|
|
|
|
+ # 'encoder4': '5'
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ # in_channels_list = [self.inplanes, 64, 128, 256, 512]
|
|
|
|
|
+ # in_channels_list = [64, 256, 512, 1024, 2048]
|
|
|
|
|
+ in_channels_list = [64, 256, 512, 1024]
|
|
|
|
|
+
|
|
|
|
|
+ return BackboneWithFPN(
|
|
|
|
|
+ backbone,
|
|
|
|
|
+ return_layers=return_layers,
|
|
|
|
|
+ in_channels_list=in_channels_list,
|
|
|
|
|
+ out_channels=out_channels,
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
def resnet50fpn(out_channels=256):
|
|
def resnet50fpn(out_channels=256):
|
|
|
- backbone = ResNet(Bottleneck)
|
|
|
|
|
|
|
+ backbone = ResNet(Bottleneck,[3,4,6])
|
|
|
return_layers = {
|
|
return_layers = {
|
|
|
'encoder0': '0',
|
|
'encoder0': '0',
|
|
|
'encoder1': '1',
|
|
'encoder1': '1',
|
|
@@ -111,7 +132,7 @@ def resnet50fpn(out_channels=256):
|
|
|
|
|
|
|
|
|
|
|
|
|
class ResNet(nn.Module):
|
|
class ResNet(nn.Module):
|
|
|
- def __init__(self, block: Type[Union[Bottleneck]],):
|
|
|
|
|
|
|
+ def __init__(self, block: Type[Union[Bottleneck]], layers: List[int],):
|
|
|
super(ResNet, self).__init__()
|
|
super(ResNet, self).__init__()
|
|
|
self._norm_layer = nn.BatchNorm2d
|
|
self._norm_layer = nn.BatchNorm2d
|
|
|
self.inplanes = 64
|
|
self.inplanes = 64
|
|
@@ -126,9 +147,9 @@ class ResNet(nn.Module):
|
|
|
nn.ReLU(inplace=True),
|
|
nn.ReLU(inplace=True),
|
|
|
nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
|
|
nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
|
|
|
)
|
|
)
|
|
|
- self.encoder1 = self._make_layer(block, 64, 3,stride=2)
|
|
|
|
|
- self.encoder2 = self._make_layer(block, 128, 4, stride=2)
|
|
|
|
|
- self.encoder3 = self._make_layer(block, 256, 6, stride=2)
|
|
|
|
|
|
|
+ self.encoder1 = self._make_layer(block, 64, layers[0],stride=2)
|
|
|
|
|
+ self.encoder2 = self._make_layer(block, 128, layers[1], stride=2)
|
|
|
|
|
+ self.encoder3 = self._make_layer(block, 256, layers[2], stride=2)
|
|
|
# self.encoder4 = self._make_layer(block, 512, 3, stride=2)
|
|
# self.encoder4 = self._make_layer(block, 512, 3, stride=2)
|
|
|
# self.encoder5 = self._make_layer(block, 512, 3, stride=2)
|
|
# self.encoder5 = self._make_layer(block, 512, 3, stride=2)
|
|
|
# self.body = nn.ModuleDict({
|
|
# self.body = nn.ModuleDict({
|
|
@@ -253,7 +274,7 @@ if __name__ == "__main__":
|
|
|
input_tensor = torch.randn(1, 3, 512, 512).to(device)
|
|
input_tensor = torch.randn(1, 3, 512, 512).to(device)
|
|
|
output_tensor = model(input_tensor)
|
|
output_tensor = model(input_tensor)
|
|
|
|
|
|
|
|
- backbone = ResNet(Bottleneck).to(device)
|
|
|
|
|
|
|
+ backbone = ResNet(Bottleneck,[3,4,6]).to(device)
|
|
|
features = backbone(input_tensor)
|
|
features = backbone(input_tensor)
|
|
|
print("Raw backbone output:", list(features.keys()))
|
|
print("Raw backbone output:", list(features.keys()))
|
|
|
print(f"Input shape: {input_tensor.shape}")
|
|
print(f"Input shape: {input_tensor.shape}")
|