Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hackassin
GitHub Repository: hackassin/learnopencv
Path: blob/master/FaceMaskOverlay/lib/core/evaluation.py
3443 views
1
# ------------------------------------------------------------------------------
2
# Copyright (c) Microsoft
3
# Licensed under the MIT License.
4
# Created by Tianheng Cheng([email protected]), Yang Zhao
5
# ------------------------------------------------------------------------------
6
7
import math
8
9
import torch
10
import numpy as np
11
12
from ..utils.transforms import transform_preds
13
14
15
def get_preds(scores):
16
"""
17
get predictions from score maps in torch Tensor
18
return type: torch.LongTensor
19
"""
20
assert scores.dim() == 4, 'Score maps should be 4-dim'
21
maxval, idx = torch.max(scores.view(scores.size(0), scores.size(1), -1), 2)
22
23
maxval = maxval.view(scores.size(0), scores.size(1), 1)
24
idx = idx.view(scores.size(0), scores.size(1), 1) + 1
25
26
preds = idx.repeat(1, 1, 2).float()
27
28
preds[:, :, 0] = (preds[:, :, 0] - 1) % scores.size(3) + 1
29
preds[:, :, 1] = torch.floor((preds[:, :, 1] - 1) / scores.size(3)) + 1
30
31
pred_mask = maxval.gt(0).repeat(1, 1, 2).float()
32
preds *= pred_mask
33
return preds
34
35
36
def compute_nme(preds, meta):
37
38
targets = meta['pts']
39
preds = preds.numpy()
40
target = targets.cpu().numpy()
41
42
N = preds.shape[0]
43
L = preds.shape[1]
44
rmse = np.zeros(N)
45
46
for i in range(N):
47
pts_pred, pts_gt = preds[i, ], target[i, ]
48
if L == 19: # aflw
49
interocular = meta['box_size'][i]
50
elif L == 29: # cofw
51
interocular = np.linalg.norm(pts_gt[8, ] - pts_gt[9, ])
52
elif L == 68: # 300w
53
# interocular
54
interocular = np.linalg.norm(pts_gt[36, ] - pts_gt[45, ])
55
elif L == 98:
56
interocular = np.linalg.norm(pts_gt[60, ] - pts_gt[72, ])
57
else:
58
raise ValueError('Number of landmarks is wrong')
59
rmse[i] = np.sum(np.linalg.norm(pts_pred - pts_gt, axis=1)) / (interocular * L)
60
61
return rmse
62
63
64
def decode_preds(output, center, scale, res):
65
coords = get_preds(output) # float type
66
67
coords = coords.cpu()
68
# pose-processing
69
for n in range(coords.size(0)):
70
for p in range(coords.size(1)):
71
hm = output[n][p]
72
px = int(math.floor(coords[n][p][0]))
73
py = int(math.floor(coords[n][p][1]))
74
if (px > 1) and (px < res[0]) and (py > 1) and (py < res[1]):
75
diff = torch.Tensor([hm[py - 1][px] - hm[py - 1][px - 2], hm[py][px - 1]-hm[py - 2][px - 1]])
76
coords[n][p] += diff.sign() * .25
77
coords += 0.5
78
preds = coords.clone()
79
80
# Transform back
81
for i in range(coords.size(0)):
82
preds[i] = transform_preds(coords[i], center[i], scale[i], res)
83
84
if preds.dim() < 3:
85
preds = preds.view(1, preds.size())
86
87
return preds
88
89