def build_resnet_fpn_p3p7_backbone(cfg): #构建论文中backbone部分以及特征金字塔的P3-P7部分网络 body = resnet.ResNet(cfg) #构建body backbone中的C3-C5 #获取fpn所需要的channels参数 in_channels_stage2 = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS #256 out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS #256*4 #cfg.MODEL.RETINANET.USE_C5 = True # in_channels_p6p7 = 256*8 in_channels_p6p7 = in_channels_stage2 * 8 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels #构建fpn部分网络 fpn = fpn_module.FPN( in_channels_list=[ 0, # 因为从C3起才有P3,所以stage2跳过,设置为0 in_channels_stage2 * 2, #c3 in_channels_stage2 * 4, #c4 in_channels_stage2 * 8, #c5 ], out_channels=out_channels, #256*4 conv_block= conv_with_kaiming_uniform( # 这个conv如果stride=1的话就不变size,返回的是nn.Conv2d cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU #false false ), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), #256 256 ) # 通过有序字典将body和fpn送入nn.Sequential构造模型 model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) # 写成一个,body的输出作为fpn的输入 # 这个是为了之后有用,再赋一次值 model.out_channels = out_channels #256*4 return model
def __init__(self, cfg): super(GrowR50FPN, self).__init__() self.stem_conv1 = nn.Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False) self.stem_bn1 = nn.BatchNorm2d(64) self.stage_1_1 = GrowR50_BottleNeck(64, 256, 256, down_stride=2) # self.stage_1_2 = GrowR50_BottleNeck(256, 256, 256) # self.stage_2_1 = GrowR50_BottleNeck(256, 256, 512, down_stride=2) self.stage_2_1 = GrowR50_BottleNeck(256, 512, 512, down_stride=2) self.stage_3_1 = GrowR50_BottleNeck(512, 1024, 1024, down_stride=2) self.stage_4_1 = GrowR50_BottleNeck(1024, 2048, 2048, down_stride=2) self.fpn = fpn_module.FPN( in_channels_list=[0, 512, 1024, 2048], out_channels=256, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels=256, out_channels=256), )
def build_resnet_fpn_p3p7_backbone(cfg): body = resnet.ResNet(cfg) # 获取 fpn 所需的channels参数 in_channels_stage2 = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS # 256 out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS # 256 in_channels_p6p7 = in_channels_stage2 * 8 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels fpn = fpn_module.FPN( in_channels_list=[ 0, in_channels_stage2 * 2, # 因为从C3起才有P3,所以stage2跳过,设置为0 in_channels_stage2 * 4, in_channels_stage2 * 8, ], out_channels=out_channels, # cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS conv_block= conv_with_kaiming_uniform( # 这个conv如果stride=1的话就不变size,返回的是一个函数 cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU # eg: False, False ), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), # eg: 256, 256 ) # 通过有序字典将body和fpn送入nn.Sequential构造模型 model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) # 这个是为了之后有用,再赋一次值 model.out_channels = out_channels return model
def build_mnv2_fpn_backbone(cfg, basemodel=None): body = mobilenet.MobileNetV2(cfg) if basemodel is None else basemodel in_channels_stage2 = body.return_features_num_channels out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS fpn = fpn_module.FPN( in_channels_list=[ 0, in_channels_stage2[1], in_channels_stage2[2], in_channels_stage2[3], ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(out_channels, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_resnet_fpn_backbone(cfg, basemodel=None): body = resnet.ResNet(cfg) if basemodel is None else basemodel in_channels_stage2 = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS fpn = fpn_module.FPN( in_channels_list=[ in_channels_stage2, in_channels_stage2 * 2, in_channels_stage2 * 4, in_channels_stage2 * 8, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelMaxPool(), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_efficientnet_b3_fpn_p3p7_backbone(cfg): body = efficientnet_model.EfficientNet.efficientnet_b3_fpn() out_channels = 128 in_channels_p6p7 = 128 fpn = fpn_module.FPN( in_channels_list=[ 0, 48, 136, 384, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_dla34_fpn_p3p7_backbone(cfg): body = dla_lite.dla34_fpn() out_channels = 128 in_channels_p6p7 = 128 fpn = fpn_module.FPN( in_channels_list=[ 0, 128, 256, 512, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_fbnet_fpn_p3p7_backbone(cfg): body = fbnet.add_conv_body_fpn(cfg) out_channels = 64 in_channels_p6p7 = 64 fpn = fpn_module.FPN( in_channels_list=[ 0, 64, 88, 104, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_vovnet_fpn_backbone(cfg): body = vovnet.VoVNet(cfg) in_channels_stage = cfg.MODEL.VOVNET.OUT_CHANNELS out_channels = cfg.MODEL.VOVNET.BACKBONE_OUT_CHANNELS fpn = fpn_module.FPN( in_channels_list=[ in_channels_stage, in_channels_stage * 2, in_channels_stage * 3, in_channels_stage * 4, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelMaxPool(), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_resnet_fpn_p3p7_backbone(cfg): body = resnet.ResNet(cfg) in_channels_stage2 = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS in_channels_p6p7 = in_channels_stage2 * 8 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels fpn = fpn_module.FPN( in_channels_list=[ 0, in_channels_stage2 * 2, in_channels_stage2 * 4, in_channels_stage2 * 8, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def build_vgg_fpn_backbone(cfg): body = VGG(depth=16, with_last_pool=True, frozen_stages=2) in_channels_stage2 = 128 # default: cfg.MODEL.RESNETS.RES2_OUT_CHANNELS (256) out_channels = 256 # default: cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS (256) in_channels_p6p7 = in_channels_stage2 * 4 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels fpn = fpn_module.FPN( in_channels_list=[ 0, 0, in_channels_stage2 * 2, in_channels_stage2 * 4, in_channels_stage2 * 4, # in_channels_stage2 * 8 ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), ) model = nn.Sequential(OrderedDict([("body", body), ("fpn", fpn)])) model.out_channels = out_channels return model
def __init__(self, cfg): super(GeneralizedRCNN, self).__init__() self.extra = True self.backbone = build_backbone(cfg) self.cls_backbone = self.backbone[0] self.reg_backbone = self.backbone[1] if self.extra == False: self.rpn = build_rpn(cfg, self.cls_backbone.out_channels, self.extra) if self.extra == True: self.rpn, self.extra_rpn = build_rpn( cfg, self.cls_backbone.out_channels, self.extra) self.roi_heads = build_roi_heads(cfg, self.cls_backbone.out_channels) self.cfg = cfg self.deform_conv_cls = DFConv2d(256, 256, with_modulated_dcn=False, kernel_size=3, stride=1, groups=1, dilation=1, deformable_groups=1, bias=False) self.deform_conv_reg = DFConv2d(256, 256, with_modulated_dcn=False, kernel_size=3, stride=1, groups=1, dilation=1, deformable_groups=1, bias=False) self.cls_head = build_cls_head(True, False, False) conv_wo_relu = conv_with_kaiming_uniform(False, True) self.cls_weight_conv = conv_wo_relu(256, 1, 1) self.reg_weight_conv = conv_wo_relu(256, 1, 1)
def build_resnet_fpn_p3p7_backbone(cfg): in_channels_stage2 = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS cls_in_channels_stage2 = cfg.MODEL.RESNETS.CLS_RES2_OUT_CHANNELS out_channels = cfg.MODEL.RESNETS.BACKBONE_OUT_CHANNELS in_channels_p6p7 = in_channels_stage2 * 8 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels cls_in_channels_p6p7 = cls_in_channels_stage2 * 8 if cfg.MODEL.RETINANET.USE_C5 \ else out_channels cls_resnet = resnet.ResNet(cfg, 'CLS') cls_fpn = fpn_module.FPN( in_channels_list=[ 0, cls_in_channels_stage2 * 2, cls_in_channels_stage2 * 4, cls_in_channels_stage2 * 8, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(cls_in_channels_p6p7, out_channels), last_backbone=True, last_fpn=False) reg_resnet = resnet.ResNet(cfg, 'REG') reg_fpn = fpn_module.FPN( in_channels_list=[ 0, in_channels_stage2 * 2, in_channels_stage2 * 4, in_channels_stage2 * 8, ], out_channels=out_channels, conv_block=conv_with_kaiming_uniform(cfg.MODEL.FPN.USE_GN, cfg.MODEL.FPN.USE_RELU), top_blocks=fpn_module.LastLevelP6P7(in_channels_p6p7, out_channels), last_backbone=False, last_fpn=False) #if cfg.MODEL.BACKBONE.REG_CONV_BODY == "HRNET-W18": # width = 18 #elif cfg.MODEL.BACKBONE.REG_CONV_BODY == "HRNET-W32": # width = 32 #elif cfg.MODEL.BACKBONE.REG_CONV_BODY == "HRNET-W40": # width = 40 #else: # raise NotImplementedError #hrnet_args = dict( # stage1=dict( # num_modules=1, # num_branches=1, # block='BOTTLENECK', # num_blocks=(4,), # num_channels=(64,), # fuse_method='SUM'), # stage2=dict( # num_modules=1, # num_branches=2, # block='BASIC', # num_blocks=(4, 4), # num_channels=(width, width * 2), # fuse_method='SUM'), # stage3=dict( # num_modules=4, # num_branches=3, # block='BASIC', # num_blocks=(4, 4, 4), # num_channels=(width, width * 2, width * 4), # fuse_method='SUM'), # stage4=dict( # num_modules=3, # num_branches=4, # block='BASIC', # num_blocks=(4, 4, 4, 4), # num_channels=(width, width * 2, width * 4, width * 8), # fuse_method='SUM') #) #fpn_in_channels = [width, width * 2, width * 4, width * 8] #hrnet.BatchNorm2d = nn.SyncBatchNorm if cfg.MODEL.SYNCBN else nn.BatchNorm2d #reg_hrnet = hrnet.HighResolutionNet(extra=hrnet_args) #reg_fpn = getattr(hrfpn_module, cfg.MODEL.HRNET.FPN.TYPE)( # in_channels=fpn_in_channels, # out_channels=cfg.MODEL.HRNET.FPN.OUT_CHANNEL, # conv_stride=cfg.MODEL.HRNET.FPN.CONV_STRIDE, # num_level=len(cfg.MODEL.FCOS.FPN_STRIDES), #) cls_backbone = nn.Sequential( OrderedDict([("cls_backbone", cls_resnet), ("cls_fpn", cls_fpn)])) cls_backbone.out_channels = out_channels reg_backbone = nn.Sequential( OrderedDict([("reg_backbone", reg_resnet), ("reg_fpn", reg_fpn)])) #reg_backbone = nn.Sequential(OrderedDict([("reg_backbone", reg_hrnet), ("reg_fpn", reg_fpn)])) reg_backbone.out_channels = out_channels return cls_backbone, reg_backbone