Path: blob/master/FaceMaskOverlay/lib/core/evaluation.py
3443 views
# ------------------------------------------------------------------------------1# Copyright (c) Microsoft2# Licensed under the MIT License.3# Created by Tianheng Cheng([email protected]), Yang Zhao4# ------------------------------------------------------------------------------56import math78import torch9import numpy as np1011from ..utils.transforms import transform_preds121314def get_preds(scores):15"""16get predictions from score maps in torch Tensor17return type: torch.LongTensor18"""19assert scores.dim() == 4, 'Score maps should be 4-dim'20maxval, idx = torch.max(scores.view(scores.size(0), scores.size(1), -1), 2)2122maxval = maxval.view(scores.size(0), scores.size(1), 1)23idx = idx.view(scores.size(0), scores.size(1), 1) + 12425preds = idx.repeat(1, 1, 2).float()2627preds[:, :, 0] = (preds[:, :, 0] - 1) % scores.size(3) + 128preds[:, :, 1] = torch.floor((preds[:, :, 1] - 1) / scores.size(3)) + 12930pred_mask = maxval.gt(0).repeat(1, 1, 2).float()31preds *= pred_mask32return preds333435def compute_nme(preds, meta):3637targets = meta['pts']38preds = preds.numpy()39target = targets.cpu().numpy()4041N = preds.shape[0]42L = preds.shape[1]43rmse = np.zeros(N)4445for i in range(N):46pts_pred, pts_gt = preds[i, ], target[i, ]47if L == 19: # aflw48interocular = meta['box_size'][i]49elif L == 29: # cofw50interocular = np.linalg.norm(pts_gt[8, ] - pts_gt[9, ])51elif L == 68: # 300w52# interocular53interocular = np.linalg.norm(pts_gt[36, ] - pts_gt[45, ])54elif L == 98:55interocular = np.linalg.norm(pts_gt[60, ] - pts_gt[72, ])56else:57raise ValueError('Number of landmarks is wrong')58rmse[i] = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) / (interocular * L)5960return rmse616263def decode_preds(output, center, scale, res):64coords = get_preds(output) # float type6566coords = coords.cpu()67# pose-processing68for n in range(coords.size(0)):69for p in range(coords.size(1)):70hm = output[n][p]71px = int(math.floor(coords[n][p][0]))72py = int(math.floor(coords[n][p][1]))73if (px > 1) and (px < res[0]) and (py > 1) and (py < res[1]):74diff = torch.Tensor([hm[py - 1][px] - hm[py - 1][px - 2], hm[py][px - 1]-hm[py - 2][px - 1]])75coords[n][p] += diff.sign() * .2576coords += 0.577preds = coords.clone()7879# Transform back80for i in range(coords.size(0)):81preds[i] = transform_preds(coords[i], center[i], scale[i], res)8283if preds.dim() < 3:84preds = preds.view(1, preds.size())8586return preds878889