예제 #1
0
파일: kitti.py 프로젝트: subokita/pybot
    def __init__(self, directory, is_2015=False, scale=1.0):
        """
        Ground truth dataset iterator
        """
        if is_2015: 
            left_dir, right_dir = 'image_2', 'image_3'
            noc_dir, occ_dir = 'disp_noc_0', 'disp_occ_0'
            calib_left, calib_right = 'P2', 'P3'
        else: 
            left_dir, right_dir = 'image_0', 'image_1'
            noc_dir, occ_dir = 'disp_noc', 'disp_occ'
            calib_left, calib_right = 'P0', 'P1'

        self.scale = scale

        # Stereo is only evaluated on the _10.png images
        self.stereo = StereoDatasetReader(os.path.expanduser(directory), 
                                          left_template=''.join([left_dir, '/%06i_10.png']), 
                                          right_template=''.join([right_dir, '/%06i_10.png']), scale=scale, grayscale=True)
        self.noc = ImageDatasetReader(template=os.path.join(os.path.expanduser(directory), noc_dir, '%06i_10.png'))
        self.occ = ImageDatasetReader(template=os.path.join(os.path.expanduser(directory), occ_dir, '%06i_10.png'))

        def calib_read(fn, scale): 
            db = AttrDict.load_yaml(fn)
            P0 = np.float32(db[calib_left].split(' '))
            P1 = np.float32(db[calib_right].split(' '))
            fx, cx, cy = P0[0], P0[2], P0[6]
            baseline_px = np.fabs(P1[3])
            return StereoCamera.from_calib_params(fx, fx, cx, cy, baseline_px=baseline_px)

        self.calib = DatasetReader(template=os.path.join(os.path.expanduser(directory), 'calib/%06i.txt'), 
                                   process_cb=lambda fn: calib_read(fn, scale))

        self.poses = repeat(None)
예제 #2
0
    def __init__(self, directory='', scene=''): 

        # Read images
        # nfiles = number_of_files(os.path.expanduser(directory))
        # files = [os.path.join(directory, 'scene_%02i_%04i.png' % (idx/1000, idx%1000)) for idx in np.arange(nfiles)]

        path = os.path.join(directory, '%s_images_archieve' % scene)
        img_files = read_dir(os.path.expanduser(path), pattern='*.png', recursive=False, verbose=False, flatten=True)
        gt_files = map(lambda fn: fn.replace('%s_images' % scene, '%s_GT' % scene).replace('.png', '.txt'), img_files)

        def process_gt_cb(fn): 
            data = AttrDict()
            with open(fn) as f: 
                for l in f: 
                    key = l[0:l.find('=')].replace(' ', '')
                    if l.find('[') < 0: 
                        val = float(l[l.find('=')+1:l.find(';')].replace(' ', ''))
                    else: 
                        val = l[l.find('[')+1:l.find(']')]
                        val = np.array(map(lambda v: float(v), val.split(',')))
                    data[key] = val
            return data

        self.rgb = ImageDatasetReader.from_filenames(img_files)
        self.gt = DatasetReader.from_filenames(files=gt_files, process_cb=process_gt_cb)
예제 #3
0
        def __init__(self, target, instance, files):
            self.target = target
            self.instance = instance
            mask_files = natural_sort(
                filter(lambda fn: '_mask.png' in fn, files))
            depth_files = natural_sort(
                filter(lambda fn: '_depth.png' in fn, files))
            rgb_files = natural_sort(
                list(set(files) - set(mask_files) - set(depth_files)))
            loc_files = natural_sort(
                map(lambda fn: fn.replace('.png', '_loc.txt'), rgb_files))
            assert (len(mask_files) == len(depth_files) == len(rgb_files) ==
                    len(loc_files))

            self.rgb = ImageDatasetReader.from_filenames(rgb_files)
            self.depth = ImageDatasetReader.from_filenames(depth_files)
            self.mask = ImageDatasetReader.from_filenames(mask_files)
