def download_dataset(self, dataset_dir, dataset_url):
        """Downloads and extracts dataset.

        Args:
            dataset_dir (str): dataset directory.
            dataset_url (str): url to download dataset.
        """
        if osp.exists(dataset_dir):
            return

        if dataset_url is None:
            raise RuntimeError(
                '{} dataset needs to be manually '
                'prepared, please follow the '
                'document to prepare this dataset'.format(
                    self.__class__.__name__
                )
            )

        print('Creating directory "{}"'.format(dataset_dir))
        util.mkdir_if_missing(dataset_dir)
        fpath = osp.join(dataset_dir, osp.basename(dataset_url))

        print(
            'Downloading {} dataset to "{}"'.format(
                self.__class__.__name__, dataset_dir
            )
        )

        print('Extracting "{}"'.format(fpath))
        try:
            tar = tarfile.open(fpath)
            tar.extractall(path=dataset_dir)
            tar.close()
        except:
            zip_ref = zipfile.ZipFile(fpath, 'r')
            zip_ref.extractall(dataset_dir)
            zip_ref.close()

        print('{} dataset is ready'.format(self.__class__.__name__))
Example #2
0
ZNEAR = 0.25
ZFAR = 6.0

depth_factor = 1000

LINEMOD_root = os.path.join(cur_path,
                            '../data/LINEMOD_6D/LM6d_converted/LM6d_refine')
gt_observed_dir = os.path.join(LINEMOD_root, 'data/gt_observed')
observed_set_dir = os.path.join(LINEMOD_root, 'image_set/observed')

# output path
LINEMOD_syn_root = os.path.join(
    cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_refine_syn')
pose_dir = os.path.join(LINEMOD_syn_root,
                        'poses')  # single object in each image
mkdir_if_missing(pose_dir)
print("target path: {}".format(pose_dir))

NUM_IMAGES = 10000


def angle(u, v):
    c = np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v)
                        )  # -> cosine of the angle
    rad = np.arccos(np.clip(c, -1, 1))
    deg = rad / np.pi * 180
    return deg


