예제 #1
0
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
예제 #2
0
    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),
        )
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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
예제 #11
0
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
예제 #12
0
    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)
예제 #13
0
파일: backbone.py 프로젝트: Hwang64/CrabNet
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