Ejemplo n.º 1
0
    def __init__(self, cfg, return_loss=True, **kwargs):
        super(YOLOv5, self).__init__(**kwargs)

        self.cfg = cfg
        self.return_loss = return_loss
        self.m, self.save = self._create_model()
        self.nms = build_nms(**cfg.test.as_dict())

        self.num_anchors = self.cfg.num_anchors
        self.num_classes = self.cfg.num_classes

        self.g = 0.5
        self.off = tf.constant(
            [
                [0, 0],
                [1, 0],
                [0, 1],
                [-1, 0],
                [0, -1],  # j,k,l,m
                # [1, 1], [1, -1], [-1, 1], [-1, -1],  # jk,jm,lk,lm
            ],
            tf.float32) * self.g  # offsets

        assert "IoU" in cfg.bbox_loss.loss, "Only surpport IoU loss (e.g. IoULoss, GIoU, DIoU, CIoU)."
        self.bbox_loss_func = build_loss(**cfg.bbox_loss.as_dict())
        self.label_loss_func = build_loss(**cfg.label_loss.as_dict())
        self.conf_loss_func = build_loss(**cfg.conf_loss.as_dict())
Ejemplo n.º 2
0
    def __init__(self, cfg, num_classes, **kwargs):
        super(FCOSHead, self).__init__(cfg, num_classes=num_classes, **kwargs)

        self._make_shared_convs()
        self.classifier = tf.keras.layers.Conv2D(
            filters=cfg.num_classes,
            kernel_size=(3, 3),
            strides=(1, 1),
            padding="same",
            use_bias=True,
            bias_initializer=tf.keras.initializers.Constant(-math.log(
                (1. - cfg.prior) / cfg.prior)),
            name="predicted_class")
        self.regressor = tf.keras.layers.Conv2D(filters=4,
                                                kernel_size=(3, 3),
                                                strides=(1, 1),
                                                padding="same",
                                                use_bias=True,
                                                name="predicted_box")
        self.centerness = tf.keras.layers.Conv2D(
            filters=1,
            kernel_size=(3, 3),
            strides=(1, 1),
            use_bias=True,
            kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01),
            padding="same",
            name="predicted_centerness")
        self.scales = [
            Scale(value=1.0, name="%d" % i)
            for i, _ in enumerate(range(cfg.min_level, cfg.max_level + 1))
        ]

        self.normalize_box = cfg.normalize_box

        self.centerness_loss_func = build_loss(**cfg.centerness_loss.as_dict())
Ejemplo n.º 3
0
    def __init__(self, cfg, anchor_cfg, num_classes, **kwargs):
        super(GFLHead, self).__init__(cfg=cfg,
                                      anchor_cfg=anchor_cfg,
                                      num_classes=num_classes,
                                      **kwargs)

        self._make_shared_convs()
        self._init_anchor_generators()

        self.classifier = tf.keras.layers.Conv2D(
            filters=cfg.num_classes,
            kernel_size=(3, 3),
            strides=(1, 1),
            padding="same",
            use_bias=True,
            bias_initializer=tf.keras.initializers.Constant(-math.log(
                (1. - cfg.prior) / cfg.prior)),
            name="predicted_class")
        self.regressor = tf.keras.layers.Conv2D(filters=4 * (cfg.reg_max + 1),
                                                kernel_size=(3, 3),
                                                strides=(1, 1),
                                                padding="same",
                                                use_bias=True,
                                                name="predicted_box")
        self.scales = [
            Scale(value=1.0, name="scales/%d" % i)
            for i, _ in enumerate(range(cfg.min_level, cfg.max_level + 1))
        ]

        self._num_anchors_per_level = dict()
        self.project = tf.linspace(0, cfg.reg_max, cfg.reg_max + 1)
        self.dfl_loss_func = build_loss(**cfg.dfl_loss.as_dict())
Ejemplo n.º 4
0
    def __init__(self,
                 cfg,
                 test_cfg,
                 anchor_cfg=None,
                 num_classes=80,
                 is_training=True,
                 data_format="channels_last",
                 **kwargs):
        super(BaseHead, self).__init__(**kwargs)

        self.num_classes = num_classes
        self.cfg = cfg
        self.anchor_cfg = anchor_cfg
        self.test_cfg = test_cfg
        self.is_training = is_training
        self.data_format = data_format

        if test_cfg and test_cfg.get("nms") is not None:
            self.nms = build_nms(**test_cfg.as_dict())

        self.use_sigmoid = True
        if cfg.get("use_sigmoid") is not None:
            self.use_sigmoid = cfg.use_sigmoid
        self._label_dims = num_classes if self.use_sigmoid else num_classes + 1

        self.bbox_loss_func = build_loss(**cfg.bbox_loss.as_dict()) if cfg.get(
            "bbox_loss") is not None else None
        self._use_iou_loss = False
        if self.bbox_loss_func is not None:
            self._use_iou_loss = "IoU" in cfg.bbox_loss.loss
        self.label_loss_func = build_loss(**cfg.label_loss.as_dict(
        )) if cfg.get("label_loss") is not None else None

        self.sampler = build_sampler(**cfg.sampler.as_dict()) if cfg.get(
            "sampler") is not None else None
        self.assigner = build_assigner(**cfg.assigner.as_dict()) if cfg.get(
            "assigner") is not None else None

        self.bbox_decoder = build_decoder(**cfg.bbox_decoder.as_dict(
        )) if cfg.get("bbox_decoder") is not None else None
        self.bbox_encoder = build_encoder(**cfg.bbox_encoder.as_dict(
        )) if cfg.get("bbox_encoder") is not None else None