def stat_poses():
    pz = np.array([0, 0, 1])
    ZNEAR = 0.25
    ZFAR = 6.0
    depth_factor = 1000

    gen_images = True
    # output_path
    version = 'rendered_Yu_v02'
    real_root_dir = os.path.join(
        cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_render_v1/data/real')
    real_meta_path = "%s/{}-meta.mat" % (real_root_dir)
    rendered_root_dir = os.path.join(
        cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_render_v1/data',
        version)
    pair_set_dir = os.path.join(
        cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_render_v1/image_set')
    mkdir_if_missing(rendered_root_dir)
    mkdir_if_missing(pair_set_dir)
    all_pair = []
    for small_class_idx, class_name in enumerate(tqdm(class_name_list)):
        big_class_idx = class2big_idx[class_name]
        # init render
        model_dir = os.path.join(
            cur_path,
            '../data/LINEMOD_6D/LM6d_converted/models/{}'.format(class_name))
        if gen_images:
            render_machine = Render_Py(model_dir, K, width, height, ZNEAR,
                                       ZFAR)

        with open(keyframe_path.format(class_name)) as f:
            real_index_list = [x.strip() for x in f.readlines()]
        video_name_list = [x.split('/')[0] for x in real_index_list]
Example #4
0
def main():
    gen_images = (
        True
    )  ##################################################################### gen_images
    for class_idx, class_name in enumerate(class_list):
        # train_pair = []
        val_pair = []
        if class_name in ["__back_ground__"]:
            continue
        if not class_name in sel_classes:
            continue
        print("start ", class_name)
        model_path = os.path.join(
            TLESS_root, "models/{}/obj_{}_scaled.ply".format(class_name, class_name)
        )
        model = inout.load_ply(model_path)
        for video_name in sel_videos:  # 02

            for set_type in ["test"]:
                with open(
                    os.path.join(
                        real_set_root,
                        "{}_{}_{}.txt".format(class_name, video_name, "test"),
                    ),
                    "r",
                ) as f:
                    test_real_list = [x.strip() for x in f.readlines()]

                with open(
                    rendered_pose_path.format(set_type, class_name, video_name)
                ) as f:
                    str_rendered_pose_list = [
                        x.strip().split(" ") for x in f.readlines()
                    ]
                rendered_pose_list = np.array(
                    [
                        [float(x) for x in each_pose]
                        for each_pose in str_rendered_pose_list
                    ]
                )
                rendered_per_real = 1
                assert len(rendered_pose_list) == 1 * len(
                    test_real_list
                ), "{} vs {}".format(len(rendered_pose_list), len(test_real_list))
                for idx, real_index in enumerate(tqdm(test_real_list)):
                    _, cls_name, vid_name, real_prefix = real_index.split("/")

                    rendered_dir = os.path.join(
                        rendered_root_dir, class_name, video_name
                    )
                    mkdir_if_missing(rendered_dir)
                    for inner_idx in range(rendered_per_real):
                        if gen_images:
                            # if gen_images and real_index in test_real_list and inner_idx == 0: # only generate my_val_v{}
                            image_file = os.path.join(
                                rendered_dir, "{}-color.png".format(real_prefix)
                            )
                            depth_file = os.path.join(
                                rendered_dir, "{}-depth.png".format(real_prefix)
                            )

                            rendered_idx = idx * rendered_per_real + inner_idx
                            pose_rendered_q = rendered_pose_list[rendered_idx]
                            R = se3.quat2mat(pose_rendered_q[:4])
                            t = pose_rendered_q[4:]

                            surf_color = None  # (1, 0, 0) # ?????
                            im_size = (width, height)  # (w, h)

                            ren_rgb, ren_depth = renderer.render(
                                model,
                                im_size,
                                K_0,
                                R,
                                t,
                                clip_near=ZNEAR,
                                clip_far=ZFAR,
                                surf_color=surf_color,
                                mode="rgb+depth",
                            )

                            ren_depth = (ren_depth * depth_factor).astype(np.uint16)

                            cv2.imwrite(image_file, ren_rgb)
                            cv2.imwrite(depth_file, ren_depth)

                            pose_rendered_file = os.path.join(
                                rendered_dir, "{}-pose.txt".format(real_prefix)
                            )
                            text_file = open(pose_rendered_file, "w")
                            text_file.write("{}\n".format(class_idx))
                            pose_rendered_m = np.zeros((3, 4))
                            pose_rendered_m[:, :3] = se3.quat2mat(pose_rendered_q[:4])
                            pose_rendered_m[:, 3] = pose_rendered_q[4:]
                            pose_ori_m = pose_rendered_m
                            pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}".format(
                                pose_ori_m[0, 0],
                                pose_ori_m[0, 1],
                                pose_ori_m[0, 2],
                                pose_ori_m[0, 3],
                                pose_ori_m[1, 0],
                                pose_ori_m[1, 1],
                                pose_ori_m[1, 2],
                                pose_ori_m[1, 3],
                                pose_ori_m[2, 0],
                                pose_ori_m[2, 1],
                                pose_ori_m[2, 2],
                                pose_ori_m[2, 3],
                            )
                            text_file.write(pose_str)

                        val_pair.append(
                            "{} test/{}/{}/{}".format(
                                real_index, class_name, video_name, real_prefix
                            )
                        )

                test_pair_set_file = os.path.join(
                    pair_set_dir,
                    "my_val_{}_video{}_{}.txt".format(version, video_name, class_name),
                )
                val_pair = sorted(val_pair)
                with open(test_pair_set_file, "w") as text_file:
                    for x in val_pair:
                        text_file.write("{}\n".format(x))
            print(class_name, video_name, " done")
