示例#1
0
    def __init__(self, num_classes, cfg):
        super(Backbone, self).__init__()
        last_stride = 1
        model_path = 'out/pretrained/resnet50-19c8e357.pth'
        model_name = cfg.model_name
        pretrain_choice = 'imagenet'
        self.cos_layer = False
        self.neck = 'bnneck'
        self.neck_feat = 'after'

        if model_name == 'resnet50':
            self.in_planes = 2048
            self.base = ResNet(last_stride=last_stride,
                               block=Bottleneck, frozen_stages= -1,
                               layers=[3, 4, 6, 3])
            print('using resnet50 as a backbone')
        elif model_name == 'resnet50_ibn_a':
            self.in_planes = 2048
            self.base = resnet50_ibn_a(last_stride)
            print('using resnet50_ibn_a as a backbone')
        elif model_name == 'resnet101_ibn_a':
            self.in_planes = 2048
            self.base = resnet101_ibn_a(last_stride, frozen_stages= -1)
            print('using resnet101_ibn_a as a backbone')
        elif model_name == 'se_resnet101_ibn_a':
            self.in_planes = 2048
            self.base = se_resnet101_ibn_a(last_stride,frozen_stages= -1)
            print('using se_resnet101_ibn_a as a backbone')
        else:
            print('unsupported backbone! but got {}'.format(model_name))

        if pretrain_choice == 'imagenet':
            self.base.load_param(model_path)
            print('Loading pretrained ImageNet model......from {}'.format(model_path))

        self.gap = nn.AdaptiveAvgPool2d(1)

        self.num_classes = num_classes

        # if self.cos_layer:
        #     print('using cosine layer')
        #     self.arcface = ArcFace(self.in_planes, self.num_classes, s=30.0, m=0.50)
        # else:
        #     self.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False)
        #     self.classifier.apply(weights_init_classifier)

        self.bottleneck = nn.BatchNorm1d(self.in_planes)
        self.bottleneck.bias.requires_grad_(False)
        self.bottleneck.apply(weights_init_kaiming)
示例#2
0
class MVFace(torch.nn.Module):
    def __init__(self, backbone, feat_dim, num_class, is_am):
        super(MVFace, self).__init__()

        if backbone == 'resnet18':
            self.feat_net = ResNet(last_stride=2,
                                   block=BasicBlock,
                                   frozen_stages=-1,
                                   layers=[2, 2, 2, 2])
        elif backbone == 'resnet50':
            self.feat_net = ResNet(last_stride=2,
                                   block=Bottleneck,
                                   frozen_stages=-1,
                                   layers=[3, 4, 6, 3])
        elif backbone == 'resnet50_ibn':
            self.feat_net = resnet50_ibn_a(last_stride=2)
        else:
            raise Exception(
                'backbone must be resnet18, resnet50 and resnet50_ibn.')

        self.gap = nn.AdaptiveAvgPool2d(1)
        self.loss_layer = MV_Softmax(feat_dim=feat_dim,
                                     num_class=num_class,
                                     is_am=is_am)

    def forward(self, data, label):
        feat = self.feat_net.forward(data)
        feat = self.gap(feat).squeeze()
        pred = self.loss_layer.forward(feat, label)

        return pred
    def __init__(self, num_classes, pretrained=None):
        """
        
        Args:
            num_classes(int): number of classes, background should be counted in.
                e.g: there are 100 foreground objects, num_classes should be 101.                    
            pretrained(str): 'imagenet' or 'coco', set 'imagenet' indicate just
                backbone use imagenet pretrained weights, 'coco' indicate whole
                Mask R-CNN model use pretrained weights on COCO dataset.
        """

        super(MaskRCNN, self).__init__()
        if pretrained is not None:
            assert pretrained in ['imagenet', 'coco']
            assert pretrained not in [
                'coco'
            ], "COCO pretrained weights is not available yet."
        self.config = ConfigParser()
        self.config.read(
            os.path.abspath(os.path.join(__file__, "../", "config.ini")))
        self.num_classes = num_classes
        self.pooling_size_clsbbox = (7, 7)
        self.pooling_size_mask = (14, 14)
        self.validating = False  # when True output loss and predict results.
        self.fpn_on = bool(int(self.config['BACKBONE']['FPN_ON']))
        self.mask_head_on = bool(int(self.config['HEAD']['MASK_HEAD_ON']))
        self.train_rpn_only = bool(int(self.config['TRAIN']['TRAIN_RPN_ONLY']))
        resnet_layer = int(self.config['BACKBONE']['RESNET_LAYER'])
        if self.fpn_on:
            self.backbone_fpn = ResNetFPN(resnet_layer, pretrained=pretrained)
            self.depth = 256
        else:
            self.backbone = ResNet(resnet_layer, pretrained=pretrained)
            self.depth = 1024

        self.rpn = RPN(self.depth, self.fpn_on)

        if not self.train_rpn_only:
            # RoiAlign for cls and bbox head, pooling size 7x7
            self.roi_align_clsbbox = RoiAlign(
                grid_size=self.pooling_size_clsbbox)
            # RoiAlign for mask head, pooling size 14x14
            self.roi_align_mask = RoiAlign(grid_size=self.pooling_size_mask)
            self.clsbbox_head = ClsBBoxHead(
                depth=self.depth,
                pool_size=self.pooling_size_clsbbox,
                num_classes=num_classes)
            if self.mask_head_on:
                self.mask_head = MaskHead(depth=self.depth,
                                          pool_size=self.pooling_size_mask,
                                          num_classes=num_classes)
        self.img_height = None
        self.img_width = None
        self.batch_size = None