Ejemplo n.º 5
0
    def __init__(self, cfg, **kwargs):
        super(OneNetHead, self).__init__(cfg, **kwargs)
        assert cfg.assigner.assigner == "MinCostAssigner"

        self.feat = tf.keras.layers.Conv2D(
            filters=cfg.feat_dims,
            kernel_size=(3, 3),
            strides=(1, 1),
            padding="same",
            use_bias=True,
            name="feat1")
    
        self.classifier = tf.keras.layers.Conv2D(
            filters=self.num_classes,
            kernel_size=(3, 3),
            strides=(1, 1),
            padding="same",
            use_bias=True,
            bias_initializer=tf.keras.initializers.Constant(
            -math.log((1. - cfg.prior) / cfg.prior)),
            name="predicted_class")
        self.regressor = tf.keras.layers.Conv2D(
            filters=4,
            kernel_size=(3, 3),
            strides=(1, 1),
            padding="same",
            use_bias=True,
            name="predicted_box")       
        
        self.act = build_activation(**cfg.activation.as_dict())

        self.assigner = build_assigner(**cfg.assigner.as_dict()) if cfg.get("assigner") is not None else None
        self.bbox_loss_func = build_loss(**cfg.bbox_loss.as_dict()) if cfg.get("bbox_loss") is not None else None
        self._use_iou_loss = False
        if self.bbox_loss_func is not None:
            self._use_iou_loss = "IoU" in cfg.bbox_loss.loss
        self.label_loss_func = build_loss(**cfg.label_loss.as_dict()) if cfg.get("label_loss") is not None else None
Ejemplo n.º 6
0
    def __init__(self, cfg, num_classes, **kwargs):
        super(CenterHeatmapHead, self).__init__(cfg=cfg,
                                                num_classes=num_classes,
                                                **kwargs)

        self.hm_loss_func = build_loss(**cfg.hm_loss.as_dict())
        self.wh_loss_func = build_loss(**cfg.wh_loss.as_dict())
        self.reg_loss_func = build_loss(**cfg.reg_loss.as_dict())

        bias_value = -2.19  # -math.log((1 - 0.1) / 0.1)

        if cfg.num_stacks > 1:
            for i in range(cfg.num_stacks):
                hm = tf.keras.Sequential(name="hm/%d" % i)
                wh = tf.keras.Sequential(name="wh/%d" % i)
                reg = tf.keras.Sequential(name="reg/%d" % i)

                for j in range(cfg.repeats):
                    hm.add(
                        ConvNormActBlock(
                            filters=cfg.feat_dims,
                            kernel_size=3,
                            data_format=self.data_format,
                            normalization=cfg.normalization.as_dict()
                            if cfg.normalization else None,
                            activation=cfg.activation.as_dict(),
                            name="%d" % j))
                    wh.add(
                        ConvNormActBlock(
                            filters=cfg.feat_dims,
                            kernel_size=3,
                            data_format=self.data_format,
                            normalization=cfg.normalization.as_dict()
                            if cfg.normalization else None,
                            activation=cfg.activation.as_dict(),
                            name="%d" % j))
                    reg.add(
                        ConvNormActBlock(
                            filters=cfg.feat_dims,
                            kernel_size=3,
                            data_format=self.data_format,
                            normalization=cfg.normalization.as_dict()
                            if cfg.normalization else None,
                            activation=cfg.activation.as_dict(),
                            name="%d" % j))

                hm.add(
                    tf.keras.layers.Conv2D(
                        filters=num_classes,
                        kernel_size=1,
                        data_format=self.data_format,
                        bias_initializer=tf.keras.initializers.Constant(
                            bias_value),
                        name="predicted_hm%d" % cfg.repeats))
                wh.add(
                    tf.keras.layers.Conv2D(filters=2,
                                           kernel_size=1,
                                           data_format=self.data_format,
                                           name="predicted_wh%d" %
                                           cfg.repeats))
                reg.add(
                    tf.keras.layers.Conv2D(filters=2,
                                           kernel_size=1,
                                           data_format=self.data_format,
                                           name="predicted_reg%d" %
                                           cfg.repeats))

                setattr(self, "wh%d" % i, wh)
                setattr(self, "hm%d" % i, hm)
                setattr(self, "reg%d" % i, reg)
        else:
            hm = tf.keras.Sequential(name="hm")
            wh = tf.keras.Sequential(name="wh")
            reg = tf.keras.Sequential(name="reg")

            for j in range(cfg.repeats):
                hm.add(
                    ConvNormActBlock(filters=cfg.feat_dims,
                                     kernel_size=3,
                                     data_format=self.data_format,
                                     normalization=cfg.normalization.as_dict()
                                     if cfg.normalization else None,
                                     activation=cfg.activation.as_dict(),
                                     name="%d" % j))
                wh.add(
                    ConvNormActBlock(filters=cfg.feat_dims,
                                     kernel_size=3,
                                     data_format=self.data_format,
                                     normalization=cfg.normalization.as_dict()
                                     if cfg.normalization else None,
                                     activation=cfg.activation.as_dict(),
                                     name="%d" % j))
                reg.add(
                    ConvNormActBlock(filters=cfg.feat_dims,
                                     kernel_size=3,
                                     data_format=self.data_format,
                                     normalization=cfg.normalization.as_dict()
                                     if cfg.normalization else None,
                                     activation=cfg.activation.as_dict(),
                                     name="%d" % j))
            hm.add(
                tf.keras.layers.Conv2D(
                    filters=num_classes,
                    kernel_size=1,
                    data_format=self.data_format,
                    bias_initializer=tf.keras.initializers.Constant(
                        bias_value),
                    name="predicted_hm"))
            wh.add(
                tf.keras.layers.Conv2D(filters=2,
                                       kernel_size=1,
                                       data_format=self.data_format,
                                       name="predicted_wh"))
            reg.add(
                tf.keras.layers.Conv2D(filters=2,
                                       kernel_size=1,
                                       data_format=self.data_format,
                                       name="predicted_reg"))
            setattr(self, "wh", wh)
            setattr(self, "hm", hm)
            setattr(self, "reg", reg)