def gen_poses():
    pz = np.array([0,0,1])
    pose_dict, quat_stat, trans_stat, new_points = stat_poses()
    real_prefix_list = ['{:06d}'.format(i + 1) for i in range(NUM_IMAGES)]
    sel_classes = classes
    num_class = len(sel_classes)
    # syn_pose_dict = {prefix: np.zeros((num_class, 7), dtype='float32')
    #                  for prefix in real_prefix_list}  # store poses
    syn_pose_dict = {cls_name: np.zeros((NUM_IMAGES, 7)) for cls_name in sel_classes}

    syn_pose_dir = os.path.join(cur_path, '..', 'data/LINEMOD_6D/LM6d_converted/LM6d_render_v1/syn_poses_single')
    mkdir_if_missing(syn_pose_dir)

    for cls_i, cls_name in enumerate(sel_classes):
        if cls_name != 'ape':
            continue
        src_quat_mean = quat_stat[cls_name]['quat_mean']
        src_quat_std = quat_stat[cls_name]['quat_std']
        src_trans_mean = trans_stat[cls_name]['trans_mean']
        src_trans_std = trans_stat[cls_name]['trans_std']
        deg_max = new_points[cls_name]['angle_max']

        for i in tqdm(range(NUM_IMAGES)):
            real_prefix = real_prefix_list[i]

            # if cls_name == 'ape':
            #     continue

            # randomly generate a pose
            tgt_quat = np.random.normal(0, 1, 4)
            tgt_quat = tgt_quat/np.linalg.norm(tgt_quat)
            if tgt_quat[0] < 0:
                tgt_quat *= -1
            tgt_trans = np.random.normal(src_trans_mean, src_trans_std)

            tgt_rot_m = se3.quat2mat(tgt_quat)
            new_pz = np.dot(tgt_rot_m, pz.reshape((-1, 1))).reshape((3,))
            pz_mean = new_points[cls_name]['pz_mean']
            deg = angle(new_pz, pz_mean)

            # r_dist, t_dist = calc_rt_dist_q(tgt_quat, src_quat, tgt_trans, src_trans)
            transform = np.matmul(K, tgt_trans.reshape(3, 1))
            center_x = float(transform[0] / transform[2])
            center_y = float(transform[1] / transform[2])
            count = 0
            while (deg > deg_max or not (48 < center_x < (640 - 48) and 48 < center_y < (480 - 48))):
                # randomly generate a pose
                tgt_quat = np.random.normal(0, 1, 4)
                tgt_quat = tgt_quat / np.linalg.norm(tgt_quat)
                if tgt_quat[0] < 0:
                    tgt_quat *= -1
                tgt_trans = np.random.normal(src_trans_mean, src_trans_std)

                tgt_rot_m = se3.quat2mat(tgt_quat)
                new_pz = np.dot(tgt_rot_m, pz.reshape((-1, 1))).reshape((3,))
                pz_mean = new_points[cls_name]['pz_mean']
                deg = angle(new_pz, pz_mean)

                transform = np.matmul(K, tgt_trans.reshape(3, 1))
                center_x = float(transform[0] / transform[2])
                center_y = float(transform[1] / transform[2])
                count += 1
                if count % 100 == 0:
                    print(real_prefix, cls_name, count,
                          "deg < deg_max={}: {}, 48 < center_x < (640-48): {}, 48 < center_y < (480-48): {}".format(
                              deg_max, deg <= deg_max, 48 < center_x < (640 - 48), 48 < center_y < (480 - 48)))

            tgt_pose_q = np.zeros((7,), dtype='float32')
            tgt_pose_q[:4] = tgt_quat
            tgt_pose_q[4:] = tgt_trans
            syn_pose_dict[cls_name][i, :] = tgt_pose_q

    # write pose
    poses_file = os.path.join(syn_pose_dir, 'LM6d_ds_v1_all_syn_pose.pkl')
    with open(poses_file, 'wb') as f:
        cPickle.dump(syn_pose_dict, f, 2)
