import os import glob import pickle from tqdm import trange import numpy as np import h5py from numpy.core.fromnumeric import reshape from .base_dumper import BaseDumper import sys ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")) sys.path.insert(0, ROOT_DIR) import utils class fmbench(BaseDumper): def get_seqs(self): data_dir = os.path.join(self.config["rawdata_dir"]) self.split_list = [] for seq in self.config["data_seq"]: cur_split_list = np.unique( np.loadtxt( os.path.join(data_dir, seq, "pairs_which_dataset.txt"), dtype=str ) ) self.split_list.append(cur_split_list) for split in cur_split_list: split_dir = os.path.join(data_dir, seq, split) dump_dir = os.path.join(self.config["feature_dump_dir"], seq, split) cur_img_seq = glob.glob(os.path.join(split_dir, "Images", "*.jpg")) cur_dump_seq = [ os.path.join(dump_dir, path.split("/")[-1]) + "_" + self.config["extractor"]["name"] + "_" + str(self.config["extractor"]["num_kpt"]) + ".hdf5" for path in cur_img_seq ] self.img_seq += cur_img_seq self.dump_seq += cur_dump_seq def format_dump_folder(self): if not os.path.exists(self.config["feature_dump_dir"]): os.mkdir(self.config["feature_dump_dir"]) for seq_index in range(len(self.config["data_seq"])): seq_dir = os.path.join( self.config["feature_dump_dir"], self.config["data_seq"][seq_index] ) if not os.path.exists(seq_dir): os.mkdir(seq_dir) for split in self.split_list[seq_index]: split_dir = os.path.join(seq_dir, split) if not os.path.exists(split_dir): os.mkdir(split_dir) def format_dump_data(self): print("Formatting data...") self.data = { "K1": [], "K2": [], "R": [], "T": [], "e": [], "f": [], "fea_path1": [], "fea_path2": [], "img_path1": [], "img_path2": [], } for seq_index in range(len(self.config["data_seq"])): seq = self.config["data_seq"][seq_index] print(seq) pair_list = np.loadtxt( os.path.join(self.config["rawdata_dir"], seq, "pairs_with_gt.txt"), dtype=float, ) which_split_list = np.loadtxt( os.path.join( self.config["rawdata_dir"], seq, "pairs_which_dataset.txt" ), dtype=str, ) for pair_index in trange(len(pair_list)): cur_pair = pair_list[pair_index] cur_split = which_split_list[pair_index] index1, index2 = int(cur_pair[0]), int(cur_pair[1]) # get intrinsic camera = np.loadtxt( os.path.join( self.config["rawdata_dir"], seq, cur_split, "Camera.txt" ), dtype=float, ) K1, K2 = camera[index1].reshape([3, 3]), camera[index2].reshape([3, 3]) # get pose pose = np.loadtxt( os.path.join( self.config["rawdata_dir"], seq, cur_split, "Poses.txt" ), dtype=float, ) pose1, pose2 = pose[index1].reshape([3, 4]), pose[index2].reshape( [3, 4] ) R1, R2, t1, t2 = ( pose1[:3, :3], pose2[:3, :3], pose1[:3, 3][:, np.newaxis], pose2[:3, 3][:, np.newaxis], ) dR = np.dot(R2, R1.T) dt = t2 - np.dot(dR, t1) dt /= np.sqrt(np.sum(dt**2)) e_gt_unnorm = np.reshape( np.matmul( np.reshape( utils.evaluation_utils.np_skew_symmetric( dt.astype("float64").reshape(1, 3) ), (3, 3), ), np.reshape(dR.astype("float64"), (3, 3)), ), (3, 3), ) e_gt = e_gt_unnorm / np.linalg.norm(e_gt_unnorm) f = cur_pair[2:].reshape([3, 3]) f_gt = f / np.linalg.norm(f) self.data["K1"].append(K1), self.data["K2"].append(K2) self.data["R"].append(dR), self.data["T"].append(dt) self.data["e"].append(e_gt), self.data["f"].append(f_gt) img_path1, img_path2 = os.path.join( seq, cur_split, "Images", str(index1).zfill(8) + ".jpg" ), os.path.join(seq, cur_split, "Images", str(index1).zfill(8) + ".jpg") fea_path1, fea_path2 = os.path.join( self.config["feature_dump_dir"], seq, cur_split, str(index1).zfill(8) + ".jpg" + "_" + self.config["extractor"]["name"] + "_" + str(self.config["extractor"]["num_kpt"]) + ".hdf5", ), os.path.join( self.config["feature_dump_dir"], seq, cur_split, str(index2).zfill(8) + ".jpg" + "_" + self.config["extractor"]["name"] + "_" + str(self.config["extractor"]["num_kpt"]) + ".hdf5", ) self.data["img_path1"].append(img_path1), self.data["img_path2"].append( img_path2 ) self.data["fea_path1"].append(fea_path1), self.data["fea_path2"].append( fea_path2 ) self.form_standard_dataset()