in dataset/eval_zoo.py [0:0]
def calc_stress_err(gt, pred, scale=1., mask=None, get_best_scale=False):
assert pred.shape[1] == 3
assert gt.shape[1] == 3
assert pred.shape[0] == gt.shape[0]
assert pred.shape[2] == gt.shape[2]
if get_best_scale:
argmin_scale = compute_best_scale(pred, gt, v=mask)
pred = pred.copy() * argmin_scale[:, None, None]
errs = []
nkp = gt.shape[2]
if mask is not None:
tridx_cache = [np.triu_indices(k, k=1)
for k in range(nkp+1)]
assert mask.shape[1] == pred.shape[2]
assert mask.shape[0] == pred.shape[0]
else:
tridx = np.triu_indices(nkp, k=1)
assert len(tridx[0]) == (nkp*(nkp-1))/2
print('stress eval:')
with tqdm(total=len(gt)) as tq:
for ii, (g_, p_) in enumerate(zip(gt, pred)):
if mask is not None:
mask_ = mask[ii]
else:
mask_ = None
edm_g = calc_edm(g_, squared=False, mask=mask_)
edm_p = calc_edm(p_, squared=False, mask=mask_)
stress = np.abs(edm_g - edm_p)
if mask_ is not None:
nkp_now = edm_g.shape[0]
assert mask_.sum() == nkp_now
tridx = tridx_cache[nkp_now]
mstress = stress[tridx[0], tridx[1]]
mstress = mstress.mean()
# if True:
# triu_mask_ = np.triu(np.ones(nkp),k=1)
# mstress_ = (stress * triu_mask_).sum() / triu_mask_.sum()
# assert np.abs(mstress - mstress_) <= 1e-3
errs.append(mstress)
tq.update(1)
errs = np.array(errs) * scale
return errs