Example #6
0
def main():
    gen_images = True
    for class_idx, class_name in idx2class.items():
        train_pair = []
        val_pair = []
        print("start ", class_name)
        if class_name in ['__back_ground__']:
            continue
        # uncomment here to only generate data for ape
        # if class_name not in ['ape']:
        #     continue

        if gen_images:
            # init render
            model_dir = os.path.join(LM6d_root, 'models', class_name)
            render_machine = Render_Py(model_dir, K, width, height, ZNEAR,
                                       ZFAR)

        for set_type in ['all']:
            with open(
                    os.path.join(observed_set_root,
                                 '{}_{}.txt'.format(class_name, 'all')),
                    'r') as f:
                all_observed_list = [x.strip() for x in f.readlines()]
            with open(
                    os.path.join(observed_set_root,
                                 '{}_{}.txt'.format(class_name, 'train')),
                    'r') as f:
                train_observed_list = [x.strip() for x in f.readlines()]
            with open(
                    os.path.join(observed_set_root,
                                 '{}_{}.txt'.format(class_name, 'test')),
                    'r') as f:
                test_observed_list = [x.strip() for x in f.readlines()]

            with open(rendered_pose_path.format(set_type, class_name)) as f:
                str_rendered_pose_list = [
                    x.strip().split(' ') for x in f.readlines()
                ]
            rendered_pose_list = np.array(
                [[float(x) for x in each_pose]
                 for each_pose in str_rendered_pose_list])
            rendered_per_observed = 10
            assert (len(rendered_pose_list) == 10*len(all_observed_list)), \
                  '{} vs {}'.format(len(rendered_pose_list), len(all_observed_list))
            for idx, observed_index in enumerate(tqdm(all_observed_list)):
                video_name, observed_prefix = observed_index.split('/')
                rendered_dir = os.path.join(rendered_root_dir, class_name)
                mkdir_if_missing(rendered_dir)
                for inner_idx in range(rendered_per_observed):
                    if gen_images:
                        # if gen_images and observed_index in test_observed_list and inner_idx == 0: # only generate my_val_v{}
                        image_file = os.path.join(
                            rendered_dir,
                            '{}_{}-color.png'.format(observed_prefix,
                                                     inner_idx))
                        depth_file = os.path.join(
                            rendered_dir,
                            '{}_{}-depth.png'.format(observed_prefix,
                                                     inner_idx))
                        rendered_idx = idx * rendered_per_observed + inner_idx
                        pose_rendered_q = rendered_pose_list[rendered_idx]

                        rgb_gl, depth_gl = render_machine.render(
                            pose_rendered_q[:4], pose_rendered_q[4:])
                        rgb_gl = rgb_gl.astype('uint8')

                        depth_gl = (depth_gl * depth_factor).astype(np.uint16)

                        cv2.imwrite(image_file, rgb_gl)
                        cv2.imwrite(depth_file, depth_gl)

                        pose_rendered_file = os.path.join(
                            rendered_dir,
                            '{}_{}-pose.txt'.format(observed_prefix,
                                                    inner_idx))
                        text_file = open(pose_rendered_file, 'w')
                        text_file.write("{}\n".format(class_idx))
                        pose_rendered_m = np.zeros((3, 4))
                        pose_rendered_m[:, :3] = RT_transform.quat2mat(
                            pose_rendered_q[:4])
                        pose_rendered_m[:, 3] = pose_rendered_q[4:]
                        pose_ori_m = pose_rendered_m
                        pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}"\
                            .format(pose_ori_m[0, 0], pose_ori_m[0, 1], pose_ori_m[0, 2], pose_ori_m[0, 3],
                                    pose_ori_m[1, 0], pose_ori_m[1, 1], pose_ori_m[1, 2], pose_ori_m[1, 3],
                                    pose_ori_m[2, 0], pose_ori_m[2, 1], pose_ori_m[2, 2], pose_ori_m[2, 3])
                        text_file.write(pose_str)

                    if observed_index in test_observed_list:
                        if inner_idx == 0:
                            val_pair.append("{} {}/{}_{}".format(
                                observed_index, class_name, observed_prefix,
                                inner_idx))
                    else:
                        train_pair.append("{} {}/{}_{}".format(
                            observed_index, class_name, observed_prefix,
                            inner_idx))

            train_pair_set_file = os.path.join(
                pair_set_dir, "train_{}.txt".format(class_name))
            train_pair = sorted(train_pair)
            with open(train_pair_set_file, "w") as text_file:
                for x in train_pair:
                    text_file.write("{}\n".format(x))

            test_pair_set_file = os.path.join(
                pair_set_dir, "my_val_{}.txt".format(class_name))
            val_pair = sorted(val_pair)
            with open(test_pair_set_file, "w") as text_file:
                for x in val_pair:
                    text_file.write("{}\n".format(x))
        print(class_name, " done")