示例#4
0
    def __init__(self, backbone, feat_dim, num_class, is_am):
        super(MVFace, self).__init__()

        if backbone == 'resnet18':
            self.feat_net = ResNet(last_stride=2,
                                   block=BasicBlock,
                                   frozen_stages=-1,
                                   layers=[2, 2, 2, 2])
        elif backbone == 'resnet50':
            self.feat_net = ResNet(last_stride=2,
                                   block=Bottleneck,
                                   frozen_stages=-1,
                                   layers=[3, 4, 6, 3])
        elif backbone == 'resnet50_ibn':
            self.feat_net = resnet50_ibn_a(last_stride=2)
        else:
            raise Exception(
                'backbone must be resnet18, resnet50 and resnet50_ibn.')

        self.gap = nn.AdaptiveAvgPool2d(1)
        self.loss_layer = MV_Softmax(feat_dim=feat_dim,
                                     num_class=num_class,
                                     is_am=is_am)
示例#5
0
    def __init__(self, num_classes, pretrained=None):
        super(MaskRCNN, self).__init__()
        if pretrained is not None:
            assert pretrained in ['imagenet', 'voc2007', 'coco']
            assert pretrained not in ['voc2007', 'coco'], ("VOC2007 and COCO pretrained weights "
                                                           "will be added soon.")
        self.config = ConfigParser()
        self.config.read(os.path.abspath(os.path.join(__file__, "../", "config.ini")))
        self.num_classes = num_classes
        self.pooling_size_clsbbox = (7, 7)
        self.pooling_size_mask = (14, 14)
        use_fpn = bool(int(self.config['BACKBONE']['USE_FPN']))
        self.use_fpn = use_fpn
        self.train_rpn_only = bool(int(self.config['TRAIN']['TRAIN_RPN_ONLY']))
        resnet_layer = int(self.config['BACKBONE']['RESNET_LAYER'])
        if self.use_fpn:
            self.backbone_fpn = ResNetFPN(resnet_layer, pretrained=pretrained)
            self.depth = 256
        else:
            self.backbone = ResNet(resnet_layer, pretrained=pretrained)
            self.depth = 1024

        self.rpn = RPN(self.depth, self.use_fpn)

        if not self.train_rpn_only:
            # RoiAlign for cls and bbox head, pooling size 7x7
            self.roi_align_clsbbox = RoiAlign(grid_size=self.pooling_size_clsbbox)
            # RoiAlign for mask head, pooling size 14x14
            self.roi_align_mask = RoiAlign(grid_size=self.pooling_size_mask)
            self.clsbbox_head = ClsBBoxHead(depth=self.depth, pool_size=self.pooling_size_clsbbox,
                                            num_classes=num_classes)
            self.mask_head = MaskHead(depth=self.depth, pool_size=self.pooling_size_mask,
                                      num_classes=num_classes)
        self.img_height = None
        self.img_width = None
        self.batch_size = None
