def get_random_batch(self, batch_size):
        data_ids_a = np.zeros(batch_size, 'int32')
        data_ids_b = np.zeros(batch_size, 'int32')
        viewpoint_ids_a = torch.zeros(batch_size)
        viewpoint_ids_b = torch.zeros(batch_size)
        for i in range(batch_size):
            class_id = np.random.choice(self.class_ids)
            object_id = np.random.randint(0, self.num_data[class_id])

            viewpoint_id_a = np.random.randint(0, 24)
            viewpoint_id_b = np.random.randint(0, 24)
            data_id_a = (object_id + self.pos[class_id]) * 24 + viewpoint_id_a
            data_id_b = (object_id + self.pos[class_id]) * 24 + viewpoint_id_b
            data_ids_a[i] = data_id_a
            data_ids_b[i] = data_id_b
            viewpoint_ids_a[i] = viewpoint_id_a
            viewpoint_ids_b[i] = viewpoint_id_b

        images_a = torch.from_numpy(self.images[data_ids_a].astype('float32') /
                                    255.)
        images_b = torch.from_numpy(self.images[data_ids_b].astype('float32') /
                                    255.)

        distances = torch.ones(batch_size).float() * self.distance
        elevations_a = torch.ones(batch_size).float() * self.elevation
        elevations_b = torch.ones(batch_size).float() * self.elevation
        viewpoints_a = srf.get_points_from_angles(distances, elevations_a,
                                                  -viewpoint_ids_a * 15)
        viewpoints_b = srf.get_points_from_angles(distances, elevations_b,
                                                  -viewpoint_ids_b * 15)

        return images_a, images_b, viewpoints_a, viewpoints_b
예제 #2
0
    def get_random_batch(self, batch_size):
        data_ids_a = np.zeros(batch_size, 'int32')
        data_ids_b = np.zeros(batch_size, 'int32')
        viewpoint_ids_a = torch.zeros(batch_size)
        viewpoint_ids_b = torch.zeros(batch_size)

        batch_a = []
        batch_b = []
        for i in range(batch_size):
            class_idx = np.random.randint(0, len(self.class_ids))
            class_id = self.class_ids[class_idx]
            object_id = np.random.randint(0, self.num_data[class_id])

            viewpoint_id_a = np.random.randint(0, 24)
            viewpoint_id_b = np.random.randint(0, 24)
            batch_a.append(self.images[class_idx][object_id, viewpoint_id_a])
            batch_b.append(self.images[class_idx][object_id, viewpoint_id_b])
            viewpoint_ids_a[i] = viewpoint_id_a
            viewpoint_ids_b[i] = viewpoint_id_b

        images_a = torch.from_numpy(np.stack(batch_a).astype('float32') / 255.)
        images_b = torch.from_numpy(np.stack(batch_b).astype('float32') / 255.)

        distances = torch.ones(batch_size).float() * self.distance
        elevations_a = torch.ones(batch_size).float() * self.elevation
        elevations_b = torch.ones(batch_size).float() * self.elevation
        viewpoints_a = srf.get_points_from_angles(distances, elevations_a,
                                                  -viewpoint_ids_a * 15)
        viewpoints_b = srf.get_points_from_angles(distances, elevations_b,
                                                  -viewpoint_ids_b * 15)

        return images_a, images_b, viewpoints_a, viewpoints_b
예제 #3
0
    def get_all_batches_for_evaluation(self, batch_size, class_id):
        data_ids = np.arange(self.num_data[class_id]) + self.pos[class_id]
        viewpoint_ids = np.tile(np.arange(24), data_ids.size)
        data_ids = np.repeat(data_ids, 24) * 24 + viewpoint_ids

        distances = torch.ones(data_ids.size).float() * self.distance
        elevations = torch.ones(data_ids.size).float() * self.elevation
        viewpoints_all = srf.get_points_from_angles(
            distances, elevations,
            -torch.from_numpy(viewpoint_ids).float() * 15)

        for i in range((data_ids.size - 1) // batch_size + 1):
            images = torch.from_numpy(
                self.images_rgba[data_ids[i * batch_size:(i + 1) *
                                          batch_size]].astype('float32') /
                255.)
            images_depth = torch.from_numpy(
                self.images_depth[data_ids[i * batch_size:(i + 1) *
                                           batch_size]].astype('float32'))
            images_normal = torch.from_numpy(
                self.images_normal[data_ids[i * batch_size:(i + 1) *
                                            batch_size]].astype('float32'))
            voxels = torch.from_numpy(
                self.voxels[data_ids[i * batch_size:(i + 1) * batch_size] //
                            24].astype('float32'))
            yield images, images_depth, images_normal, voxels
예제 #4
0
    def get_specific_view_batch(self, batch_size,view_id):
        data_ids_a = np.zeros(batch_size, 'int32')
        viewpoint_ids_a = torch.zeros(batch_size)
        for i in range(batch_size):
            class_id = np.random.choice(self.class_ids)
            object_id = np.random.randint(0, self.num_data[class_id])

            viewpoint_id_a = view_id
            data_id_a = (object_id + self.pos[class_id]) * 24 + viewpoint_id_a
            data_ids_a[i] = data_id_a
            viewpoint_ids_a[i] = viewpoint_id_a
        images_a = torch.from_numpy(self.images[data_ids_a].astype('float32') / 255.)

        distances = torch.ones(batch_size).float() * self.distance
        elevations_a = torch.ones(batch_size).float() * self.elevation
        viewpoints_a = nr.get_points_from_angles(distances, elevations_a, -viewpoint_ids_a * 15 + 90)
        views_a = torch.cat([distances.unsqueeze(0),elevations_a.unsqueeze(0),-viewpoint_ids_a.unsqueeze(0) * 15 + 90])
        return images_a, viewpoints_a,views_a
예제 #5
0
    def get_random_single_batch(self, batch_size):
        data_ids_a = np.zeros(batch_size, 'int32')
        viewpoint_ids_a = torch.zeros(batch_size)
        for i in range(batch_size):
            class_id = np.random.choice(self.class_ids)
            object_id = np.random.randint(0, self.num_data[class_id])

            if self.view_range == None:
                viewpoint_id_a = np.random.randint(0,24)
            else:
                viewpoint_id_a = np.random.choice(self.view_range)
            viewpoint_id_a = np.random.randint(0, 24)
            data_id_a = (object_id + self.pos[class_id]) * 24 + viewpoint_id_a
            data_ids_a[i] = data_id_a
            viewpoint_ids_a[i] = viewpoint_id_a

        images_a = torch.from_numpy(self.images[data_ids_a].astype('float32') / 255.)

        distances = torch.ones(batch_size).float() * self.distance
        elevations_a = torch.ones(batch_size).float() * self.elevation
        noise = (torch.rand(batch_size)-0.5) * 2 * self.view_noise
        viewpoints_a = nr.get_points_from_angles(distances, elevations_a, -viewpoint_ids_a * 15 + 90 + noise)
        views_a = torch.cat([distances.unsqueeze(0),elevations_a.unsqueeze(0),-viewpoint_ids_a.unsqueeze(0) * 15 + 90 + noise])
        return images_a, viewpoints_a, views_a
예제 #6
0
 def set_eyes_from_angles(self, distances, elevations, azimuths):
     if self.camera_mode not in ['look', 'look_at']:
         raise ValueError('Projection does not need to set eyes')
     self.transformer._eye = srf.get_points_from_angles(
         distances, elevations, azimuths)
예제 #7
0
 def set_eyes_from_angles(self, distances, elevations, azimuths):
     self._eye = srf.get_points_from_angles(distances, elevations, azimuths)