Example #1
0
    def get_fake_dataset(self, data_split, directory):
        dataset_config = DatasetBuilder.copy_config(
            DatasetBuilder.KITTI_UNITTEST)

        # Overwrite config values
        dataset_config.data_split = data_split
        dataset_config.dataset_dir = directory

        dataset = DatasetBuilder.build_kitti_dataset(dataset_config)

        return dataset
Example #2
0
    def test_data_splits(self):
        bad_config = DatasetBuilder.copy_config(DatasetBuilder.KITTI_UNITTEST)

        # Test invalid splits
        bad_config.data_split = "bad"
        self.assertRaises(ValueError, KittiDataset, bad_config, 'train')

        # Should be "train"
        bad_config.data_split = "training"
        self.assertRaises(ValueError, KittiDataset, bad_config, 'train')

        # Should be "val"
        bad_config.data_split = "validation"
        self.assertRaises(ValueError, KittiDataset, bad_config, 'val')

        # Should be "test"
        bad_config.data_split = "testing"
        self.assertRaises(ValueError, KittiDataset, bad_config, 'test')

        # Train split
        train_dataset = self.get_fake_dataset('train', self.fake_kitti_dir)
        self.assertEqual(train_dataset.num_samples, 7)

        # Validation split
        validation_dataset = self.get_fake_dataset('val', self.fake_kitti_dir)
        self.assertEqual(validation_dataset.num_samples, 6)

        # Train + validation split
        trainval_dataset = self.get_fake_dataset('trainval',
                                                 self.fake_kitti_dir)
        self.assertEqual(trainval_dataset.num_samples, 13)

        # Test split
        test_dataset = self.get_fake_dataset('test', self.fake_kitti_dir)
        self.assertEqual(test_dataset.num_samples, 10)
Example #3
0
def inference(config, data_split, ckpt_indices):

    train_val_test = 'test'

    dataset_config = config.dataset_config
    dataset_config.data_split = data_split
    if data_split == 'test':
        dataset_config.data_split_dir = 'testing'
        dataset_config.has_kitti_labels = False

    # Enable this to see the actually memory being used
    config.allow_gpu_mem_growth = True

    # Remove augmentation during evaluation in test mode
    dataset_config.aug_config.box_jitter_type = None

    # Build the dataset object
    dataset = DatasetBuilder.build_kitti_dataset(dataset_config,
                                                 train_val_test=train_val_test)

    # Setup the model
    model_name = config.model_name
    model_config = config.model_config

    with tf.Graph().as_default():

        if model_name == 'monopsr':
            model = MonoPSRModel(model_config,
                                 train_val_test=train_val_test,
                                 dataset=dataset)
        else:
            raise ValueError('Invalid model_name')

        if ckpt_indices == 'all':
            model_evaluator = Evaluator(model,
                                        config,
                                        eval_mode='test',
                                        skip_evaluated_checkpoints=True,
                                        do_kitti_native_eval=False)

            model_evaluator.repeated_checkpoint_run()
        else:
            model_evaluator = Evaluator(model,
                                        config,
                                        eval_mode='test',
                                        skip_evaluated_checkpoints=False,
                                        do_kitti_native_eval=False)
            model_evaluator.run_latest_checkpoints(ckpt_indices)
