resnet50.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. # import torch
  2. # import torch.nn as nn
  3. # import torchvision.models as models
  4. #
  5. #
  6. # class ResNet50Backbone(nn.Module):
  7. # def __init__(self, num_classes=5, num_stacks=1, pretrained=True):
  8. # super(ResNet50Backbone, self).__init__()
  9. #
  10. # # 加载预训练的ResNet50
  11. # if pretrained:
  12. # resnet = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1)
  13. # else:
  14. # resnet = models.resnet50(weights=None)
  15. #
  16. # # 移除最后的全连接层
  17. # self.backbone = nn.Sequential(
  18. # resnet.conv1,#特征图分辨率降低为1/2,通道数从3升为64
  19. # resnet.bn1,
  20. # resnet.relu,
  21. # resnet.maxpool,#特征图分辨率降低为1/4,通道数仍然为64
  22. # resnet.layer1,#stride为1,不改变分辨率,依然为1/4,通道数从64升为64*4=256
  23. # # resnet.layer2,#stride为2,特征图分辨率降低为1/8,通道数从256升为128*4=512
  24. # # resnet.layer3,#stride为2,特征图分辨率降低为1/16,通道数从512升为256*4=1024
  25. # # resnet.layer4,#stride为2,特征图分辨率降低为1/32,通道数从512升为256*4=2048
  26. # )
  27. #
  28. # # 多任务输出层
  29. # self.score_layers = nn.ModuleList([
  30. # nn.Sequential(
  31. # nn.Conv2d(256, 128, kernel_size=3, padding=1),
  32. # nn.BatchNorm2d(128),
  33. # nn.ReLU(inplace=True),
  34. # nn.Conv2d(128, num_classes, kernel_size=1)
  35. # )
  36. # for _ in range(num_stacks)
  37. # ])
  38. #
  39. # # 上采样层,确保输出大小为128x128
  40. # self.upsample = nn.Upsample(
  41. # scale_factor=0.25,
  42. # mode='bilinear',
  43. # align_corners=True
  44. # )
  45. #
  46. # def forward(self, x):
  47. # # 主干网络特征提取
  48. # x = self.backbone(x)
  49. #
  50. # # # 调整通道数
  51. # # x = self.channel_adjust(x)
  52. # #
  53. # # # 上采样到128x128
  54. # # x = self.upsample(x)
  55. #
  56. # # 多堆栈输出
  57. # outputs = []
  58. # for score_layer in self.score_layers:
  59. # output = score_layer(x)
  60. # outputs.append(output)
  61. #
  62. # # 返回第一个输出(如果有多个堆栈)
  63. # return outputs, x
  64. #
  65. #
  66. # def resnet50(**kwargs):
  67. # model = ResNet50Backbone(
  68. # num_classes=kwargs.get("num_classes", 5),
  69. # num_stacks=kwargs.get("num_stacks", 1),
  70. # pretrained=kwargs.get("pretrained", True)
  71. # )
  72. # return model
  73. #
  74. #
  75. # __all__ = ["ResNet50Backbone", "resnet50"]
  76. #
  77. #
  78. # # 测试网络输出
  79. # model = resnet50(num_classes=5, num_stacks=1)
  80. #
  81. #
  82. # # 方法1:直接传入图像张量
  83. # x = torch.randn(2, 3, 512, 512)
  84. # outputs, feature = model(x)
  85. # print("Outputs length:", len(outputs))
  86. # print("Output[0] shape:", outputs[0].shape)
  87. # print("Feature shape:", feature.shape)
  88. import torch
  89. import torch.nn as nn
  90. import torchvision
  91. import torchvision.models as models
  92. from torchvision.models.detection.backbone_utils import _validate_trainable_layers, _resnet_fpn_extractor
  93. class ResNet50Backbone1(nn.Module):
  94. def __init__(self, num_classes=5, num_stacks=1, pretrained=True):
  95. super(ResNet50Backbone1, self).__init__()
  96. # 加载预训练的ResNet50
  97. if pretrained:
  98. # self.resnet = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1)
  99. trainable_backbone_layers = _validate_trainable_layers(True, None, 5, 3)
  100. backbone = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V1)
  101. self.resnet = _resnet_fpn_extractor(backbone, trainable_backbone_layers)
  102. else:
  103. self.resnet = models.resnet50(weights=None)
  104. def forward(self, x):
  105. features = self.resnet(x)
  106. # if self.training:
  107. # proposals, matched_idxs, labels, regression_targets = self.select_training_samples20(proposals, targets)
  108. # else:
  109. # labels = None
  110. # regression_targets = None
  111. # matched_idxs = None
  112. # box_features = self.box_roi_pool(features, proposals, image_shapes) # ROI 映射到固定尺寸的特征表示上
  113. # # print(f"box_features:{box_features.shape}") # [2048, 256, 7, 7] 建议框统一大小
  114. # box_features = self.box_head(box_features) #
  115. # # print(f"box_features:{box_features.shape}") # [N, 1024] 经过头部网络处理后的特征向量
  116. # class_logits, box_regression = self.box_predictor(box_features)
  117. #
  118. # result: List[Dict[str, torch.Tensor]] = []
  119. # losses = {}
  120. # if self.training:
  121. # if labels is None:
  122. # raise ValueError("labels cannot be None")
  123. # if regression_targets is None:
  124. # raise ValueError("regression_targets cannot be None")
  125. # loss_classifier, loss_box_reg = fastrcnn_loss(class_logits, box_regression, labels, regression_targets)
  126. # losses = {"loss_classifier": loss_classifier, "loss_box_reg": loss_box_reg}
  127. # else:
  128. # boxes, scores, labels = self.postprocess_detections(class_logits, box_regression, proposals, image_shapes)
  129. # num_images = len(boxes)
  130. # for i in range(num_images):
  131. # result.append(
  132. # {
  133. # "boxes": boxes[i],
  134. # "labels": labels[i],
  135. # "scores": scores[i],
  136. # }
  137. # )
  138. # print(f"boxes:{boxes[0].shape}")
  139. return x['0']
  140. # # 多堆栈输出
  141. # outputs = []
  142. # for score_layer in self.score_layers:
  143. # output = score_layer(x)
  144. # outputs.append(output)
  145. #
  146. # # 返回第一个输出(如果有多个堆栈)
  147. # return outputs, x
  148. def resnet501(**kwargs):
  149. model = ResNet50Backbone1(
  150. num_classes=kwargs.get("num_classes", 5),
  151. num_stacks=kwargs.get("num_stacks", 1),
  152. pretrained=kwargs.get("pretrained", True)
  153. )
  154. return model
  155. # __all__ = ["ResNet50Backbone1", "resnet501"]
  156. #
  157. # # 测试网络输出
  158. # model = resnet501(num_classes=5, num_stacks=1)
  159. #
  160. # # 方法1:直接传入图像张量
  161. # x = torch.randn(2, 3, 512, 512)
  162. # # outputs, feature = model(x)
  163. # # print("Outputs length:", len(outputs))
  164. # # print("Output[0] shape:", outputs[0].shape)
  165. # # print("Feature shape:", feature.shape)
  166. # feature = model(x)
  167. # print("Feature shape:", feature.keys())