Esempio n. 1
0
    def __init__(self, cfg):
        self.cfg = cfg.clone()  # cfg can be modified by model
        self.model = build_model(self.cfg)
        self.model.eval()
        self.metadata = MetadataCatalog.get(cfg.DATASETS.TEST[0])

        checkpointer = DetectionCheckpointer(self.model)
        checkpointer.load(cfg.MODEL.WEIGHTS)

        self.transform_gen = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST
        )

        self.input_format = cfg.INPUT.FORMAT
        assert self.input_format in ["RGB", "BGR"], self.input_format
Esempio n. 2
0
def build_sem_seg_train_aug(cfg):
    augs = [
        T.ResizeShortestEdge(cfg.INPUT.MIN_SIZE_TRAIN,
                             cfg.INPUT.MAX_SIZE_TRAIN,
                             cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING)
    ]
    if cfg.INPUT.CROP.ENABLED:
        augs.append(
            T.RandomCrop_CategoryAreaConstraint(
                cfg.INPUT.CROP.TYPE,
                cfg.INPUT.CROP.SIZE,
                cfg.INPUT.CROP.SINGLE_CATEGORY_MAX_AREA,
                cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE,
            ))
    augs.append(T.RandomFlip())
    return augs
Esempio n. 3
0
    def __init__(self, cfg, is_train=True):
        if cfg.INPUT.CROP.ENABLED and is_train:
            self.crop_gen = [
                T.ResizeShortestEdge([400, 500, 600], sample_style="choice"),
                T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE),
            ]
        else:
            self.crop_gen = None

        self.tfm_gens = build_transform_gen(cfg, is_train)
        logging.getLogger(__name__).info(
            "Full TransformGens used in training: {}, crop: {}".format(
                str(self.tfm_gens), str(self.crop_gen)))

        self.img_format = cfg.INPUT.FORMAT
        self.is_train = is_train
