def eval_p3d()

in c3dm/dataset/eval_zoo.py [0:0]


def eval_p3d(cached_preds, eval_vars=None, visualize=False, \
			  dump_dir=None, skip_flip=False):

	nim = len(cached_preds['masks'])

	errs = []


	mesh_db = load_p3d_meshes(cached_preds)

	for imi in tqdm(range(nim)):

		gt_pcl = mesh_db[cached_preds['mesh_path'][imi]]
		gt_pcl_imcoord = (cached_preds['R'][imi] @ gt_pcl + cached_preds['T'][imi][:,None])
		
		# pcl prediction
		pcl_pred = cached_preds['embed_db_shape_camera_coord'][imi,:,:,0].clone()
		
		errs_this_im = {}
		pcl_out_this_im = {}

		for flip in (False, True):

			gt_pcl_test = gt_pcl_imcoord.clone()
			
			if skip_flip and flip:
				pass # use the previous result
			else:
				if flip: gt_pcl_test[2,:] *= -1.

				errs_now_pcl = eval_full_pcl( \
								pcl_pred[None].clone(),
								gt_pcl_test[None].clone() )
			
				pcl_full_err = float(errs_now_pcl['pcl_error'])
				pcl_full_err_align = float(errs_now_pcl['pcl_error_align'])

				errs_now = \
					{ 'EVAL_pcl_scl_detkp':      pcl_full_err,
					  'EVAL_pcl_corr_scl_detkp': pcl_full_err_align }
			
			errs_this_im[flip] = errs_now
			pcl_out_this_im[flip] = errs_now_pcl

		decvar = 'EVAL_pcl_corr_scl_detkp' # decide whether we flip based on this
		
		flip_better = errs_this_im[True][decvar] < errs_this_im[False][decvar]

		# take the better one in case of flipping
		pcl_out_this_im = pcl_out_this_im[flip_better]
		errs_this_im = errs_this_im[flip_better]
	
		if False:
			from tools.vis_utils import get_visdom_connection, \
										visdom_plotly_pointclouds
			viz = get_visdom_connection()
			from PIL import Image
			im = Image.open(cached_preds['image_path'][imi]).convert('RGB')
			im = torch.FloatTensor(np.array(im)).permute(2,0,1)
			viz.image(im, env='pcl_debug', win='im')		
			pcl_gt         = pcl_out_this_im['gt']
			pcl_pred       = pcl_out_this_im['pred']
			pcl_pred_orig  = pcl_out_this_im['pred_orig']
			pcl_pred_align = pcl_out_this_im['pred_align']
			for imii in (0,):
				show = {
					'gt':         pcl_gt[imii].view(3, -1),
					# 'pred':       pcl_pred[imii].view(3, -1),
					'pred_orig':  pcl_pred_orig[imii].view(3, -1),
					'pred_align': pcl_pred_align[imii].view(3, -1),
				}
				visdom_plotly_pointclouds( \
						viz,
						show,
						'pcl_debug',
						title='pcl_debug',
						win='pcl_debug',
						markersize=2,
						height=800,
						width=800,
					)
			import pdb; pdb.set_trace()

		errs.append(errs_this_im)

	results = {}
	for med in (False, True): # dont show the median
		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

	print('P3D 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