def main():
    gen_images = (
        True
    )  ##################################################################### gen_images
    for class_idx, class_name in enumerate(class_list):
        train_pair = []
        # val_pair = []
        if class_name in ["__back_ground__"]:
            continue
        if not class_name in sel_classes:
            continue
        print("start ", class_name)

        if gen_images:
            # init render
            model_dir = os.path.join(TLESS_root, "models", class_name)
            render_machine = Render_Py(model_dir, K, width, height, ZNEAR,
                                       ZFAR)

        for set_type in ["train"]:
            with open(
                    os.path.join(real_set_root,
                                 "{}_{}.txt".format(class_name, "train")),
                    "r",
            ) as f:
                train_real_list = [x.strip() for x in f.readlines()]

            with open(rendered_pose_path.format(set_type, class_name)) as f:
                str_rendered_pose_list = [
                    x.strip().split(" ") for x in f.readlines()
                ]
            rendered_pose_list = np.array(
                [[float(x) for x in each_pose]
                 for each_pose in str_rendered_pose_list])
            rendered_per_real = 10
            assert len(rendered_pose_list) == rendered_per_real * len(
                train_real_list), "{} vs {}".format(len(rendered_pose_list),
                                                    len(train_real_list))
            for idx, real_index in enumerate(tqdm(train_real_list)):
                video_name, real_prefix = real_index.split("/")
                rendered_dir = os.path.join(rendered_root_dir, class_name)
                mkdir_if_missing(rendered_dir)
                for inner_idx in range(rendered_per_real):
                    if gen_images:
                        # if gen_images and real_index in test_real_list and inner_idx == 0: # only generate my_val_v{}
                        image_file = os.path.join(
                            rendered_dir,
                            "{}_{}-color.png".format(real_prefix, inner_idx),
                        )
                        depth_file = os.path.join(
                            rendered_dir,
                            "{}_{}-depth.png".format(real_prefix, inner_idx),
                        )

                        rendered_idx = idx * rendered_per_real + inner_idx
                        pose_rendered_q = rendered_pose_list[rendered_idx]

                        rgb_gl, depth_gl = render_machine.render(
                            pose_rendered_q[:4], pose_rendered_q[4:])
                        rgb_gl = rgb_gl.astype("uint8")

                        depth_gl = (depth_gl * depth_factor).astype(np.uint16)

                        cv2.imwrite(image_file, rgb_gl)
                        cv2.imwrite(depth_file, depth_gl)

                        pose_rendered_file = os.path.join(
                            rendered_dir,
                            "{}_{}-pose.txt".format(real_prefix, inner_idx),
                        )
                        text_file = open(pose_rendered_file, "w")
                        text_file.write("{}\n".format(class_idx))
                        pose_rendered_m = np.zeros((3, 4))
                        pose_rendered_m[:, :3] = se3.quat2mat(
                            pose_rendered_q[:4])
                        pose_rendered_m[:, 3] = pose_rendered_q[4:]
                        pose_ori_m = pose_rendered_m
                        pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}".format(
                            pose_ori_m[0, 0],
                            pose_ori_m[0, 1],
                            pose_ori_m[0, 2],
                            pose_ori_m[0, 3],
                            pose_ori_m[1, 0],
                            pose_ori_m[1, 1],
                            pose_ori_m[1, 2],
                            pose_ori_m[1, 3],
                            pose_ori_m[2, 0],
                            pose_ori_m[2, 1],
                            pose_ori_m[2, 2],
                            pose_ori_m[2, 3],
                        )
                        text_file.write(pose_str)

                    train_pair.append("{} {}/{}_{}".format(
                        real_index, class_name, real_prefix, inner_idx))

            train_pair_set_file = os.path.join(
                pair_set_dir, "train_{}_{}.txt".format(version, class_name))
            train_pair = sorted(train_pair)
            with open(train_pair_set_file, "w") as text_file:
                for x in train_pair:
                    text_file.write("{}\n".format(x))

        print(class_name, " done")
def gen_observed():
    # output path
    observed_root_dir = os.path.join(LINEMOD_syn_root, 'data', 'observed')
    image_set_dir = os.path.join(LINEMOD_syn_root, 'image_set')
    mkdir_if_missing(observed_root_dir)
    mkdir_if_missing(image_set_dir)

    syn_poses_path = os.path.join(observed_pose_dir,
                                  'LM6d_ds_train_observed_pose_all.pkl')
    with open(syn_poses_path, 'rb') as f:
        syn_pose_dict = cPickle.load(f)

    for class_idx, class_name in enumerate(classes):
        if class_name == '__back_ground__':
            continue
        # uncomment here to only generate data for ape
        # if class_name not in ['ape']:
        #     continue

        # init render machines
        brightness_ratios = [0.2, 0.25, 0.3, 0.35, 0.4]
        model_dir = os.path.join(LINEMOD_syn_root, 'models', class_name)
        render_machine = Render_Py_Light(model_dir, K, width, height, ZNEAR,
                                         ZFAR, brightness_ratios)

        syn_poses = syn_pose_dict[class_name]
        num_poses = syn_poses.shape[0]
        observed_index_list = [
            '{}/{:06d}'.format(class_name, i + 1) for i in range(num_poses)
        ]

        observed_set_path = os.path.join(
            image_set_dir,
            'observed/LM6d_data_syn_train_observed_{}.txt'.format(class_name))
        mkdir_if_missing(os.path.join(image_set_dir, 'observed'))
        f_observed_set = open(observed_set_path, 'w')

        for idx, observed_index in enumerate(tqdm(observed_index_list)):
            f_observed_set.write('{}\n'.format(observed_index))
            prefix = observed_index.split('/')[1]

            observed_dir = os.path.join(observed_root_dir, class_name)
            mkdir_if_missing(observed_dir)

            observed_color_file = os.path.join(observed_dir,
                                               prefix + "-color.png")
            observed_depth_file = os.path.join(observed_dir,
                                               prefix + "-depth.png")
            observed_pose_file = os.path.join(observed_dir,
                                              prefix + "-pose.txt")

            observed_label_file = os.path.join(observed_dir,
                                               prefix + "-label.png")

            pose_quat = syn_poses[idx, :]
            pose = se3.se3_q2m(pose_quat)

            # generate random light_position
            if idx % 6 == 0:
                light_position = [1, 0, 1]
            elif idx % 6 == 1:
                light_position = [1, 1, 1]
            elif idx % 6 == 2:
                light_position = [0, 1, 1]
            elif idx % 6 == 3:
                light_position = [-1, 1, 1]
            elif idx % 6 == 4:
                light_position = [-1, 0, 1]
            elif idx % 6 == 5:
                light_position = [0, 0, 1]
            else:
                raise Exception("???")
            light_position = np.array(light_position) * 0.5
            # inverse yz
            light_position[0] += pose[0, 3]
            light_position[1] -= pose[1, 3]
            light_position[2] -= pose[2, 3]

            # randomly adjust color and intensity for light_intensity
            colors = np.array([[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0],
                               [1, 0, 1], [1, 1, 0], [1, 1, 1]])
            intensity = np.random.uniform(0.9, 1.1, size=(3, ))
            colors_randk = random.randint(0, colors.shape[0] - 1)
            light_intensity = colors[colors_randk] * intensity

            # randomly choose a render machine
            rm_randk = random.randint(0, len(brightness_ratios) - 1)
            # get render result
            rgb_gl, depth_gl = render_machine.render(se3.mat2quat(
                pose[:3, :3]),
                                                     pose[:, -1],
                                                     light_position,
                                                     light_intensity,
                                                     brightness_k=rm_randk)
            rgb_gl = rgb_gl.astype('uint8')
            # gt_observed label
            label_gl = np.zeros(depth_gl.shape)
            # print('depth gl:', depth_gl.shape)
            label_gl[depth_gl != 0] = 1

            cv2.imwrite(observed_color_file, rgb_gl)
            depth_gl = (depth_gl * depth_factor).astype(np.uint16)
            cv2.imwrite(observed_depth_file, depth_gl)

            cv2.imwrite(observed_label_file, label_gl)

            text_file = open(observed_pose_file, 'w')
            text_file.write("{}\n".format(class_idx))
            pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}" \
                .format(pose[0, 0], pose[0, 1], pose[0, 2], pose[0, 3],
                        pose[1, 0], pose[1, 1], pose[1, 2], pose[1, 3],
                        pose[2, 0], pose[2, 1], pose[2, 2], pose[2, 3])
            text_file.write(pose_str)

        print(class_name, " done")