Esempio n. 4
0
 def build_train_loader1(cls, cfg: CfgNode, mapper=None):
     if mapper is None:
         mapper = DatasetMapper(
             cfg=cfg,
             is_train=True,
             augmentations=[
                 T.ResizeShortestEdge(
                     cfg.INPUT.MIN_SIZE_TRAIN,
                     cfg.INPUT.MAX_SIZE_TRAIN,
                     cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING,
                 ),
                 T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE),
                 T.RandomFlip(),
             ],
         )
     return build_detection_train_loader(cfg, mapper=mapper)
 def __init__(self, cfg):
     self.aug = T.ResizeShortestEdge(
         [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
         cfg.INPUT.MAX_SIZE_TEST)
     with open(os.path.join(cfg.ANNO_DIR, cfg.SPLIT + '_anno.json'),
               'r') as f:
         json_data = json.load(f)
     vids = []
     for elem in json_data:
         vids += elem['vids']
     self.im_paths = []
     for vid in vids:
         im_paths = glob(os.path.join(cfg.FRAME_DIR, vid + "/*.jpg"))
         im_paths.sort()
         self.im_paths += im_paths
     print(cfg.SPLIT, "num_img", len(self.im_paths))
Esempio n. 6
0
    def __init__(self, config: str, checkpoint: str, conf_threshold: float = 0.5, **kwargs):
        super(DetectronRCNNPredictor).__init__()
        detectron2_cfg = get_cfg()
        detectron2_cfg.merge_from_file(config)
        if checkpoint is not None:
            detectron2_cfg.MODEL.WEIGHTS = checkpoint
        self.model = build_model(detectron2_cfg)
        self.model.eval()

        checkpointer = DetectionCheckpointer(self.model)
        checkpointer.load(detectron2_cfg.MODEL.WEIGHTS)

        self.transform_gen = T.ResizeShortestEdge(
            [detectron2_cfg.INPUT.MIN_SIZE_TEST, detectron2_cfg.INPUT.MIN_SIZE_TEST], detectron2_cfg.INPUT.MAX_SIZE_TEST
        )

        self.conf_threshold = conf_threshold
def build_augmentation(cfg):
    """
    Create a list of default :class:`Augmentation` from config.
    Now it includes resizing and flipping.

    Returns:
        list[Augmentation]
    """

    min_size = cfg.INPUT.MIN_SIZE_TRAIN
    max_size = cfg.INPUT.MAX_SIZE_TRAIN
    sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    augmentation = [
        T.ResizeShortestEdge(min_size, max_size, sample_style),
        T.RandomFlip(prob=0.5, horizontal=True, vertical=False)
    ]

    return augmentation
Esempio n. 8
0
 def build_train_loader(cls, cfg):
     # return build_detection_train_loader(cfg, mapper=mapper)
     return build_detection_train_loader(
         cfg,
         mapper=DatasetMapper(
             cfg,
             is_train=True,
             augmentations=[
                 T.ResizeShortestEdge(short_edge_length=[900, 1200],
                                      max_size=1600,
                                      sample_style='range'),
                 T.RandomFlip(),
                 # T.RandomRotation(-30, 30)
                 #     T.RandomCrop('relative_range', (0.5, 0.5)),
                 #     T.RandomContrast(0.8, 1.2),
                 #     T.RandomBrightness(0.8, 1.2),
                 #     T.RandomExtent((0.2, 0.8), (0.2, 0.2))
             ]))
Esempio n. 9
0
    def __init__(self, cfg_path: str, num_workers: int = 4) -> None:
        cfg = get_cfg()
        cfg.merge_from_file(model_zoo.get_config_file(cfg_path))
        # NOTE: you may customize cfg settings
        # cfg.MODEL.DEVICE="cuda" # use gpu by default
        cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
        # Find a model from detectron2's model zoo. You can use the https://dl.fbaipublicfiles... url as well
        # you can also give a path to you checkpoint
        cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(cfg_path)

        self.cfg = cfg.clone()
        self.model = build_model(cfg)
        self.model.eval()
        checkpointer = DetectionCheckpointer(self.model)
        checkpointer.load(cfg.MODEL.WEIGHTS)

        self.aug = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
            cfg.INPUT.MAX_SIZE_TEST)
        self.pool = Pool(num_workers)
Esempio n. 10
0
File: build.py Progetto: yeonh2/d2go
def ResizeShortestEdgeOp(
    cfg: CfgNode, arg_str: str, is_train: bool
) -> List[d2T.Transform]:
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    if sample_style == "range":
        assert (
            len(min_size) == 2
        ), "more than 2 ({}) min_size(s) are provided for ranges".format(len(min_size))

    tfm_gens = []
    if not min_size == 0:  # set to zero to disable resize
        tfm_gens.append(d2T.ResizeShortestEdge(min_size, max_size, sample_style))
    return tfm_gens