예제 #4
0
파일: misc.py 프로젝트: zjgulai/pybot
    def __init__(self,
                 directory='',
                 template='data/img/img%04i_0.png',
                 velodyne_template=None,
                 start_idx=1,
                 max_files=100000,
                 scale=1.0):

        # Set args
        self.scale = scale

        # Calibration
        try:
            calib_fn = os.path.join(os.path.expanduser(directory), 'info',
                                    'intrinsics.txt')
            s = open(calib_fn, 'r').readlines()
            s = ''.join(s[1:])
            for item in ['\n', '[', ']', ' ']:
                s = s.replace(item, '')
            K = np.fromstring(s, sep=',').reshape(3, 3)
            self.calib_ = Camera.from_intrinsics(
                CameraIntrinsic(K, shape=RPGUrban.shape[:2])).scaled(scale)
        except Exception as e:
            print('Failed to read calibration data: {}'.format(e))
            self.calib_ = None

        # Read stereo images
        try:
            self.rgb_ = ImageDatasetReader(template=os.path.join(
                os.path.expanduser(directory), template),
                                           start_idx=start_idx,
                                           max_files=max_files,
                                           scale=scale)
        except Exception as e:
            print('Failed to read rgb data: {}'.format(e))
            self.rgb_ = NoneReader()

        # Read poses
        def load_poses(fn):
            """
            poses: image_id tx ty tz qx qy qz qw
            """
            X = (np.fromfile(fn, dtype=np.float64, sep=' ')).reshape(-1, 8)
            abs_poses = map(lambda p: RigidTransform(xyzw=p[4:], tvec=p[1:4]),
                            X)
            rel_poses = [abs_poses[0].inverse() * p for p in abs_poses]
            return rel_poses

        try:
            pose_fn = os.path.join(os.path.expanduser(directory), 'info',
                                   'groundtruth.txt')
            self.poses_ = FileReader(pose_fn, process_cb=load_poses)
        except Exception as e:
            self.poses_ = NoneReader()
예제 #5
0
        def __init__(self, target, instance, files):
            self.target = target
            self.instance = instance
            mask_files = natural_sort(
                filter(lambda fn: '_maskcrop.png' in fn, files))
            depth_files = natural_sort(
                filter(lambda fn: '_depthcrop.png' in fn, files))
            rgb_files = natural_sort(
                list(set(files) - set(mask_files) - set(depth_files)))
            loc_files = natural_sort(
                map(lambda fn: fn.replace('_crop.png', '_loc.txt'), rgb_files))

            # Ensure all have equal number of files (Hack! doesn't ensure filename consistency)
            nfiles = np.min([
                len(loc_files),
                len(mask_files),
                len(depth_files),
                len(rgb_files)
            ])
            mask_files, depth_files, rgb_files, loc_files = mask_files[:nfiles], depth_files[:nfiles], \
                                                            rgb_files[:nfiles], loc_files[:nfiles]

            # print target, instance, len(loc_files), len(mask_files), len(depth_files), len(rgb_files)
            assert (len(mask_files) == len(depth_files) == len(rgb_files) ==
                    len(loc_files))

            # Read images
            self.rgb = ImageDatasetReader.from_filenames(rgb_files)
            self.depth = ImageDatasetReader.from_filenames(depth_files)
            self.mask = ImageDatasetReader.from_filenames(mask_files)

            # Read top-left locations of bounding box
            self.locations = np.vstack([
                np.loadtxt(loc, delimiter=',', dtype=np.int32)
                for loc in loc_files
            ])