def gen_real():
    syn_poses_dir = os.path.join(
        cur_path,
        '../data/LINEMOD_6D/LM6d_converted/LM6d_render_v1/syn_poses_single/')

    # output path
    real_root_dir = os.path.join(LINEMOD_root, 'LM6d_data_syn_light', 'data',
                                 'real')
    image_set_dir = os.path.join(LINEMOD_root, 'LM6d_data_syn_light/image_set')
    mkdir_if_missing(real_root_dir)
    mkdir_if_missing(image_set_dir)

    syn_poses_path = os.path.join(syn_poses_dir, 'LM6d_ds_v1_all_syn_pose.pkl')
    with open(syn_poses_path, 'rb') as f:
        syn_pose_dict = cPickle.load(f)

    for class_idx, class_name in enumerate(tqdm(classes)):
        if class_name == '__back_ground__':
            continue
        if class_name not in ['ape']:
            continue

        # init render machines
        brightness_ratios = [0.2, 0.25, 0.3, 0.35, 0.4]  ###################
        model_dir = os.path.join(LINEMOD_root, 'models', class_name)
        render_machine = Render_Py_Light(model_dir, K, width, height, ZNEAR,
                                         ZFAR, brightness_ratios)

        # syn_poses_path = os.path.join(syn_poses_dir, 'LM6d_v1_all_rendered_pose_{}.txt'.format(class_name))
        # syn_poses = np.loadtxt(syn_poses_path)
        # print(syn_poses.shape) # nx7
        syn_poses = syn_pose_dict[class_name]
        num_poses = syn_poses.shape[0]
        real_index_list = [
            '{}/{:06d}'.format(class_name, i + 1) for i in range(num_poses)
        ]

        real_set_path = os.path.join(
            image_set_dir,
            'real/LM6d_data_syn_train_real_{}.txt'.format(class_name))
        mkdir_if_missing(os.path.join(image_set_dir, 'real'))
        f_real_set = open(real_set_path, 'w')

        all_pair = []
        for idx, real_index in enumerate(real_index_list):
            f_real_set.write('{}\n'.format(real_index))
            # continue # just generate real set file
            prefix = real_index.split('/')[1]
            video_name = real_index.split('/')[0]

            real_dir = os.path.join(real_root_dir, class_name)
            mkdir_if_missing(real_dir)

            real_color_file = os.path.join(real_dir, prefix + "-color.png")
            real_depth_file = os.path.join(real_dir, prefix + "-depth.png")
            real_pose_file = os.path.join(real_dir, prefix + "-pose.txt")

            # real_label_file = os.path.join(real_root_dir, video_name, prefix + "-label.png")
            real_label_file = os.path.join(real_dir, prefix + "-label.png")

            if idx % 500 == 0:
                print('  ', class_name, idx, '/', len(real_index_list), ' ',
                      real_index)

            pose_quat = syn_poses[idx, :]
            pose = se3.se3_q2m(pose_quat)

            # generate random light_position
            if idx % 6 == 0:
                light_position = [1, 0, 1]
            elif idx % 6 == 1:
                light_position = [1, 1, 1]
            elif idx % 6 == 2:
                light_position = [0, 1, 1]
            elif idx % 6 == 3:
                light_position = [-1, 1, 1]
            elif idx % 6 == 4:
                light_position = [-1, 0, 1]
            elif idx % 6 == 5:
                light_position = [0, 0, 1]
            else:
                raise Exception("???")
            # print( "light_position a: {}".format(light_position))
            light_position = np.array(light_position) * 0.5
            # inverse yz
            light_position[0] += pose[0, 3]
            light_position[1] -= pose[1, 3]
            light_position[2] -= pose[2, 3]
            # print("light_position b: {}".format(light_position))

            # randomly adjust color and intensity for light_intensity
            colors = np.array([[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0],
                               [1, 0, 1], [1, 1, 0], [1, 1, 1]])
            intensity = np.random.uniform(0.9, 1.1, size=(3, ))
            colors_randk = random.randint(0, colors.shape[0] - 1)
            light_intensity = colors[colors_randk] * intensity
            # print('light intensity: ', light_intensity)

            # randomly choose a render machine
            rm_randk = random.randint(0, len(brightness_ratios) - 1)
            # print('brightness ratio:', brightness_ratios[rm_randk])
            # get render result
            rgb_gl, depth_gl = render_machine.render(se3.mat2quat(
                pose[:3, :3]),
                                                     pose[:, -1],
                                                     light_position,
                                                     light_intensity,
                                                     brightness_k=rm_randk)
            rgb_gl = rgb_gl.astype('uint8')
            # render_real label
            label_gl = np.zeros(depth_gl.shape)
            # print('depth gl:', depth_gl.shape)
            label_gl[depth_gl != 0] = 1

            # import matplotlib.pyplot as plt
            # fig = plt.figure()
            # plt.axis('off')
            # fig.add_subplot(1, 3, 1)
            # plt.imshow(rgb_gl[:, :, [2,1,0]])
            #
            # fig.add_subplot(1, 3, 2)
            # plt.imshow(depth_gl)
            #
            # fig.add_subplot(1, 3, 3)
            # plt.imshow(label_gl)
            #
            # fig.suptitle('light position: {}\n light_intensity: {}\n brightness: {}'.format(light_position, light_intensity, brightness_ratios[rm_randk]))
            # plt.show()

            cv2.imwrite(real_color_file, rgb_gl)
            depth_gl = (depth_gl * depth_factor).astype(np.uint16)
            cv2.imwrite(real_depth_file, depth_gl)

            cv2.imwrite(real_label_file, label_gl)

            text_file = open(real_pose_file, 'w')
            text_file.write("{}\n".format(class_idx))
            pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}" \
                .format(pose[0, 0], pose[0, 1], pose[0, 2], pose[0, 3],
                        pose[1, 0], pose[1, 1], pose[1, 2], pose[1, 3],
                        pose[2, 0], pose[2, 1], pose[2, 2], pose[2, 3])
            text_file.write(pose_str)

        print(class_name, " done")