Esempio n. 11
0
def run_model_single_image(request_bytes, model, cfg):
    img, meta = open_image_and_meta(request_bytes)
    if img.dtype == "int16":  # assuming it's read from araster and needs to be rescaled
        img = rescale_tif(img)
    rgb_img = img[:, :, ::
                  -1]  # assumes image is in BGR order, puts it in RGB order since model expects RGB
    aug = T.ResizeShortestEdge(
        [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
        cfg.INPUT.MAX_SIZE_TEST)
    with torch.no_grad():
        height, width = img.shape[:2]
        print("Type of input data for inference (should be uint8):")
        print(rgb_img.dtype)
        assert rgb_img.dtype == "uint8"
        img = aug.get_transform(rgb_img).apply_image(rgb_img)
        img = torch.as_tensor(img.astype("float32").transpose(2, 0, 1))
        inputs = {"image": img, "height": height, "width": width}
        predictions = model([inputs])
    cpu_output = predictions[0]["instances"].to("cpu")
    return cpu_output, rgb_img
Esempio n. 12
0
 def __init__(self):
     cfg = detcfg.get_cfg()
     cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0
     cfg.MODEL.ROI_HEADS.NMS_THRESH_TEST = 0.5
     cfg.merge_from_file(
         model_zoo.get_config_file(
             "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
     cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(
         "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
     self.cfg = cfg
     self.predictor = DefaultPredictor(cfg)
     self.aug = transforms.ResizeShortestEdge(
         [self.cfg.INPUT.MIN_SIZE_TEST, self.cfg.INPUT.MIN_SIZE_TEST],
         self.cfg.INPUT.MAX_SIZE_TEST,
     )
     # sel_classes = ["frisbee", "baseball bat", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "pizza", "hot dog", "pizza", "donut", "cake", "potted plant", "tv", "laptop", "mouse", "remote", "cell phone", "book", "clock", "vase", "scissors"]
     sel_classes = ["frisbee"]
     self.thing_idxs = [
         coco.class_names.index(cls) - 1 for cls in sel_classes
     ]
Esempio n. 13
0
def build_augmentation(cfg, is_train):
    """
    Create a list of default :class:`Augmentation` from config.
    Now it includes resizing and flipping.

    Returns:
        list[Augmentation]
    """
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    augmentation = [T.ResizeShortestEdge(min_size, max_size, sample_style)]
    if is_train:
        augmentation.append(T.RandomFlip())
    return augmentation
Esempio n. 14
0
def build_polyp_segm_train_aug(cfg):
    augs = [
        T.ResizeShortestEdge(cfg.INPUT.MIN_SIZE_TRAIN,
                             cfg.INPUT.MAX_SIZE_TRAIN,
                             cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING)
    ]
    if cfg.INPUT.CROP.ENABLED:
        augs.append(
            T.RandomCrop_CategoryAreaConstraint(
                cfg.INPUT.CROP.TYPE,
                cfg.INPUT.CROP.SIZE,
                cfg.INPUT.CROP.SINGLE_CATEGORY_MAX_AREA,
                cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE,
            ))
    if cfg.INPUT.BLUR.ENABLED:
        augs.append(
            MotionBlur(prob=cfg.INPUT.BLUR.Prob,
                       kernel=cfg.INPUT.BLUR.KERNEL_SIZE))
    augs.append(T.RandomFlip())
    return augs
Esempio n. 15
0
    def __init__(self, cfg, togpu=False, modelPath=None):
        self.cfg = cfg.clone()  # cfg can be modified by model
        #         self.cfg.MODEL.WEIGHTS = modelPath
        self.model = build_model(self.cfg)
        self.model.eval()

        checkpointer = DetectionCheckpointer(self.model)

        if modelPath == None:
            checkpointer.load(self.cfg.MODEL.WEIGHTS)
            print("Load weight from : ", self.cfg.MODEL.WEIGHTS)
        else:
            checkpointer.load(modelPath)
            print("Load weight from : ", modelPath)

        self.aug = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
            cfg.INPUT.MAX_SIZE_TEST)

        self.input_format = cfg.INPUT.FORMAT
        assert self.input_format in ["RGB", "BGR"], self.input_format
Esempio n. 16
0
 def from_config(cls, cfg, is_train):
     ret = super().from_config(cfg, is_train)
     del ret['augmentations']
     if cfg.INPUT.RESIZE_META:
         augmentations = [
             T.Resize((cfg.INPUT.META_MIN_SIZE, cfg.INPUT.META_MIN_SIZE))
         ]
     else:
         augmentations = [
             T.ResizeShortestEdge(cfg.INPUT.META_MIN_SIZE,
                                  cfg.INPUT.META_MAX_SIZE, "choice")
         ]
     if is_train and cfg.INPUT.RANDOM_FLIP != "none":
         augmentations.append(
             T.RandomFlip(
                 horizontal=cfg.INPUT.RANDOM_FLIP == "horizontal",
                 vertical=cfg.INPUT.RANDOM_FLIP == "vertical",
             ))
     ret['augmentations'] = augmentations
     ret['is_train'] = True
     return ret
Esempio n. 17
0
def build_transform_gen(cfg, is_train):
    """
    Create a list of :class:`TransformGen` from config.
    Now it includes resizing and flipping.

    Returns:
        list[TransformGen]
    """
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    if sample_style == "range":
        assert len(
            min_size
        ) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format(
            len(min_size))

    logger = logging.getLogger(__name__)
    tfm_gens = []
    tfm_gens.append(T.ResizeShortestEdge(min_size, max_size, sample_style))
    if is_train:
        if cfg.INPUT.VFLIP:
            tfm_gens.append(T.RandomFlip(vertical=True, horizontal=False))
        if cfg.INPUT.HFLIP:
            tfm_gens.append(T.RandomFlip(vertical=False, horizontal=True))
        if cfg.INPUT.RANDOM_CONTRAST.ENABLED:
            tfm_gens.append(
                T.RandomContrast(cfg.INPUT.RANDOM_CONTRAST.MIN,
                                 cfg.INPUT.RANDOM_CONTRAST.MAX))
        if cfg.INPUT.RANDOM_BRIGHTNESS.ENABLED:
            tfm_gens.append(
                T.RandomBrightness(cfg.INPUT.RANDOM_BRIGHTNESS.MIN,
                                   cfg.INPUT.RANDOM_BRIGHTNESS.MAX))
        logger.info("TransformGens used in training: " + str(tfm_gens))
    return tfm_gens
Esempio n. 18
0
    def predict(self, original_image: np.ndarray) -> Dict:
        _aug = T.ResizeShortestEdge([800, 800], 1333)

        height, width = original_image.shape[:2]
        image = _aug.get_transform(original_image).apply_image(original_image)
        image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1))

        inputs = {"image": image, "height": height, "width": width}
        predictions = self.artifacts.model([inputs])[0]
        pred_instances = predictions["instances"]
        boxes = (pred_instances.pred_boxes).to("cpu").tensor.detach().numpy()
        scores = (pred_instances.scores).to("cpu").detach().numpy()
        pred_classes = (pred_instances.pred_classes).to("cpu").detach().numpy()
        pred_masks = (pred_instances.pred_masks).to("cpu").detach().numpy()

        result = {
            "boxes": boxes,
            "scores": scores,
            "classes": pred_classes,
            "masks": pred_masks,
        }
        return result
Esempio n. 19
0
    def __init__(self, cfg_file, model_path, classes, confidence_thresh=0.5):
        self.cpu_device = torch.device("cpu")

        self.cfg = get_cfg()
        self.cfg.merge_from_file(cfg_file)
        self.cfg.MODEL.WEIGHTS = os.path.join(model_path, "model_final.pth")
        self.cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = confidence_thresh
        self.model = build_model(self.cfg)
        self.model.eval()

        MetadataCatalog.get(self.cfg.DATASETS.TEST[0]).thing_classes = classes
        self.metadata = MetadataCatalog.get(self.cfg.DATASETS.TEST[0])

        checkpointer = DetectionCheckpointer(self.model)
        checkpointer.load(self.cfg.MODEL.WEIGHTS)

        self.transform_gen = T.ResizeShortestEdge(
            [self.cfg.INPUT.MIN_SIZE_TEST, self.cfg.INPUT.MIN_SIZE_TEST],
            self.cfg.INPUT.MAX_SIZE_TEST)

        self.input_format = self.cfg.INPUT.FORMAT
        assert self.input_format in ["RGB", "BGR"], self.input_format
Esempio n. 20
0
    def __init__(
        self,
        config="./detectron2/configs/COCO-InstanceSegmentation/small.yaml",
        model="detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl"
    ):

        self.cfg = get_cfg()
        self.cfg.merge_from_file(config)
        self.cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7  # set threshold for this model
        # cfg.MODEL.WEIGHTS = "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl"

        self.model = build_model(self.cfg)  # returns a torch.nn.Module
        DetectionCheckpointer(self.model).load(
            model)  # must load weights this way, can't use
        self.model.train(False)

        self.transform_gen = T.ResizeShortestEdge(
            [self.cfg.INPUT.MIN_SIZE_TEST, self.cfg.INPUT.MIN_SIZE_TEST],
            self.cfg.INPUT.MAX_SIZE_TEST)

        self.input_format = self.cfg.INPUT.FORMAT
        assert self.input_format in ["RGB", "BGR"], self.input_format
Esempio n. 21
0
    def __init__(self, cf, cf_add_d2, dataset, out):
        num_classes = len(dataset.action_names)
        TEST_DATASET_NAME = 'daly_objaction_test'

        # / Define d2 conf
        d2_output_dir = str(small.mkdir(out / 'd2_output'))
        d_cfg = set_detectron_cfg_base(d2_output_dir, num_classes, cf['seed'])
        d_cfg = set_detectron_cfg_test(d_cfg,
                                       TEST_DATASET_NAME,
                                       cf['d2_rcnn.model'],
                                       cf['d2_rcnn.conf_thresh'],
                                       cf_add_d2,
                                       freeze=False)
        d_cfg.MODEL.PROPOSAL_GENERATOR.NAME = "PrecomputedProposals"
        d_cfg.freeze()

        # / Start d2
        simple_d2_setup(d_cfg)

        # Predictor without proposal generator
        model = build_model(d_cfg)
        model.eval()
        checkpointer = DetectionCheckpointer(model)

        checkpointer.load(d_cfg.MODEL.WEIGHTS)
        MIN_SIZE_TEST = d_cfg.INPUT.MIN_SIZE_TEST
        MAX_SIZE_TEST = d_cfg.INPUT.MAX_SIZE_TEST
        transform_gen = d2_transforms.ResizeShortestEdge(
            [MIN_SIZE_TEST, MIN_SIZE_TEST], MAX_SIZE_TEST)

        # Instance monkeypatching
        # https://stackoverflow.com/questions/50599045/python-replacing-a-function-within-a-class-of-a-module/50600307#50600307
        model.forward = MethodType(genrcnn_rcnn_roiscores_forward, model)

        self.d_cfg = d_cfg
        self.rcnn_roiscores_model = model
        self.cpu_device = torch.device("cpu")
        self.transform_gen = transform_gen
Esempio n. 22
0
    def __init__(self, cfg, is_train=True):
        if cfg.INPUT.CROP.ENABLED and is_train:
            self.crop_gen = [
                T.ResizeShortestEdge([400, 500, 600], sample_style="choice"),
                T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE),
            ]
        else:
            self.crop_gen = None

        self.mask_on = cfg.MODEL.MASK_ON
        self.unlabeled_region_on = cfg.MODEL.EOPSN.UNLABELED_REGION

        # Semantic Segmentation
        self.ignore_value = cfg.MODEL.SEM_SEG_HEAD.IGNORE_VALUE
        self.sem_seg_unlabeled_region_on = cfg.MODEL.EOPSN.SEM_SEG_UNLABELED_REGION
        self.num_sem_seg_classes = cfg.MODEL.SEM_SEG_HEAD.NUM_CLASSES

        self.tfm_gens = build_transform_gen(cfg, is_train)
        logging.getLogger(__name__).info(
            "Full TransformGens used in training: {}, crop: {}".format(
                str(self.tfm_gens), str(self.crop_gen)))

        self.img_format = cfg.INPUT.FORMAT
        self.is_train = is_train
        unseen_path = cfg.DATASETS.UNSEEN_LABEL_SET
        if unseen_path != '' and self.is_train:
            meta = MetadataCatalog.get(cfg.DATASETS.TRAIN[0]).thing_classes
            self.unseen_label_set = self._get_unseen_label_set(
                meta, unseen_path)
        else:
            self.unseen_label_set = None

        if cfg.MODEL.LOAD_PROPOSALS:
            self.proposal_topk = (cfg.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TRAIN
                                  if is_train else
                                  cfg.DATASETS.PRECOMPUTED_PROPOSAL_TOPK_TEST)
        else:
            self.proposal_topk = None
