import argparse import glob import math import subprocess import numpy as np import os import tqdm import torch import torch.nn as nn import cv2 from darkfeat import DarkFeat from utils import matching def darkfeat_pre(img, cuda): H, W = img.shape[0], img.shape[1] inp = img.copy() inp = inp.transpose(2, 0, 1) inp = torch.from_numpy(inp) inp = torch.autograd.Variable(inp).view(1, 3, H, W) if cuda: inp = inp.cuda() return inp if __name__ == '__main__': # Parse command line arguments. parser = argparse.ArgumentParser() parser.add_argument('--H', type=int, default=int(640)) parser.add_argument('--W', type=int, default=int(960)) parser.add_argument('--histeq', action='store_true') parser.add_argument('--model_path', type=str) parser.add_argument('--dataset_dir', type=str, default='/data/hyz/MID/') opt = parser.parse_args() sizer = (opt.W, opt.H) focallength_x = 4.504986436499113e+03/(6744/sizer[0]) focallength_y = 4.513311442889859e+03/(4502/sizer[1]) K = np.eye(3) K[0,0] = focallength_x K[1,1] = focallength_y K[0,2] = 3.363322177533149e+03/(6744/sizer[0])# * 0.5 K[1,2] = 2.291824660547715e+03/(4502/sizer[1])# * 0.5 Kinv = np.linalg.inv(K) Kinvt = np.transpose(Kinv) cuda = True if cuda: darkfeat = DarkFeat(opt.model_path).cuda().eval() for scene in ['Indoor', 'Outdoor']: base_save = './result/' + scene + '/' dir_base = opt.dataset_dir + '/' + scene + '/' pair_list = sorted(os.listdir(dir_base)) for pair in tqdm.tqdm(pair_list): opention = 1 if scene == 'Outdoor': pass else: if int(pair[4::]) <= 17: opention = 0 else: pass name=[] files = sorted(os.listdir(dir_base+pair)) for file_ in files: if file_.endswith('.cr2'): name.append(file_[0:9]) ISO = ['00100', '00200', '00400', '00800', '01600', '03200', '06400', '12800'] if opention == 1: Shutter_speed = ['0.005','0.01','0.025','0.05','0.17','0.5'] else: Shutter_speed = ['0.01','0.02','0.05','0.1','0.3','1'] E_GT = np.load(dir_base+pair+'/GT_Correspondence/'+'E_estimated.npy') F_GT = np.dot(np.dot(Kinvt,E_GT),Kinv) R_GT = np.load(dir_base+pair+'/GT_Correspondence/'+'R_GT.npy') t_GT = np.load(dir_base+pair+'/GT_Correspondence/'+'T_GT.npy') id0, id1 = sorted([ int(i.split('/')[-1]) for i in glob.glob(f'{dir_base+pair}/?????') ]) cnt = 0 for iso in ISO: for ex in Shutter_speed: dark_name1 = name[0] + iso+'_'+ex+'_'+scene+'.npy' dark_name2 = name[1] + iso+'_'+ex+'_'+scene+'.npy' if not opt.histeq: dst_T1_None = f'{dir_base}{pair}/{id0:05d}-npy-nohisteq/{dark_name1}' dst_T2_None = f'{dir_base}{pair}/{id1:05d}-npy-nohisteq/{dark_name2}' img1_orig_None = np.load(dst_T1_None) img2_orig_None = np.load(dst_T2_None) dir_save = base_save + pair + '/None/' img_input1 = darkfeat_pre(img1_orig_None.astype('float32')/255.0, cuda) img_input2 = darkfeat_pre(img2_orig_None.astype('float32')/255.0, cuda) else: dst_T1_histeq = f'{dir_base}{pair}/{id0:05d}-npy/{dark_name1}' dst_T2_histeq = f'{dir_base}{pair}/{id1:05d}-npy/{dark_name2}' img1_orig_histeq = np.load(dst_T1_histeq) img2_orig_histeq = np.load(dst_T2_histeq) dir_save = base_save + pair + '/HistEQ/' img_input1 = darkfeat_pre(img1_orig_histeq.astype('float32')/255.0, cuda) img_input2 = darkfeat_pre(img2_orig_histeq.astype('float32')/255.0, cuda) result1 = darkfeat({'image': img_input1}) result2 = darkfeat({'image': img_input2}) mkpts0, mkpts1, _ = matching.match_descriptors( cv2.KeyPoint_convert(result1['keypoints'].detach().cpu().float().numpy()), result1['descriptors'].detach().cpu().numpy(), cv2.KeyPoint_convert(result2['keypoints'].detach().cpu().float().numpy()), result2['descriptors'].detach().cpu().numpy(), ORB=False ) POINT_1_dir = dir_save+f'DarkFeat/POINT_1/' POINT_2_dir = dir_save+f'DarkFeat/POINT_2/' subprocess.check_output(['mkdir', '-p', POINT_1_dir]) subprocess.check_output(['mkdir', '-p', POINT_2_dir]) np.save(POINT_1_dir+dark_name1[0:-3]+'npy',mkpts0) np.save(POINT_2_dir+dark_name2[0:-3]+'npy',mkpts1)