Vincentqyw
update: features and matchers
a80d6bb
raw
history blame
4.88 kB
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()