Esempio n. 23
0
def get_sample_inputs(args):

    if args.sample_image is None:
        # get a first batch from dataset
        data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0])
        first_batch = next(iter(data_loader))
        return first_batch
    else:
        # get a sample data
        original_image = detection_utils.read_image(args.sample_image, format=cfg.INPUT.FORMAT)
        # Do same preprocessing as DefaultPredictor
        aug = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST
        )
        height, width = original_image.shape[:2]
        image = aug.get_transform(original_image).apply_image(original_image)
        image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1))

        inputs = {"image": image, "height": height, "width": width}

        # Sample ready
        sample_inputs = [inputs]
        return sample_inputs
Esempio n. 24
0
    def __init__(
        self,
        resize_type="resize_shortest",
        resize_short=None,
        resize_max=None,
        box_scale_factor=1.0,
    ):
        super().__init__()

        assert resize_type in ["resize_shortest", "resize", "None", None]

        resizer = None
        if resize_type == "resize_shortest":
            resizer = transforms.ResizeShortestEdge(resize_short, resize_max)
        elif resize_type == "resize":
            resizer = transforms.Resize(resize_short)

        self.aug = [
            tfm_tensor.Tensor2Array(),
            tfm_crop.CropBoxAug(box_scale_factor=box_scale_factor),
            *([resizer] if resizer else []),
            tfm_tensor.Array2Tensor(),
        ]