Example #10
0
def gen_gt_observed():
    with open(syn_poses_path, 'rb') as f:
        syn_pose_dict = cPickle.load(f)

    for class_idx, class_name in enumerate(classes):
        if class_name == '__back_ground__':
            continue
        # uncomment here to only generate data for ape
        # if class_name not in ['ape']:
        #     continue

        # init render machines
        # brightness_ratios = [0.2, 0.25, 0.3, 0.35, 0.4] ###################
        model_dir = os.path.join(LINEMOD_syn_root, 'models/{}'.format(class_name))
        render_machine = Render_Py(model_dir, K, width, height, ZNEAR, ZFAR)

        # syn_poses_path = os.path.join(syn_poses_dir, 'LM6d_v1_all_rendered_pose_{}.txt'.format(class_name))
        # syn_poses = np.loadtxt(syn_poses_path)
        # print(syn_poses.shape) # nx7
        syn_poses = syn_pose_dict[class_name]
        num_poses = syn_poses.shape[0]
        observed_index_list = ['{}/{:06d}'.format(class_name, i+1) for i in range(num_poses)]

        # observed_set_path = os.path.join(image_set_dir, 'observed/LM_data_syn_train_observed_{}.txt'.format(class_name))
        # mkdir_if_missing(os.path.join(image_set_dir, 'observed'))
        # f_observed_set = open(observed_set_path, 'w')

        all_pair = []
        for idx, observed_index in enumerate(tqdm(observed_index_list)):
            # f_observed_set.write('{}\n'.format(observed_index))
            # continue # just generate observed set file
            prefix = observed_index.split('/')[1]
            video_name = observed_index.split('/')[0]

            gt_observed_dir = os.path.join(gt_observed_root_dir, class_name)
            mkdir_if_missing(gt_observed_dir)


            gt_observed_color_file = os.path.join(gt_observed_dir, prefix+"-color.png")
            gt_observed_depth_file = os.path.join(gt_observed_dir, prefix+"-depth.png")
            gt_observed_pose_file = os.path.join(gt_observed_dir, prefix+"-pose.txt")

            # observed_label_file = os.path.join(observed_root_dir, video_name, prefix + "-label.png")
            gt_observed_label_file = os.path.join(gt_observed_dir, prefix + "-label.png")

            pose_quat = syn_poses[idx, :]
            pose = se3.se3_q2m(pose_quat)

            # generate random light_position
            if idx%6 == 0:
                light_position = [1, 0, 1]
            elif idx%6 == 1:
                light_position = [1, 1, 1]
            elif idx%6 == 2:
                light_position = [0, 1, 1]
            elif idx%6 == 3:
                light_position = [-1, 1, 1]
            elif idx%6 == 4:
                light_position = [-1, 0, 1]
            elif idx%6 == 5:
                light_position = [0, 0, 1]
            else:
                raise Exception("???")
            # print( "light_position a: {}".format(light_position))
            light_position=np.array(light_position)*0.5
            # inverse yz
            light_position[0] += pose[0, 3]
            light_position[1] -= pose[1, 3]
            light_position[2] -= pose[2, 3]
            # print("light_position b: {}".format(light_position))

            # get render result
            rgb_gl, depth_gl = render_machine.render(pose[:3, :3], pose[:, 3], r_type='mat')
            rgb_gl = rgb_gl.astype('uint8')
            # gt_observed label
            label_gl = np.zeros(depth_gl.shape)
            # print('depth gl:', depth_gl.shape)
            label_gl[depth_gl!=0] = 1

            cv2.imwrite(gt_observed_color_file, rgb_gl)
            depth_gl = (depth_gl * depth_factor).astype(np.uint16)
            cv2.imwrite(gt_observed_depth_file, depth_gl)

            cv2.imwrite(gt_observed_label_file, label_gl)

            text_file = open(gt_observed_pose_file, 'w')
            text_file.write("{}\n".format(class_idx))
            pose_str = "{} {} {} {}\n{} {} {} {}\n{} {} {} {}" \
                .format(pose[0, 0], pose[0, 1], pose[0, 2], pose[0, 3],
                        pose[1, 0], pose[1, 1], pose[1, 2], pose[1, 3],
                        pose[2, 0], pose[2, 1], pose[2, 2], pose[2, 3])
            text_file.write(pose_str)

        print(class_name, " done")
