-
Notifications
You must be signed in to change notification settings - Fork 7
/
utils.py
125 lines (109 loc) · 3.17 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 27 16:07:02 2018
@author: lz
"""
import time
import numpy as np
from sklearn.metrics import average_precision_score
def adjust_lr(epoch, lr, optimizer, lr_step_size=200):
lr = lr * (0.6 ** (epoch // lr_step_size))
for g in optimizer.param_groups:
g['lr'] = lr * g.get('lr_mult', 1)
def set_lr(lr, optimizer):
for g in optimizer.param_groups:
g['lr'] = lr * g.get('lr_mult', 1)
def Hamming_dist(prb, gal, prb_labels, gal_labels, calc_mAP=False):
if calc_mAP:
mAP = 0.
else:
mAP = None
pn = prb.shape[0]
gn = gal.shape[0]
t = 0
dist = np.zeros((pn, gn))
for i in range(pn):
print('\rHamming Distance %05d / %05d'%(i+1, pn), end='')
pp = np.tile(prb[i, :], (gn, 1))
t0 = time.time()
s = np.logical_xor(pp, gal)
t += time.time() - t0
dist[i, :] = np.sum( s, axis=1 )
t /= pn
print(' ... Done.')
rank = np.argsort(dist, axis=1)
cmc = np.zeros((rank.shape[1]))
for pi in range(pn):
idx = -1
for gi in range(gn):
if prb_labels[pi] == gal_labels[rank[pi, gi]]:
idx = gi
break
if idx >= 0:
cmc[idx:] += 1
if calc_mAP:
y_true = np.zeros((gn))
y_true[gal_labels == prb_labels[pi]] = 1
mAP += average_precision_score(y_true, -dist[pi, :])
cmc /= pn
if calc_mAP:
mAP /= pn
return dist, rank, cmc, mAP, t
def Euclidean_dist(prb, gal, prb_labels, gal_labels, calc_mAP=False):
if calc_mAP:
mAP = 0.
else:
mAP = None
pn = prb.shape[0]
gn = gal.shape[0]
t = 0
dist = np.zeros((pn, gn))
for i in range(pn):
t0 = time.time()
for j in range(gn):
dist[i, j] = np.sqrt(np.sum((prb[i,:]-gal[j,:])**2))
t += time.time() - t0
t /= pn
rank = np.argsort(dist, axis=1)
cmc = np.zeros((rank.shape[1]))
for pi in range(pn):
idx = -1
for gi in range(gn):
if prb_labels[pi] == gal_labels[rank[pi, gi]]:
idx = gi
break
if idx >= 0:
cmc[idx:] += 1
if calc_mAP:
y_true = np.zeros((gn))
y_true[gal_labels == prb_labels[pi]] = 1
mAP += average_precision_score(y_true, -dist[pi, :])
cmc /= pn
if calc_mAP:
mAP /= pn
return dist, rank, cmc, mAP, t
def rank_cmc_mAP(dist, prb_labels, gal_labels, calc_mAP=False):
if calc_mAP:
mAP = 0.
else:
mAP = None
pn, gn = dist.shape
rank = np.argsort(dist, axis=1)
cmc = np.zeros((rank.shape[1]))
for pi in range(pn):
idx = -1
for gi in range(gn):
if prb_labels[pi] == gal_labels[rank[pi, gi]]:
idx = gi
break
if idx >= 0:
cmc[idx:] += 1
if calc_mAP:
y_true = np.zeros((gn))
y_true[gal_labels == prb_labels[pi]] = 1
mAP += average_precision_score(y_true, -dist[pi, :])
cmc /= pn
if calc_mAP:
mAP /= pn
return rank, cmc, mAP