Esempio n. 25
0
def build_aug_transforms(
        cfg: detectron2.config.CfgNode,
        flip_horiz: bool = True,
        flip_vert: bool = False,
        max_rotate: int = 10,
        brightness_limits: Tuple[int, int] = (0.8, 1.4),
        contrast_limits: Tuple[int, int] = (0.8, 1.4),
        saturation_limits: Tuple[int, int] = (0.8, 1.4),
        p_lighting: float = 0.75
) -> detectron2.data.transforms.AugmentationList:
    "Build a list of detectron2 augmentations"
    augs = []
    augs.append(
        T.ResizeShortestEdge(cfg.INPUT.MIN_SIZE_TRAIN,
                             cfg.INPUT.MAX_SIZE_TRAIN,
                             cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING))
    if flip_horiz:
        augs.append(T.RandomFlip(prob=0.5, horizontal=True, vertical=False))
    if flip_vert:
        augs.append(T.RandomFlip(prob=0.5, horizontal=False, vertical=True))
    if max_rotate:
        augs.append(
            T.RandomRotation(angle=[-max_rotate, max_rotate], expand=False))
    if brightness_limits:
        augs.append(
            T.RandomApply(prob=p_lighting,
                          tfm_or_aug=T.RandomBrightness(*brightness_limits)))
    if contrast_limits:
        augs.append(
            T.RandomApply(prob=p_lighting,
                          tfm_or_aug=T.RandomContrast(*contrast_limits)))
    if saturation_limits:
        augs.append(
            T.RandomApply(prob=p_lighting,
                          tfm_or_aug=T.RandomSaturation(*saturation_limits)))

    return augs
