24def evaluate_roc_py(distmat, q_feats, g_feats, q_pids, g_pids, q_camids, g_camids):
25 r"""Evaluation with ROC curve.
26 Key: for each query identity, its gallery images from the same camera view are discarded.
27
28 Args:
29 distmat (np.ndarray): cosine distance matrix
30 """
31 num_q, num_g = distmat.shape
32 dim = q_feats.shape[1]
33
34 index = faiss.IndexFlatL2(dim)
35 index.add(g_feats)
36
37 _, indices = index.search(q_feats, k=num_g)
38 matches = (g_pids[indices] == q_pids[:, np.newaxis]).astype(np.int32)
39
40 pos = []
41 neg = []
42 for q_idx in range(num_q):
43
44 q_pid = q_pids[q_idx]
45 q_camid = q_camids[q_idx]
46
47
48 order = indices[q_idx]
49 remove = (g_pids[order] == q_pid) & (g_camids[order] == q_camid)
50 keep = np.invert(remove)
51 raw_cmc = matches[q_idx][keep]
52
53 sort_idx = order[keep]
54
55 q_dist = distmat[q_idx]
56 ind_pos = np.where(raw_cmc == 1)[0]
57 pos.extend(q_dist[sort_idx[ind_pos]])
58
59 ind_neg = np.where(raw_cmc == 0)[0]
60 neg.extend(q_dist[sort_idx[ind_neg]])
61
62 scores = np.hstack((pos, neg))
63
64 labels = np.hstack((np.zeros(len(pos)), np.ones(len(neg))))
65 return scores, labels
66
67