import numpy as np from torch.utils.data import Dataset class ModelNet(object): def __init__(self, path, num_points): import h5py self.f = h5py.File(path) self.num_points = num_points self.n_train = self.f["train/data"].shape[0] self.n_valid = int(self.n_train / 5) self.n_train -= self.n_valid self.n_test = self.f["test/data"].shape[0] def train(self): return ModelNetDataset(self, "train") def valid(self): return ModelNetDataset(self, "valid") def test(self): return ModelNetDataset(self, "test") class ModelNetDataset(Dataset): def __init__(self, modelnet, mode): super(ModelNetDataset, self).__init__() self.num_points = modelnet.num_points self.mode = mode if mode == "train": self.data = modelnet.f["train/data"][: modelnet.n_train] self.label = modelnet.f["train/label"][: modelnet.n_train] elif mode == "valid": self.data = modelnet.f["train/data"][modelnet.n_train :] self.label = modelnet.f["train/label"][modelnet.n_train :] elif mode == "test": self.data = modelnet.f["test/data"].value self.label = modelnet.f["test/label"].value def translate(self, x, scale=(2 / 3, 3 / 2), shift=(-0.2, 0.2)): xyz1 = np.random.uniform(low=scale[0], high=scale[1], size=[3]) xyz2 = np.random.uniform(low=shift[0], high=shift[1], size=[3]) x = np.add(np.multiply(x, xyz1), xyz2).astype("float32") return x def __len__(self): return self.data.shape[0] def __getitem__(self, i): x = self.data[i][: self.num_points] y = self.label[i] if self.mode == "train": x = self.translate(x) np.random.shuffle(x) return x, y