Spaces:
Running
on
Zero
Running
on
Zero
import torch | |
import numpy as np | |
def compute_mae(x1, x2, mask = None): # tensor [B, 3, H, W] | |
if mask is not None: | |
dot = torch.sum(x1 * x2 * mask, dim=1, keepdim=True) | |
dot = torch.max(torch.min(dot, torch.Tensor([1.0-1.0e-12]).cuda().float()), torch.Tensor([-1.0+1.0e-12]).cuda().float()) | |
emap = torch.abs(180 * torch.acos(dot)/np.pi) * mask | |
mae = torch.sum(emap) / torch.sum(mask) | |
return mae, emap | |
if mask is None: | |
''' | |
x1 : [B, H*W, 3] | |
x2 : [B, H*W, 3] | |
''' | |
dot = torch.sum(x1 * x2, dim=1, keepdim=True) | |
dot = torch.max(torch.min(dot, torch.Tensor([1.0-1.0e-12]).cuda().float()), torch.Tensor([-1.0+1.0e-12]).cuda().float()) | |
error = torch.abs(180 * torch.acos(dot)/np.pi) / x1.shape[1] / x1.shape[0] | |
return error | |
def compute_mae_np(x1, x2, mask = None): # numpy array [H, W, 3] | |
x1 = np.divide(x1, np.linalg.norm(x1, axis=2, keepdims=True) + 1.0e-12) | |
x2 = np.divide(x2, np.linalg.norm(x2, axis=2, keepdims=True) + 1.0e-12) | |
if mask is not None: | |
dot = np.sum(x1 * x2 * mask[:, :, np.newaxis], axis=-1, keepdims=True) | |
dot = np.maximum(np.minimum(dot, np.array([1.0-1.0e-12])), np.array([-1.0+1.0e-12])) | |
emap = np.abs(180 * np.arccos(dot)/np.pi) * mask[:, :, np.newaxis] | |
mae = np.sum(emap) / np.sum(mask) | |
return mae, emap | |
if mask is None: | |
dot = np.sum(x1 * x2, axis=-1, keepdims=True) | |
dot = np.maximum(np.minimum(dot, np.array([1.0-1.0e-12])), np.array([-1.0+1.0e-12])) | |
error = np.abs(180 * np.arccos(dot)/np.pi) | |
return error |