예제 #6
0
파일: kitti.py 프로젝트: zjgulai/pybot
class KITTIStereoGroundTruthDatasetReader(object):
    def __init__(self, directory, is_2015=False, scale=1.0):
        """
        Ground truth dataset iterator
        """
        if is_2015:
            left_dir, right_dir = 'image_2', 'image_3'
            noc_dir, occ_dir = 'disp_noc_0', 'disp_occ_0'
            calib_left, calib_right = 'P2', 'P3'
        else:
            left_dir, right_dir = 'image_0', 'image_1'
            noc_dir, occ_dir = 'disp_noc', 'disp_occ'
            calib_left, calib_right = 'P0', 'P1'

        self.scale = scale

        # Stereo is only evaluated on the _10.png images
        self.stereo = StereoDatasetReader(
            os.path.expanduser(directory),
            left_template=''.join([left_dir, '/%06i_10.png']),
            right_template=''.join([right_dir, '/%06i_10.png']),
            scale=scale, grayscale=True)
        self.noc = ImageDatasetReader(
            template=os.path.join(os.path.expanduser(directory),
                                  noc_dir, '%06i_10.png'))
        self.occ = ImageDatasetReader(
            template=os.path.join(os.path.expanduser(directory),
                                  occ_dir, '%06i_10.png'))

        def calib_read(fn, scale):
            db = AttrDict.load_yaml(fn)
            P0 = np.float32(db[calib_left].split(' '))
            P1 = np.float32(db[calib_right].split(' '))
            fx, cx, cy = P0[0], P0[2], P0[6]
            baseline_px = np.fabs(P1[3])
            return StereoCamera.from_calib_params(fx, fx, cx, cy,
                                                  baseline_px=baseline_px)

        self.calib = DatasetReader(
            template=os.path.join(os.path.expanduser(directory),
                                  'calib/%06i.txt'),
            process_cb=lambda fn: calib_read(fn, scale))

        self.poses_ = NoneReader()

    def iter_gt_frames(self, *args, **kwargs):
        """
        Iterate over all the ground-truth data
           - For noc, occ disparity conversion, see
             devkit_stereo_flow/matlab/disp_read.m
        """
        for (left, right), noc, occ, calib in izip(
                self.iter_stereo_frames(*args, **kwargs),
                self.noc.iteritems(*args, **kwargs),
                self.occ.iteritems(*args, **kwargs),
                self.calib.iteritems(*args, **kwargs)):
            yield AttrDict(left=left, right=right,
                           depth=(occ/256).astype(np.float32),
                           noc=(noc/256).astype(np.float32),
                           occ=(occ/256).astype(np.float32),
                           calib=calib, pose=None)

    def iteritems(self, *args, **kwargs):
        return self.stereo.left.iteritems(*args, **kwargs)

    def iter_stereo_frames(self, *args, **kwargs):
        return self.stereo.iteritems(*args, **kwargs)

    def iterframes(self, *args, **kwargs):
        for (left, right), pose in izip(
                self.iter_stereo_frames(*args, **kwargs),
                self.poses.iteritems(*args, **kwargs)):
            yield AttrDict(left=left, right=right,
                           velodyne=None, pose=pose)

    @property
    def stereo_frames(self):
        return self.iter_stereo_frames()

    @property
    def poses(self):
        return self.poses_
예제 #7
0
        def __init__(self, files, meta_file, aligned_file, version, name=''):
            self.name = name
            self.version = version

            self.rgb_files, self.depth_files = UWRGBDSceneDataset._reader.scene_files(
                files, version)
            assert (len(self.depth_files) == len(self.rgb_files))

            # RGB, Depth
            # TODO: Check depth seems scaled by 256 not 16
            self.rgb = ImageDatasetReader.from_filenames(self.rgb_files)
            self.depth = ImageDatasetReader.from_filenames(self.depth_files)

            # BBOX
            self.bboxes = UWRGBDSceneDataset._reader.load_bboxes(meta_file, version) \
                         if meta_file is not None else [None] * len(self.rgb_files)
            assert (len(self.bboxes) == len(self.rgb_files))

            # POSE
            # Version 2 only supported! Version 1 support for rgbd scene (unclear)
            self.poses = UWRGBDSceneDataset._reader.load_poses(aligned_file.pose, version) \
                         if aligned_file is not None and version == 'v2' else [None] * len(self.rgb_files)
            assert (len(self.poses) == len(self.rgb_files))

            # Aligned point cloud
            if aligned_file is not None:
                if version != 'v2':
                    raise RuntimeError('Version v2 is only supported')

                ply_xyz, ply_rgb = UWRGBDSceneDataset._reader.load_ply(
                    aligned_file.ply, version)
                ply_label = UWRGBDSceneDataset._reader.load_plylabel(
                    aligned_file.label, version)

                # Remapping to v1 index
                ply_label = np.array(
                    [UWRGBDSceneDataset.v2_to_v1[l] for l in ply_label],
                    dtype=np.int32)

                # Get object info
                object_info = UWRGBDSceneDataset._reader.cluster_ply_labels(
                    ply_xyz[::30], ply_rgb[::30], ply_label[::30])

                # Add camera info
                intrinsic = CameraIntrinsic(
                    K=UWRGBDSceneDataset.camera_params.K_rgb,
                    shape=UWRGBDDataset.default_rgb_shape)
                camera = Camera.from_intrinsics_extrinsics(
                    intrinsic, CameraExtrinsic.identity())
                self.map_info = AttrDict(camera=camera, objects=object_info)

                # # 1c. Determine centroid of each cluster
                # unique_centers = np.vstack([np.mean(ply_xyz[ply_label == l], axis=0) for l in unique_labels])

                # self.map_info = AttrDict(
                #     points=ply_xyz, color=ply_rgb, labels=ply_label,
                #     unique_labels=unique_labels, unique_centers=unique_centers, camera=camera
                # )
                assert (len(ply_xyz) == len(ply_rgb))

            print('*********************************')
            print('Scene {}, Images: {}, Poses: {}\nAligned: {}'.format(
                self.scene_name, len(self.rgb_files), len(self.poses),
                aligned_file))