Example #4
0
def main():
    ##############################
    # Options
    ##############################
    dataset = DatasetBuilder.build_kitti_dataset(DatasetBuilder.KITTI_TRAINVAL)

    num_jittered_boxes = 5
    iou_thresh = 0.7

    classes = ['Car']

    sample_name = '000050'

    ##############################

    # Get filtered labels
    dataset.classes = classes
    obj_labels = obj_utils.read_labels(dataset.kitti_label_dir, sample_name)
    obj_labels, class_filter = obj_utils.filter_labels(obj_labels,
                                                       classes=dataset.classes)

    # Image shape
    bgr_image = cv2.imread(dataset.get_rgb_image_path(sample_name))
    rgb_image = bgr_image[..., ::-1]
    image_shape = rgb_image.shape[0:2]

    # Generate jittered boxes
    aug_labels = []
    for label in obj_labels:
        for i in range(num_jittered_boxes):
            aug_label = kitti_aug.jitter_obj_boxes_2d([label], iou_thresh,
                                                      image_shape)
            aug_labels.append(aug_label[0])

    # Visualize boxes
    fig, axes = vis_utils.plots_from_image(rgb_image, display=False)

    # Draw non-augmented boxes in red
    for obj in obj_labels:
        vis_utils.draw_obj_as_box_2d(axes, obj, color='r')

    # Draw augmented boxes in cyan
    for obj in aug_labels:
        vis_utils.draw_obj_as_box_2d(axes, obj, color='c', linewidth=1)

    plt.show(block=True)
def main():
    ##############################
    # Options
    ##############################

    dataset = DatasetBuilder.build_kitti_dataset(DatasetBuilder.KITTI_TRAINVAL)

    sample_name = '000050'

    ##############################

    print('Showing instance masks for sample:', sample_name)

    # Load image and instances
    image = obj_utils.get_image(sample_name, dataset.image_2_dir)
    instance_img = cv2.imread(dataset.instance_dir +
                              '/{}.png'.format(sample_name))
    instance_img = instance_img[:, :, 0].astype(np.uint8)

    # Get instance masks
    start = time.time()
    instance_masks = instance_utils.get_instance_mask_list(instance_img)
    print("Time to parse instance image:", str(time.time() - start))

    ##########################################################
    # Visualization
    ##########################################################

    # Shown on screen
    image_disp_size = (900, 300)
    vis_utils.cv2_imshow('Left Image',
                         image,
                         size_wh=image_disp_size,
                         location_xy=(80, 0))

    # Generate random colours for each instance
    for i in range(instance_masks.shape[0]):
        left_im_instances = instance_masks[i].astype(np.uint8) * 255

        vis_utils.cv2_imshow('Instances',
                             left_im_instances,
                             size_wh=image_disp_size,
                             location_xy=(80, 320))

        cv2.waitKey()
Example #6
0
    def setUp(self):
        tf.test.TestCase.setUp(self)

        test_pipeline_config_path = monopsr.root_dir() + \
            '/configs/unittest_stagewise.config'

        self.model_config, self.train_config, _,  dataset_config = \
            config_builder.get_configs_from_pipeline_file(
                test_pipeline_config_path, is_training=True)

        # unittest-kitti has [2, 1, 1] clusters
        input_config = self.model_config.input_config
        input_config.bev_depth = 5

        # Generate dataset
        self.dataset = DatasetBuilder.build_kitti_dataset(
            DatasetBuilder.KITTI_UNITTEST,
            use_defaults=False,
            new_cfg=dataset_config)
Example #7
0
    def test_tf_project_pc_to_image(self):
        """Check that tf_project_pc_to_image matches numpy version"""

        dataset = DatasetBuilder.build_kitti_dataset(
            DatasetBuilder.KITTI_TRAINVAL)

        np.random.seed(12345)
        point_cloud_batch = np.random.rand(32, 3, 2304)
        frame_calib = calib_utils.get_frame_calib(dataset.calib_dir, '000050')
        cam_p = frame_calib.p2

        exp_proj_uv = [
            calib_utils.project_pc_to_image(point_cloud, cam_p)
            for point_cloud in point_cloud_batch
        ]

        tf_proj_uv = calib_utils.tf_project_pc_to_image(
            point_cloud_batch, cam_p, 32)

        with self.test_session() as sess:
            proj_uv_out = sess.run(tf_proj_uv)

        np.testing.assert_allclose(exp_proj_uv, proj_uv_out)
Example #8
0
 def setUpClass(cls):
     cls.dataset = DatasetBuilder.build_kitti_dataset(
         DatasetBuilder.KITTI_TRAINVAL)
