in c3dm/dataset/eval_zoo.py [0:0]
def eval_freicars(
cached_preds, eval_vars=None, visualize=True,
TGT_NIMS=1427, dump_dir=None
):
from dataset.dataset_configs import FREIBURG_VAL_IMAGES
cache_path = './cache/vpdr/freicars_pcl_db_eval.pth'
if not os.path.isfile(cache_path):
gt_pcl_db = load_freicar_gt_pcl_clean(cached_preds)
else:
gt_pcl_db = torch.load(cache_path)
nim = len(cached_preds['depth_path'])
if TGT_NIMS is None:
print('\n\n\n!!!! DEBUG MODE !!!!\n\n\n')
errs = []
for imi in tqdm(range(nim)):
seq_name = cached_preds['seq_name'][imi]
gt_pcl = gt_pcl_db[seq_name]['xyz']
gt_pcl_imcoord = (cached_preds['R'][imi] @ gt_pcl + \
cached_preds['T'][imi][:,None])
scale_correction = gt_pcl_db[seq_name]['scale_correction']
orig_sz = cached_preds[
'orig_image_size'][imi].type(torch.int32).tolist()
imname = cached_preds['depth_path'][imi].split('/')[-1].split('.')[0]
depth_gt, mask = load_freicar_data(imname, seq_name)
depth_gt = Fu.interpolate(depth_gt[None], size=orig_sz, mode='nearest' )[0]
mask = Fu.interpolate(mask[None], size=orig_sz, mode='nearest')[0]
# check we have a correct size
for s, s_ in zip(orig_sz, depth_gt.shape[1:]): assert s==s_
depth_pred = cached_preds['depth_dense'][imi].clone()
minscale = min(depth_pred.shape[i] / orig_sz[i-1] for i in [1, 2])
newsz = np.ceil(np.array(depth_pred.shape[1:])/minscale).astype(int).tolist()
depth_pred_up = Fu.interpolate( \
depth_pred[None], \
size=newsz, \
mode='bilinear' )[0]
depth_pred_up = depth_pred_up[:,:depth_gt.shape[1],:depth_gt.shape[2]]
depth_pred_up /= minscale
K = cached_preds['K_orig'][imi:imi+1].clone()
errs_this_im = {}
for pred_projection_type in ( 'perspective', 'orthographic'):
errs_now = eval_depth_pcl(depth_pred_up[None].clone(),
depth_gt[None].clone(),
K=K.clone(),
pred_projection_type=pred_projection_type,
gt_projection_type='perspective',
masks=mask[None],
lap_thr=0.01)
pcl_err_corrected = scale_correction * float(errs_now['dist_pcl'])
errs_this_im.update( \
{ 'EVAL_depth_scl_'+pred_projection_type: pcl_err_corrected} )
if True:
pcl_pred = cached_preds['embed_db_shape_camera_coord'][imi,:,:,0].clone()
pcl_pred /= minscale # !!!!
errs_now_pcl = eval_full_pcl( \
pcl_pred[None].clone(),
gt_pcl_imcoord[None].clone(),
K=K.clone(),
scale_best=errs_now['scale_best'], )
pcl_full_err_corrected = \
scale_correction * float(errs_now_pcl['pcl_error'])
pcl_full_err_align_corrected = \
scale_correction * float(errs_now_pcl['pcl_error_align'])
for pred_projection_type in ('perspective', 'orthographic'):
errs_this_im.update( \
{ 'EVAL_pcl_scl_'+pred_projection_type: \
pcl_full_err_corrected,
'EVAL_pcl_corr_scl_'+pred_projection_type: \
pcl_full_err_align_corrected} )
errs.append(errs_this_im)
results = {}
for med in (True, False):
for k in errs[0]:
res = torch.FloatTensor([float(err[k]) for err in errs])
res = float(res.median()) if med else float(res.mean())
results[(k+'_med') if med else k] = res
if True: # eval sparse kps
gt_kp_loc_3d = cached_preds['kp_loc_3d']
pred_kp_loc_3d = cached_preds['shape_image_coord_cal']
nrsfm_kp_loc_3d = cached_preds['nrsfm_shape_image_coord']
scale_corrs = torch.stack([
gt_pcl_db[cached_preds['seq_name'][imi]]['scale_correction']
for imi in range(nim)
])
results['EVAL_sparse_pcl'] = float(eval_sparse_pcl(
pred_kp_loc_3d, gt_kp_loc_3d, scale_corrs))
results['EVAL_sparse_pcl_nrsfm'] = float(eval_sparse_pcl(
nrsfm_kp_loc_3d, gt_kp_loc_3d, scale_corrs))
print('Freiburg Cars evaluation results:')
for k, v in results.items():
print('%20s: %1.5f' % (k,v) )
if eval_vars is not None:
for eval_var in eval_vars:
assert eval_var in results, \
'evaluation variable missing! (%s)' % eval_var
print('eval vars check ok!')
if TGT_NIMS==None:
results = { k+'_DBG':v for k, v in results.items() }
return results, None