示例#6
0
class Backbone(nn.Module):
    def __init__(self, num_classes, cfg):
        super(Backbone, self).__init__()
        last_stride = 1
        model_path = 'out/pretrained/resnet50-19c8e357.pth'
        model_name = cfg.model_name
        pretrain_choice = 'imagenet'
        self.cos_layer = False
        self.neck = 'bnneck'
        self.neck_feat = 'after'

        if model_name == 'resnet50':
            self.in_planes = 2048
            self.base = ResNet(last_stride=last_stride,
                               block=Bottleneck, frozen_stages= -1,
                               layers=[3, 4, 6, 3])
            print('using resnet50 as a backbone')
        elif model_name == 'resnet50_ibn_a':
            self.in_planes = 2048
            self.base = resnet50_ibn_a(last_stride)
            print('using resnet50_ibn_a as a backbone')
        elif model_name == 'resnet101_ibn_a':
            self.in_planes = 2048
            self.base = resnet101_ibn_a(last_stride, frozen_stages= -1)
            print('using resnet101_ibn_a as a backbone')
        elif model_name == 'se_resnet101_ibn_a':
            self.in_planes = 2048
            self.base = se_resnet101_ibn_a(last_stride,frozen_stages= -1)
            print('using se_resnet101_ibn_a as a backbone')
        else:
            print('unsupported backbone! but got {}'.format(model_name))

        if pretrain_choice == 'imagenet':
            self.base.load_param(model_path)
            print('Loading pretrained ImageNet model......from {}'.format(model_path))

        self.gap = nn.AdaptiveAvgPool2d(1)

        self.num_classes = num_classes

        # if self.cos_layer:
        #     print('using cosine layer')
        #     self.arcface = ArcFace(self.in_planes, self.num_classes, s=30.0, m=0.50)
        # else:
        #     self.classifier = nn.Linear(self.in_planes, self.num_classes, bias=False)
        #     self.classifier.apply(weights_init_classifier)

        self.bottleneck = nn.BatchNorm1d(self.in_planes)
        self.bottleneck.bias.requires_grad_(False)
        self.bottleneck.apply(weights_init_kaiming)

    def forward(self, x, label=None):  # label is unused if self.cos_layer == 'no'
        x = self.base(x)
        global_feat = nn.functional.avg_pool2d(x, x.shape[2:4])
        global_feat = global_feat.view(global_feat.shape[0], -1)  # flatten to (bs, 2048)
        feat = self.bottleneck(global_feat)

        if self.neck == 'no':
            feat = global_feat
        elif self.neck == 'bnneck':
            feat = self.bottleneck(global_feat)

        if self.training:
            # if self.cos_layer:
            #     cls_score = self.arcface(feat, label)
            # else:
            #     cls_score = self.classifier(feat)
            return  global_feat  # global feature for triplet loss
        else:
            if self.neck_feat == 'after':
                # print("Test with feature after BN")
                return feat
            else:
                # print("Test with feature before BN")
                return global_feat

    def load_param(self, trained_path):
        param_dict = torch.load(trained_path)
        for i in param_dict:
            if 'classifier' in i or 'arcface' in i:
                continue
            self.state_dict()[i].copy_(param_dict[i])
        print('Loading pretrained model from {}'.format(trained_path))

    def load_param_finetune(self, model_path):
        param_dict = torch.load(model_path)
        for i in param_dict:
            self.state_dict()[i].copy_(param_dict[i])
        print('Loading pretrained model for finetuning from {}'.format(model_path))
示例#7
0
    def __init__(self, num_classes, pretrained=None):
        """
        
        Args:
            num_classes(int): number of classes, background should be counted in.
                e.g: there are 100 foreground objects, num_classes should be 101.                    
            pretrained(str): 'imagenet' or 'coco', set 'imagenet' indicate just
                backbone use imagenet pretrained weights, 'coco' indicate whole
                Mask R-CNN model use pretrained weights on COCO dataset.
        """

        super(MaskRCNN, self).__init__()
        if pretrained is not None:
            assert pretrained in ['imagenet', 'coco']
            assert pretrained not in [
                'coco'
            ], "COCO pretrained weights is not available yet."
        self.config = ConfigParser()
        config_path = os.path.abspath(
            os.path.join(__file__, "../", "config.ini"))
        assert os.path.exists(config_path), "config.ini not exists!"
        self.config.read(config_path)
        self.num_classes = num_classes
        self.validating = False  # when validating output loss and predict results.
        self.fpn_on = bool(int(self.config['BACKBONE']['FPN_ON']))
        self.mask_head_on = bool(int(self.config['HEAD']['MASK_HEAD_ON']))
        self.train_rpn_only = bool(int(self.config['TRAIN']['TRAIN_RPN_ONLY']))

        resnet_layer = int(self.config['BACKBONE']['RESNET_LAYER'])
        self.pooling_size_clsbbox = int(
            self.config['POOLING']['POOLING_SIZE_CLSBBOX'])
        self.pooling_size_mask = int(
            self.config['POOLING']['POOLING_SIZE_MASK'])

        if self.fpn_on:
            self.backbone_fpn = ResNetFPN(resnet_layer, pretrained=pretrained)
            self.depth_for_rpn = 256
            self.depth_for_head = 2048
        else:
            backbone_type = self.config['BACKBONE']['BACKBONE_TYPE']
            assert backbone_type in ['resnet', 'vgg16']
            if backbone_type == 'resnet':
                self.backbone = ResNet(resnet_layer, pretrained=pretrained)
                self.depth_rpn = 1024
                self.depth_head = 2048
            elif backbone_type == 'vgg16':
                self.backbone = VGG16(pretrained=pretrained)
                self.depth_rpn = 512
                self.depth_head = 4096

        self.rpn = RPN(self.depth_rpn, self.fpn_on)
        self.head_common = HeadCommon(pretrained=pretrained)

        if not self.train_rpn_only:
            # RoiAlign for cls and bbox head
            self.roi_align_clsbbox = RoiAlign(
                grid_size=(self.pooling_size_clsbbox,
                           self.pooling_size_clsbbox))
            self.clsbbox_head = ClsBBoxHead(depth=self.depth_head,
                                            num_classes=num_classes)
            if self.mask_head_on:
                # RoiAlign for mask head
                self.roi_align_mask = RoiAlign(
                    grid_size=(self.pooling_size_mask, self.pooling_size_mask))
                self.mask_head = MaskHead(depth=self.depth_head,
                                          pool_size=(self.pooling_size_mask,
                                                     self.pooling_size_mask),
                                          num_classes=num_classes)
        self.img_height = None
        self.img_width = None
        self.batch_size = None