Example #9
0
def main():

    ##############################
    # Options
    ##############################

    point_cloud_source = 'depth_2_multiscale'

    samples_to_use = None  # all samples

    dataset = DatasetBuilder.build_kitti_dataset(DatasetBuilder.KITTI_TRAINVAL)

    out_instance_dir = 'outputs/instance_2_{}'.format(point_cloud_source)

    required_classes = [
        'Car',
        'Pedestrian',
        'Cyclist',
        'Van',
        'Truck',
        'Person_sitting',
        'Tram',
        'Misc',
    ]

    ##############################
    # End of Options
    ##############################

    # Create instance folder
    os.makedirs(out_instance_dir, exist_ok=True)

    # Get frame ids to process
    if samples_to_use is None:
        samples_to_use = dataset.get_sample_names()

    # Begin instance mask generation
    for sample_idx, sample_name in enumerate(samples_to_use):

        sys.stdout.write(
            '\r{} / {} Generating {} instances for sample {}'.format(
                sample_idx, dataset.num_samples - 1, point_cloud_source,
                sample_name))

        # Get image
        image = obj_utils.get_image(sample_name, dataset.image_2_dir)
        image_shape = image.shape[0:2]

        # Get calibration
        frame_calib = calib_utils.get_frame_calib(dataset.calib_dir,
                                                  sample_name)

        # Get point cloud
        if point_cloud_source.startswith('depth'):
            point_cloud = obj_utils.get_depth_map_point_cloud(
                sample_name, frame_calib, dataset.depth_dir)

        elif point_cloud_source == 'velo':
            point_cloud = obj_utils.get_lidar_point_cloud_for_cam(
                sample_name, frame_calib, dataset.velo_dir, image_shape)
        else:
            raise ValueError('Invalid point cloud source', point_cloud_source)

        # Filter according to classes
        obj_labels = obj_utils.read_labels(dataset.kitti_label_dir,
                                           sample_name)
        obj_labels, _ = obj_utils.filter_labels_by_class(
            obj_labels, required_classes)

        # Get 2D and 3D bounding boxes from labels
        gt_boxes_2d = [
            box_3d_encoder.object_label_to_box_2d(obj_label)
            for obj_label in obj_labels
        ]
        gt_boxes_3d = [
            box_3d_encoder.object_label_to_box_3d(obj_label)
            for obj_label in obj_labels
        ]

        instance_image = np.full(image_shape, 255, dtype=np.uint8)

        # Start instance index at 0 and generate instance masks for all boxes
        inst_idx = 0
        for obj_label, box_2d, box_3d in zip(obj_labels, gt_boxes_2d,
                                             gt_boxes_3d):

            # Apply inflation and offset to box_3d
            modified_box_3d = modify_box_3d(box_3d, obj_label)

            # Get points in 3D box
            box_points, mask = obj_utils.points_in_box_3d(
                modified_box_3d, point_cloud.T)

            # Get points in 2D box
            points_in_im = calib_utils.project_pc_to_image(
                box_points.T, cam_p=frame_calib.p2)
            mask_2d = \
                (points_in_im[0] >= box_2d[1]) & \
                (points_in_im[0] <= box_2d[3]) & \
                (points_in_im[1] >= box_2d[0]) & \
                (points_in_im[1] <= box_2d[2])

            if point_cloud_source.startswith('depth'):
                mask_points_in_im = np.where(mask.reshape(image_shape))
                mask_points_in_im = [
                    mask_points_in_im[0][mask_2d],
                    mask_points_in_im[1][mask_2d]
                ]
                instance_pixels = np.asarray(
                    [mask_points_in_im[1], mask_points_in_im[0]])
            elif point_cloud_source == 'velo':
                # image_points = box_utils.project_to_image(
                #     box_points.T, frame.p_left).astype(np.int32)
                pass

            # Guarantees that indices don't exceed image dimensions
            instance_pixels[0, :] = np.clip(instance_pixels[0, :], 0,
                                            image_shape[1] - 1)
            instance_pixels[1, :] = np.clip(instance_pixels[1, :], 0,
                                            image_shape[0] - 1)

            instance_image[instance_pixels[1, :],
                           instance_pixels[0, :]] = np.uint8(inst_idx)

            inst_idx += 1

        # Write image to directory
        cv2.imwrite(out_instance_dir + '/{}.png'.format(sample_name),
                    instance_image, [cv2.IMWRITE_PNG_COMPRESSION, 1])
