def eval_freicars()

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