예제 #1
0
    def __init__(self, option, model_type, dataset, modules):
        super(PointGroup, self).__init__(option)
        backbone_options = option.get("backbone", {"architecture": "unet"})
        self.Backbone = Minkowski(
            backbone_options.architecture,
            input_nc=dataset.feature_dimension,
            num_layers=4,
            config=backbone_options.config,
        )
        self.BackboneHead = Seq().append(FastBatchNorm1d(self.Backbone.output_nc)).append(torch.nn.ReLU())

        self._scorer_is_encoder = option.scorer.architecture == "encoder"
        self._activate_scorer = option.scorer.activate
        self.Scorer = Minkowski(
            option.scorer.architecture, input_nc=self.Backbone.output_nc, num_layers=option.scorer.depth
        )
        self.ScorerHead = Seq().append(torch.nn.Linear(self.Scorer.output_nc, 1)).append(torch.nn.Sigmoid())

        self.Offset = Seq().append(MLP([self.Backbone.output_nc, self.Backbone.output_nc], bias=False))
        self.Offset.append(torch.nn.Linear(self.Backbone.output_nc, 3))

        self.Semantic = (
            Seq()
            .append(MLP([self.Backbone.output_nc, self.Backbone.output_nc], bias=False))
            .append(torch.nn.Linear(self.Backbone.output_nc, dataset.num_classes))
            .append(torch.nn.LogSoftmax())
        )
        self.loss_names = ["loss", "offset_norm_loss", "offset_dir_loss", "semantic_loss", "score_loss"]
        stuff_classes = dataset.stuff_classes
        if is_list(stuff_classes):
            stuff_classes = torch.Tensor(stuff_classes).long()
        self._stuff_classes = torch.cat([torch.tensor([IGNORE_LABEL]), stuff_classes])
예제 #2
0
    def __init__(self, option, model_type, dataset, modules):
        super(PointGroup, self).__init__(option)
        backbone_options = option.get("backbone", {"architecture": "unet"})
        self.Backbone = Minkowski(
            backbone_options.get("architecture", "unet"),
            input_nc=dataset.feature_dimension,
            num_layers=4,
            config=backbone_options.get("config", {}),
        )

        self._scorer_type = option.get("scorer_type", "encoder")
        cluster_voxel_size = option.get("cluster_voxel_size", 0.05)
        if cluster_voxel_size:
            self._voxelizer = GridSampling3D(cluster_voxel_size,
                                             quantize_coords=True,
                                             mode="mean")
        else:
            self._voxelizer = None
        self.ScorerUnet = Minkowski("unet",
                                    input_nc=self.Backbone.output_nc,
                                    num_layers=4,
                                    config=option.scorer_unet)
        self.ScorerEncoder = Minkowski("encoder",
                                       input_nc=self.Backbone.output_nc,
                                       num_layers=4,
                                       config=option.scorer_encoder)
        self.ScorerMLP = MLP([
            self.Backbone.output_nc, self.Backbone.output_nc,
            self.ScorerUnet.output_nc
        ])
        self.ScorerHead = Seq().append(
            torch.nn.Linear(self.ScorerUnet.output_nc,
                            1)).append(torch.nn.Sigmoid())

        self.Offset = Seq().append(
            MLP([self.Backbone.output_nc, self.Backbone.output_nc],
                bias=False))
        self.Offset.append(torch.nn.Linear(self.Backbone.output_nc, 3))

        self.Semantic = (Seq().append(
            MLP([self.Backbone.output_nc, self.Backbone.output_nc],
                bias=False)).append(
                    torch.nn.Linear(self.Backbone.output_nc,
                                    dataset.num_classes)).append(
                                        torch.nn.LogSoftmax(dim=-1)))
        self.loss_names = [
            "loss", "offset_norm_loss", "offset_dir_loss", "semantic_loss",
            "score_loss"
        ]
        stuff_classes = dataset.stuff_classes
        if is_list(stuff_classes):
            stuff_classes = torch.Tensor(stuff_classes).long()
        self._stuff_classes = torch.cat(
            [torch.tensor([IGNORE_LABEL]), stuff_classes])
예제 #3
0
    def __init__(self, dataset_opt):
        super().__init__(dataset_opt)
        forward_category = dataset_opt.forward_category
        if not isinstance(forward_category, str):
            raise ValueError(
                "dataset_opt.forward_category is not set or is not a string. Current value: {}"
                .format(dataset_opt.forward_category))
        self._train_categories = dataset_opt.category
        if not is_list(self._train_categories):
            self._train_categories = [self._train_categories]

        # Sets the index of the category with respect to the categories in the trained model
        self._cat_idx = None
        for i, train_category in enumerate(self._train_categories):
            if forward_category.lower() == train_category.lower():
                self._cat_idx = i
                break
        if self._cat_idx is None:
            raise ValueError(
                "Cannot run an inference on category {} with a network trained on {}"
                .format(forward_category, self._train_categories))
        log.info(
            "Running an inference on category {} with a network trained on {}".
            format(forward_category, self._train_categories))

        self._data_path = dataset_opt.dataroot
        # include_normals = dataset_opt.include_normals if dataset_opt.include_normals else True
        include_normals = dataset_opt.get('include_normals',
                                          True)  # Update to OmegaConf 2.0

        transforms = SaveOriginalPosId()
        for t in [self.pre_transform, self.test_transform]:
            if t:
                transforms = T.Compose([transforms, t])
        self.test_dataset = _ForwardShapenet(self._data_path,
                                             self._cat_idx,
                                             transforms=transforms,
                                             include_normals=include_normals)