Example #1
0
 def __init__(
     self,
     backbone,
     input_nc=1,
     grid_size=0.05,
     pointnet_nn=None,
     pre_mlp_nn=None,
     post_mlp_nn=[64, 64, 32],
     add_pos=False,
     add_pre_x=False,
     backend="minkowski",
     aggr=None,
 ):
     if input_nc is None:
         input_nc = 1
     nn.Module.__init__(self)
     self.unet = SparseConv3d(architecture="unet",
                              input_nc=input_nc,
                              config=backbone,
                              backend=backend)
     if pre_mlp_nn is not None:
         self.pre_mlp = MLP(pre_mlp_nn)
     else:
         self.pre_mlp = torch.nn.Identity()
     if pointnet_nn is not None:
         self.pointnet = MLP(pointnet_nn)
     else:
         self.pointnet = torch.nn.Identity()
     self.post_mlp = MLP(post_mlp_nn)
     self._grid_size = grid_size
     self.add_pos = add_pos
     self.add_pre_x = add_pre_x
     self.aggr = aggr
Example #2
0
    def test_sparseconv3d(self):
        from torch_points3d.applications.sparseconv3d import SparseConv3d

        input_nc = 3
        num_layers = 4
        in_feat = 32
        out_feat = in_feat * 3
        model = SparseConv3d(
            architecture="unet", input_nc=input_nc, in_feat=in_feat, num_layers=num_layers, config=None,
        )
        dataset = MockDatasetGeometric(input_nc, transform=GridSampling3D(0.01, quantize_coords=True), num_points=128)
        self.assertEqual(len(model._modules["down_modules"]), num_layers + 1)
        self.assertEqual(len(model._modules["inner_modules"]), 1)
        self.assertEqual(len(model._modules["up_modules"]), 4 + 1)
        self.assertFalse(model.has_mlp_head)
        self.assertEqual(model.output_nc, out_feat)

        try:
            data_out = model.forward(dataset[0])
            self.assertEqual(data_out.x.shape[1], out_feat)
        except Exception as e:
            print("Model failing:")
            print(model)
            print(e)

        input_nc = 3
        num_layers = 4

        output_nc = 5
        model = SparseConv3d(
            architecture="unet", input_nc=input_nc, output_nc=output_nc, num_layers=num_layers, config=None,
        )
        dataset = MockDatasetGeometric(input_nc, transform=GridSampling3D(0.01, quantize_coords=True), num_points=128)
        self.assertEqual(len(model._modules["down_modules"]), num_layers + 1)
        self.assertEqual(len(model._modules["inner_modules"]), 1)
        self.assertEqual(len(model._modules["up_modules"]), 4 + 1)
        self.assertTrue(model.has_mlp_head)
        self.assertEqual(model.output_nc, output_nc)

        try:
            data_out = model.forward(dataset[0])
            self.assertEqual(data_out.x.shape[1], output_nc)
        except Exception as e:
            print("Model failing:")
            print(model)
            raise e
Example #3
0
 def __init__(self, option, model_type, dataset, modules):
     # call the initialization method of UnetBasedModel
     super().__init__(option)
     self.backbone = SparseConv3d(
         "unet", dataset.feature_dimension, config=option.backbone, backend=option.get("backend", "minkowski")
     )
     self.head = nn.Sequential(nn.Linear(self.backbone.output_nc, dataset.num_classes))
     self.loss_names = ["loss_seg"]
Example #4
0
 def __init__(self, option, model_type, dataset, modules):
     # call the initialization method of UnetBasedModel
     super().__init__(option)
     self._weight_classes = dataset.weight_classes
     self.backbone = SparseConv3d("unet",
                                  dataset.feature_dimension,
                                  config=option.backbone,
                                  backend=option.get(
                                      "backend", "minkowski"))
     self._supports_mixed = sp3d.nn.get_backend() == "torchsparse"
     self.head = nn.Sequential(
         nn.Linear(self.backbone.output_nc, dataset.num_classes))
     self.loss_names = ["loss_seg"]
     self.visual_names = ["data_visual"]
Example #5
0
    def __init__(self, option, model_type, dataset, modules):
        FragmentBaseModel.__init__(self, option)
        self.mode = option.loss_mode
        self.normalize_feature = option.normalize_feature
        self.loss_names = ["loss_reg", "loss"]
        self.metric_loss_module, self.miner_module = FragmentBaseModel.get_metric_loss_and_miner(
            getattr(option, "metric_loss", None),
            getattr(option, "miner", None))
        # Unet
        self.backbone = SparseConv3d("unet",
                                     dataset.feature_dimension,
                                     config=option.backbone,
                                     backend=option.get(
                                         "backend", "minkowski"))
        # Last Layer
        if option.mlp_cls is not None:
            last_mlp_opt = option.mlp_cls
            in_feat = last_mlp_opt.nn[0]
            self.FC_layer = Seq()
            for i in range(1, len(last_mlp_opt.nn)):
                self.FC_layer.append(
                    str(i),
                    Sequential(*[
                        Linear(in_feat, last_mlp_opt.nn[i], bias=False),
                        FastBatchNorm1d(last_mlp_opt.nn[i],
                                        momentum=last_mlp_opt.bn_momentum),
                        LeakyReLU(0.2),
                    ]),
                )
                in_feat = last_mlp_opt.nn[i]

            if last_mlp_opt.dropout:
                self.FC_layer.append(Dropout(p=last_mlp_opt.dropout))

            self.FC_layer.append(Linear(in_feat, in_feat, bias=False))
        else:
            self.FC_layer = torch.nn.Identity()