def build_dynamic_backbone(cfg, input_shape: ShapeSpec): """ Create a Dynamic Backbone from config. Args: cfg: a dl_lib CfgNode Returns: backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. """ if input_shape is None: input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) backbone = DynamicNetwork(init_channel=cfg.MODEL.BACKBONE.INIT_CHANNEL, input_shape=input_shape, cell_num_list=cfg.MODEL.BACKBONE.CELL_NUM_LIST, layer_num=cfg.MODEL.BACKBONE.LAYER_NUM, norm=cfg.MODEL.BACKBONE.NORM, cal_flops=cfg.MODEL.CAL_FLOPS, cell_type=cfg.MODEL.BACKBONE.CELL_TYPE, max_stride=cfg.MODEL.BACKBONE.MAX_STRIDE, sep_stem=cfg.MODEL.BACKBONE.SEPT_STEM, using_gate=cfg.MODEL.GATE.GATE_ON, small_gate=cfg.MODEL.GATE.SMALL_GATE, gate_bias=cfg.MODEL.GATE.GATE_INIT_BIAS, drop_prob=cfg.MODEL.BACKBONE.DROP_PROB) return backbone
def __init__(self, cfg): super().__init__() self.device = torch.device(cfg.MODEL.DEVICE) self.cfg = cfg # fmt: off self.num_classes = cfg.MODEL.CENTERNET.NUM_CLASSES # Loss parameters: # Inference parameters: self.max_detections_per_image = cfg.TEST.DETECTIONS_PER_IMAGE # fmt: on self.backbone = cfg.build_backbone( cfg, input_shape=ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) ) self.upsample = cfg.build_upsample_layers(cfg) self.head = cfg.build_head(cfg) # self.cls_head = cfg.build_cls_head(cfg) # self.wh_head = cfg.build_width_height_head(cfg) # self.reg_head = cfg.build_center_reg_head(cfg) # backbone_shape = self.backbone.output_shape() # feature_shapes = [backbone_shape[f] for f in self.in_features] self.mean, self.std = cfg.MODEL.PIXEL_MEAN, cfg.MODEL.PIXEL_STD pixel_mean = torch.Tensor(self.mean).to(self.device).view(3, 1, 1) pixel_std = torch.Tensor(self.std).to(self.device).view(3, 1, 1) self.normalizer = lambda x: (x - pixel_mean) / pixel_std self.to(self.device)
def output_shape(self): return { name: ShapeSpec(channels=self._out_feature_channels[name], height=self._out_feature_resolution[name][0], width=self._out_feature_resolution[name][0], stride=self._out_feature_strides[name]) for name in self._out_features }
def output_shape(self): """ Returns: dict[str->ShapeSpec] """ # this is a backward-compatible default return { name: ShapeSpec(channels=self._out_feature_channels[name], stride=self._out_feature_strides[name]) for name in self._out_features }
def build_backbone(cfg, input_shape=None): """ Build a backbone. Returns: an instance of :class:`Backbone` """ if input_shape is None: input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN)) backbone = ResnetBackbone(cfg, input_shape) assert isinstance(backbone, Backbone) return backbone
def build_backbone(cfg, input_shape=None): """ Build a backbone from `cfg.MODEL.BACKBONE.NAME`. Returns: an instance of :class:`Backbone` """ if input_shape is None: input_shape = ShapeSpec(channels=len(cfg.MODEL.PIXEL_MEAN), height=cfg.INPUT.FIX_SIZE_FOR_FLOPS[0], width=cfg.INPUT.FIX_SIZE_FOR_FLOPS[1]) backbone = build_dynamic_backbone(cfg, input_shape) assert isinstance(backbone, Backbone) return backbone
def output_shape(self): return { name: ShapeSpec(channels=self._out_feature_channels[name], stride=self._out_feature_strides[name]) for name in self._out_features }