Spaces:
Running
Running
import argparse | |
import os | |
import numpy as np | |
import h5py | |
import cv2 | |
from numpy.core.numeric import indices | |
import pyxis as px | |
from tqdm import trange | |
import sys | |
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) | |
sys.path.insert(0, ROOT_DIR) | |
from utils import evaluation_utils,train_utils | |
parser = argparse.ArgumentParser(description='checking training data.') | |
parser.add_argument('--meta_dir', type=str, default='dataset/valid') | |
parser.add_argument('--dataset_dir', type=str, default='dataset') | |
parser.add_argument('--desc_dir', type=str, default='desc') | |
parser.add_argument('--raw_dir', type=str, default='raw_data') | |
parser.add_argument('--desc_suffix', type=str, default='_root_1000.hdf5') | |
parser.add_argument('--vis_folder',type=str,default=None) | |
args=parser.parse_args() | |
if __name__=='__main__': | |
if args.vis_folder is not None and not os.path.exists(args.vis_folder): | |
os.mkdir(args.vis_folder) | |
pair_num_list=np.loadtxt(os.path.join(args.meta_dir,'pair_num.txt'),dtype=str) | |
pair_seq_list,accu_pair_list=train_utils.parse_pair_seq(pair_num_list) | |
total_pair=int(pair_num_list[0,1]) | |
total_inlier_rate,total_corr_num,total_incorr_num=[],[],[] | |
pair_num_list=pair_num_list[1:] | |
for index in trange(total_pair): | |
seq=pair_seq_list[index] | |
index_within_seq=index-accu_pair_list[seq] | |
with h5py.File(os.path.join(args.dataset_dir,seq,'info.h5py'),'r') as data: | |
corr=data['corr'][str(index_within_seq)][()] | |
corr1,corr2=corr[:,0],corr[:,1] | |
incorr1,incorr2=data['incorr1'][str(index_within_seq)][()],data['incorr2'][str(index_within_seq)][()] | |
img_path1,img_path2=data['img_path1'][str(index_within_seq)][()][0].decode(),data['img_path2'][str(index_within_seq)][()][0].decode() | |
img_name1,img_name2=img_path1.split('/')[-1],img_path2.split('/')[-1] | |
fea_path1,fea_path2=os.path.join(args.desc_dir,seq,img_name1+args.desc_suffix),os.path.join(args.desc_dir,seq,img_name2+args.desc_suffix) | |
with h5py.File(fea_path1,'r') as fea1, h5py.File(fea_path2,'r') as fea2: | |
desc1,kpt1=fea1['descriptors'][()],fea1['keypoints'][()][:,:2] | |
desc2,kpt2=fea2['descriptors'][()],fea2['keypoints'][()][:,:2] | |
sim_mat=desc1@desc2.T | |
nn_index1,nn_index2=np.argmax(sim_mat,axis=1),np.argmax(sim_mat,axis=0) | |
mask_mutual=(nn_index2[nn_index1]==np.arange(len(nn_index1)))[corr1] | |
mask_inlier=nn_index1[corr1]==corr2 | |
mask_nn_correct=np.logical_and(mask_mutual,mask_inlier) | |
#statistics | |
total_inlier_rate.append(mask_nn_correct.mean()) | |
total_corr_num.append(len(corr1)) | |
total_incorr_num.append((len(incorr1)+len(incorr2))/2) | |
#dump visualization | |
if args.vis_folder is not None: | |
#draw corr | |
img1,img2=cv2.imread(os.path.join(args.raw_dir,img_path1)),cv2.imread(os.path.join(args.raw_dir,img_path2)) | |
corr1_pos,corr2_pos=np.take_along_axis(kpt1,corr1[:,np.newaxis],axis=0),np.take_along_axis(kpt2,corr2[:,np.newaxis],axis=0) | |
dis_corr=evaluation_utils.draw_match(img1,img2,corr1_pos,corr2_pos) | |
cv2.imwrite(os.path.join(args.vis_folder,str(index)+'.png'),dis_corr) | |
#draw incorr | |
incorr1_pos,incorr2_pos=np.take_along_axis(kpt1,incorr1[:,np.newaxis],axis=0),np.take_along_axis(kpt2,incorr2[:,np.newaxis],axis=0) | |
dis_incorr1,dis_incorr2=evaluation_utils.draw_points(img1,incorr1_pos),evaluation_utils.draw_points(img2,incorr2_pos) | |
cv2.imwrite(os.path.join(args.vis_folder,str(index)+'_incorr1.png'),dis_incorr1) | |
cv2.imwrite(os.path.join(args.vis_folder,str(index)+'_incorr2.png'),dis_incorr2) | |
print('NN matching accuracy: ',np.asarray(total_inlier_rate).mean()) | |
print('mean corr number: ',np.asarray(total_corr_num).mean()) | |
print('mean incorr number: ',np.asarray(total_incorr_num).mean()) | |