Esempio n. 26
0
def build_gdrn_augmentation(cfg, is_train):
    """Create a list of :class:`Augmentation` from config. when training 6d
    pose, cannot flip.

    Returns:
        list[Augmentation]
    """
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    if sample_style == "range":
        assert len(min_size) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format(len(min_size))

    augmentation = []
    augmentation.append(T.ResizeShortestEdge(min_size, max_size, sample_style))
    if is_train:
        # augmentation.append(T.RandomFlip())
        logger.info("Augmentations used in training: " + str(augmentation))
    return augmentation
Esempio n. 27
0
def build_augmentation(cfg, is_train):
    """
    With option to don't use hflip

    Returns:
        list[Augmentation]
    """
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    if sample_style == "range":
        assert (
            len(min_size) == 2
        ), "more than 2 ({}) min_size(s) are provided for ranges".format(
            len(min_size))

    logger = logging.getLogger(__name__)

    augmentation = []
    augmentation.append(T.ResizeShortestEdge(min_size, max_size, sample_style))
    if is_train:
        if cfg.INPUT.HFLIP_TRAIN:
            augmentation.append(T.RandomFlip())
        if cfg.INPUT.BRIGHTNESS_TRAIN:
            augmentation.append(T.RandomBrightness(0.9, 1.1))
        if cfg.INPUT.CONTRAST_TRAIN:
            augmentation.append(T.RandomContrast(0.9, 1.1))
        if cfg.INPUT.SATURATION_TRAIN:
            augmentation.append(T.RandomSaturation(0.9, 1.1))
        logger.info("Augmentations used in training: " + str(augmentation))
    return augmentation