Example #11
0
# config for renderer
width = 640
height = 480
K = np.array([[572.4114, 0, 325.2611], [0, 573.57043, 242.04899], [0, 0, 1]]) # for lm
ZNEAR = 0.25
ZFAR = 6.0

depth_factor = 1000

LINEMOD_root = os.path.join(cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_refine')
LINEMOD_syn_root = os.path.join(cur_path, '../data/LINEMOD_6D/LM6d_converted/LM6d_refine_syn')
syn_poses_path = os.path.join(LINEMOD_syn_root, 'poses/LM6d_ds_train_observed_pose_all.pkl')

# output path
gt_observed_root_dir = os.path.join(LINEMOD_syn_root, 'data', 'gt_observed')
mkdir_if_missing(gt_observed_root_dir)

def gen_gt_observed():
    with open(syn_poses_path, 'rb') as f:
        syn_pose_dict = cPickle.load(f)

    for class_idx, class_name in enumerate(classes):
        if class_name == '__back_ground__':
            continue
        # uncomment here to only generate data for ape
        # if class_name not in ['ape']:
        #     continue

        # init render machines
        # brightness_ratios = [0.2, 0.25, 0.3, 0.35, 0.4] ###################
        model_dir = os.path.join(LINEMOD_syn_root, 'models/{}'.format(class_name))