Example #10
0
def main():
    """Interpolates the lidar point cloud to and saves a dense depth map of the scene.
    """

    ##############################
    # Options
    ##############################

    dataset = DatasetBuilder.build_kitti_dataset(DatasetBuilder.KITTI_TRAINVAL)
    data_split = dataset.data_split

    # Fill algorithm
    fill_type = 'multiscale'

    save_depth_maps = True

    out_depth_map_dir = 'outputs/{}/depth_2_{}'.format(data_split, fill_type)

    samples_to_use = None
    ##############################
    # End of Options
    ##############################
    os.makedirs(out_depth_map_dir, exist_ok=True)

    # Rolling average array of times for time estimation
    avg_time_arr_length = 5
    last_fill_times = np.repeat([1.0], avg_time_arr_length)
    last_total_times = np.repeat([1.0], avg_time_arr_length)

    if samples_to_use is None:
        samples_to_use = [sample.name for sample in dataset.sample_list]

    for sample_idx, sample_name in enumerate(samples_to_use):

        # Calculate average time with last n fill times
        avg_fill_time = np.mean(last_fill_times)
        avg_total_time = np.mean(last_total_times)

        # Print progress
        sys.stdout.write('\rProcessing {} / {}, Idx {}, Avg Fill Time: {:.5f}s, '
                         'Avg Time: {:.5f}s, Est Time: {:.3f}s'.format(
                             sample_idx, dataset.num_samples - 1, sample_name,
                             avg_fill_time, avg_total_time,
                             avg_total_time * (dataset.num_samples - sample_idx)))
        sys.stdout.flush()

        # Start timing
        start_total_time = time.time()

        # Load sample info
        image = obj_utils.get_image(sample_name, dataset.image_2_dir)
        image_shape = image.shape[0:2]
        frame_calib = calib_utils.get_frame_calib(dataset.calib_dir, sample_name)
        cam_p = frame_calib.p2

        # Load point cloud
        point_cloud = obj_utils.get_lidar_point_cloud(sample_name, frame_calib, dataset.velo_dir)

        # Fill depth map
        if fill_type == 'multiscale':
            # Project point cloud to depth map
            projected_depths = depth_map_utils.project_depths(point_cloud, cam_p, image_shape)

            start_fill_time = time.time()
            final_depth_map, _ = ip_basic.fill_in_multiscale(projected_depths)
            end_fill_time = time.time()
        else:
            raise ValueError('Invalid fill algorithm')

        # Save depth maps
        if save_depth_maps:
            out_depth_map_path = out_depth_map_dir + '/{}.png'.format(sample_name)
            depth_map_utils.save_depth_map(out_depth_map_path, final_depth_map)

        # Stop timing
        end_total_time = time.time()

        # Update fill times
        last_fill_times = np.roll(last_fill_times, -1)
        last_fill_times[-1] = end_fill_time - start_fill_time

        # Update total times
        last_total_times = np.roll(last_total_times, -1)
        last_total_times[-1] = end_total_time - start_total_time
Example #11
0
 def setUpClass(cls):
     cls.fake_kitti_dir = tests.test_path() + '/datasets/Kitti/object'
     cls.dataset = DatasetBuilder.build_kitti_dataset(
         DatasetBuilder.KITTI_UNITTEST)