Esempio n. 28
0
    def load(self, path):
        try:
            from detectron2.checkpoint import (
                DetectionCheckpointer, )  # noqa # pylint: disable=unused-import
            from detectron2.modeling import META_ARCH_REGISTRY
            from detectron2.config import get_cfg
            from detectron2.data import transforms as T
        except ImportError:
            raise MissingDependencyException(
                "Detectron package is required to use DetectronArtifact")
        cfg = get_cfg()
        cfg.merge_from_file(f"{path}/{self._file_name}.yaml")
        meta_arch = META_ARCH_REGISTRY.get(cfg.MODEL.META_ARCHITECTURE)
        self._model = meta_arch(cfg)
        self._model.eval()

        device = self._metadata['device']
        self._model.to(device)
        checkpointer = DetectionCheckpointer(self._model)
        checkpointer.load(f"{path}/{self._file_name}.pth")
        self._aug = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
            cfg.INPUT.MAX_SIZE_TEST)
        return self.pack(self._model)
Esempio n. 29
0
    def __init__(self, cfg, hooks=[]):
        self.cfg = cfg.clone()  # cfg can be modified by model
        self.model = build_model(self.cfg)
        self.model.eval()
        if len(hooks) == 2:
            for m in self.model.modules():
                if isinstance(m, ACM):
                    m.add_mod.register_forward_hook(hooks[0])
                    m.sub_mod.register_forward_hook(hooks[1])
                    m.add_mod.return_weight = True
                    m.sub_mod.return_weight = True
                    print("adding a hook")

        self.metadata = MetadataCatalog.get(cfg.DATASETS.TEST[0])

        checkpointer = DetectionCheckpointer(self.model)
        checkpointer.load(cfg.MODEL.WEIGHTS)

        self.transform_gen = T.ResizeShortestEdge(
            [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST],
            cfg.INPUT.MAX_SIZE_TEST)

        self.input_format = cfg.INPUT.FORMAT
        assert self.input_format in ["RGB", "BGR"], self.input_format
Esempio n. 30
0
def build_transform_gen(cfg, is_train):
    """
    Create a list of :class:`TransformGen` from config.
    Now it includes resizing and flipping.

    Returns:
        list[TransformGen]
    """
    if is_train:
        min_size = cfg.INPUT.MIN_SIZE_TRAIN
        max_size = cfg.INPUT.MAX_SIZE_TRAIN
        sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING
    else:
        min_size = cfg.INPUT.MIN_SIZE_TEST
        max_size = cfg.INPUT.MAX_SIZE_TEST
        sample_style = "choice"
    if sample_style == "range":
        assert len(
            min_size
        ) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format(
            len(min_size))

    logger = logging.getLogger(__name__)
    tfm_gens = []
    tfm_gens.append(T.ResizeShortestEdge(min_size, max_size, sample_style))
    if is_train:
        tfm_gens.append(T.RandomFlip())
        tfm_gens.extend([
            T.RandomBrightness(0.5, 1.5),
            T.RandomContrast(0.5, 1.5),
            T.RandomSaturation(0.5, 1.2),
            T.RandomLighting(1.0),
        ])
        logger.info("TransformGens used in training: " + str(tfm_gens))
        print("TransformGens used in training: " + str(tfm_gens))
    return tfm_gens