Ejemplo n.º 7
0
    def __init__(self, cfg):
        use_mixed_precision = cfg.dtype == "float16"
        if use_mixed_precision:
            policy = tf.keras.mixed_precision.experimental.Policy("mixed_float16")
            tf.keras.mixed_precision.experimental.set_policy(policy)

        self.train_dataset = build_dataset(**cfg.train.dataset.as_dict())
        self.val_dataset = build_dataset(**cfg.val.dataset.as_dict())

        self.model = build_model(**cfg.model.as_dict())

        optimizer = build_optimizer(**cfg.optimizer.as_dict())
    
        if cfg.lookahead:
            optimizer = LookaheadOptimizer(optimizer, cfg.lookahead.steps, cfg.lookahead.alpha) 

        if use_mixed_precision:
            optimizer = tf.keras.mixed_precision.experimental.LossScaleOptimizer(
                optimizer=optimizer, loss_scale= "dynamic") 
        
        self.loss_fn = build_loss(**cfg.loss.as_dict())

        self.optimizer = optimizer
        self.use_mixed_precision = use_mixed_precision
        self.cfg = cfg

        self.total_train_steps = cfg.learning_rate_scheduler.train_steps
        self.learning_rate_scheduler = build_learning_rate_scheduler(
            **cfg.learning_rate_scheduler.as_dict())

        self.global_step = tf.Variable(initial_value=0,
                                       trainable=False,
                                       name="global_step",
                                       dtype=tf.int64)

        self.learning_rate = tf.Variable(initial_value=0,
                                         trainable=False,
                                         name="learning_rate",
                                         dtype=tf.float32)
       
        self.checkpoint = tf.train.Checkpoint(optimizer=self.optimizer, model=self.model)
        self.manager = tf.train.CheckpointManager(checkpoint=self.checkpoint,
                                                  directory=cfg.checkpoint_dir,
                                                  max_to_keep=10)
        if os.path.exists(cfg.pretrained_weights_path):
            self.model.load_weights(cfg.pretrained_weights_path, by_name=True, skip_mismatch=True)

        latest_checkpoint = self.manager.latest_checkpoint
        if latest_checkpoint is not None:
            try:
                steps = int(latest_checkpoint.split("-")[-1])
                self.global_step.assign(steps)
            except:
                self.global_step.assign(0)
            self.checkpoint.restore(latest_checkpoint)
            tf.print(_time_to_string(), "Restored weights from %s." % latest_checkpoint)
        else:
            self.global_step.assign(0)

        self.summary_writer = tf.summary.create_file_writer(logdir=cfg.summary_dir)
        self.log_every_n_steps = cfg.log_every_n_steps
        self.save_ckpt_steps = cfg.save_ckpt_steps
        self.use_jit = tf.config.optimizer.get_jit() is not None

        self.training_loss_metrics = {}
        self.val_loss_metrics = {}

        self.train_acc_metric = tf.keras.metrics.Accuracy() 
        self.train_auc_metric = tf.keras.metrics.AUC()
        self.val_acc_metric = tf.keras.metrics.Accuracy() 
        self.val_auc_metric = tf.keras.metrics.AUC()
        self._add_graph = True