support CCPG
This commit is contained in:
@@ -3,7 +3,7 @@ from time import strftime, localtime
|
||||
import numpy as np
|
||||
from utils import get_msg_mgr, mkdir
|
||||
|
||||
from .metric import mean_iou, cuda_dist, compute_ACC_mAP, evaluate_rank
|
||||
from .metric import mean_iou, cuda_dist, compute_ACC_mAP, evaluate_rank, evaluate_many
|
||||
from .re_rank import re_ranking
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ def cross_view_gallery_evaluation(feature, label, seq_type, view, dataset, metri
|
||||
def single_view_gallery_evaluation(feature, label, seq_type, view, dataset, metric):
|
||||
probe_seq_dict = {'CASIA-B': {'NM': ['nm-05', 'nm-06'], 'BG': ['bg-01', 'bg-02'], 'CL': ['cl-01', 'cl-02']},
|
||||
'OUMVLP': {'NM': ['00']},
|
||||
'CASIA-E': {'NM': ['H-scene2-nm-1', 'H-scene2-nm-2', 'L-scene2-nm-1', 'L-scene2-nm-2', 'H-scene3-nm-1', 'H-scene3-nm-2', 'L-scene3-nm-1', 'L-scene3-nm-2', 'H-scene3_s-nm-1', 'H-scene3_s-nm-2', 'L-scene3_s-nm-1', 'L-scene3_s-nm-2',],
|
||||
'CASIA-E': {'NM': ['H-scene2-nm-1', 'H-scene2-nm-2', 'L-scene2-nm-1', 'L-scene2-nm-2', 'H-scene3-nm-1', 'H-scene3-nm-2', 'L-scene3-nm-1', 'L-scene3-nm-2', 'H-scene3_s-nm-1', 'H-scene3_s-nm-2', 'L-scene3_s-nm-1', 'L-scene3_s-nm-2', ],
|
||||
'BG': ['H-scene2-bg-1', 'H-scene2-bg-2', 'L-scene2-bg-1', 'L-scene2-bg-2', 'H-scene3-bg-1', 'H-scene3-bg-2', 'L-scene3-bg-1', 'L-scene3-bg-2', 'H-scene3_s-bg-1', 'H-scene3_s-bg-2', 'L-scene3_s-bg-1', 'L-scene3_s-bg-2'],
|
||||
'CL': ['H-scene2-cl-1', 'H-scene2-cl-2', 'L-scene2-cl-1', 'L-scene2-cl-2', 'H-scene3-cl-1', 'H-scene3-cl-2', 'L-scene3-cl-1', 'L-scene3-cl-2', 'H-scene3_s-cl-1', 'H-scene3_s-cl-2', 'L-scene3_s-cl-1', 'L-scene3_s-cl-2']
|
||||
}
|
||||
@@ -280,3 +280,125 @@ def evaluate_Gait3D(data, dataset, metric='euc'):
|
||||
# print_csv_format(dataset_name, results)
|
||||
msg_mgr.log_info(results)
|
||||
return results
|
||||
|
||||
|
||||
def evaluate_CCPG(data, dataset, metric='euc'):
|
||||
msg_mgr = get_msg_mgr()
|
||||
|
||||
feature, label, seq_type, view = data['embeddings'], data['labels'], data['types'], data['views']
|
||||
|
||||
label = np.array(label)
|
||||
for i in range(len(view)):
|
||||
view[i] = view[i].split("_")[0]
|
||||
view_np = np.array(view)
|
||||
view_list = list(set(view))
|
||||
view_list.sort()
|
||||
|
||||
view_num = len(view_list)
|
||||
|
||||
probe_seq_dict = {'CCPG': [["U0_D0_BG", "U0_D0"], [
|
||||
"U3_D3"], ["U1_D0"], ["U0_D0_BG"]]}
|
||||
|
||||
gallery_seq_dict = {
|
||||
'CCPG': [["U1_D1", "U2_D2", "U3_D3"], ["U0_D3"], ["U1_D1"], ["U0_D0"]]}
|
||||
if dataset not in (probe_seq_dict or gallery_seq_dict):
|
||||
raise KeyError("DataSet %s hasn't been supported !" % dataset)
|
||||
num_rank = 5
|
||||
acc = np.zeros([len(probe_seq_dict[dataset]),
|
||||
view_num, view_num, num_rank]) - 1.
|
||||
|
||||
ap_save = []
|
||||
cmc_save = []
|
||||
minp = []
|
||||
for (p, probe_seq) in enumerate(probe_seq_dict[dataset]):
|
||||
# for gallery_seq in gallery_seq_dict[dataset]:
|
||||
gallery_seq = gallery_seq_dict[dataset][p]
|
||||
gseq_mask = np.isin(seq_type, gallery_seq)
|
||||
gallery_x = feature[gseq_mask, :]
|
||||
# print("gallery_x", gallery_x.shape)
|
||||
gallery_y = label[gseq_mask]
|
||||
gallery_view = view_np[gseq_mask]
|
||||
|
||||
pseq_mask = np.isin(seq_type, probe_seq)
|
||||
probe_x = feature[pseq_mask, :]
|
||||
probe_y = label[pseq_mask]
|
||||
probe_view = view_np[pseq_mask]
|
||||
|
||||
msg_mgr.log_info(
|
||||
("gallery length", len(gallery_y), gallery_seq, "probe length", len(probe_y), probe_seq))
|
||||
distmat = cuda_dist(probe_x, gallery_x, metric).cpu().numpy()
|
||||
# cmc, ap = evaluate(distmat, probe_y, gallery_y, probe_view, gallery_view)
|
||||
cmc, ap, inp = evaluate_many(
|
||||
distmat, probe_y, gallery_y, probe_view, gallery_view)
|
||||
ap_save.append(ap)
|
||||
cmc_save.append(cmc[0])
|
||||
minp.append(inp)
|
||||
|
||||
# print(ap_save, cmc_save)
|
||||
|
||||
msg_mgr.log_info(
|
||||
'===Rank-1 (Exclude identical-view cases for Person Re-Identification)===')
|
||||
msg_mgr.log_info('CL: %.3f,\tUP: %.3f,\tDN: %.3f,\tBG: %.3f' % (
|
||||
cmc_save[0]*100, cmc_save[1]*100, cmc_save[2]*100, cmc_save[3]*100))
|
||||
|
||||
msg_mgr.log_info(
|
||||
'===mAP (Exclude identical-view cases for Person Re-Identification)===')
|
||||
msg_mgr.log_info('CL: %.3f,\tUP: %.3f,\tDN: %.3f,\tBG: %.3f' % (
|
||||
ap_save[0]*100, ap_save[1]*100, ap_save[2]*100, ap_save[3]*100))
|
||||
|
||||
msg_mgr.log_info(
|
||||
'===mINP (Exclude identical-view cases for Person Re-Identification)===')
|
||||
msg_mgr.log_info('CL: %.3f,\tUP: %.3f,\tDN: %.3f,\tBG: %.3f' %
|
||||
(minp[0]*100, minp[1]*100, minp[2]*100, minp[3]*100))
|
||||
|
||||
for (p, probe_seq) in enumerate(probe_seq_dict[dataset]):
|
||||
# for gallery_seq in gallery_seq_dict[dataset]:
|
||||
gallery_seq = gallery_seq_dict[dataset][p]
|
||||
for (v1, probe_view) in enumerate(view_list):
|
||||
for (v2, gallery_view) in enumerate(view_list):
|
||||
gseq_mask = np.isin(seq_type, gallery_seq) & np.isin(
|
||||
view, [gallery_view])
|
||||
gallery_x = feature[gseq_mask, :]
|
||||
gallery_y = label[gseq_mask]
|
||||
|
||||
pseq_mask = np.isin(seq_type, probe_seq) & np.isin(
|
||||
view, [probe_view])
|
||||
probe_x = feature[pseq_mask, :]
|
||||
probe_y = label[pseq_mask]
|
||||
|
||||
dist = cuda_dist(probe_x, gallery_x, metric)
|
||||
idx = dist.sort(1)[1].cpu().numpy()
|
||||
# print(p, v1, v2, "\n")
|
||||
acc[p, v1, v2, :] = np.round(
|
||||
np.sum(np.cumsum(np.reshape(probe_y, [-1, 1]) == gallery_y[idx[:, 0:num_rank]], 1) > 0,
|
||||
0) * 100 / dist.shape[0], 2)
|
||||
result_dict = {}
|
||||
for i in range(1):
|
||||
msg_mgr.log_info(
|
||||
'===Rank-%d (Include identical-view cases)===' % (i + 1))
|
||||
msg_mgr.log_info('CL: %.3f,\tUP: %.3f,\tDN: %.3f,\tBG: %.3f' % (
|
||||
np.mean(acc[0, :, :, i]),
|
||||
np.mean(acc[1, :, :, i]),
|
||||
np.mean(acc[2, :, :, i]),
|
||||
np.mean(acc[3, :, :, i])))
|
||||
for i in range(1):
|
||||
msg_mgr.log_info(
|
||||
'===Rank-%d (Exclude identical-view cases)===' % (i + 1))
|
||||
msg_mgr.log_info('CL: %.3f,\tUP: %.3f,\tDN: %.3f,\tBG: %.3f' % (
|
||||
de_diag(acc[0, :, :, i]),
|
||||
de_diag(acc[1, :, :, i]),
|
||||
de_diag(acc[2, :, :, i]),
|
||||
de_diag(acc[3, :, :, i])))
|
||||
result_dict["scalar/test_accuracy/CL"] = acc[0, :, :, i]
|
||||
result_dict["scalar/test_accuracy/UP"] = acc[1, :, :, i]
|
||||
result_dict["scalar/test_accuracy/DN"] = acc[2, :, :, i]
|
||||
result_dict["scalar/test_accuracy/BG"] = acc[3, :, :, i]
|
||||
np.set_printoptions(precision=2, floatmode='fixed')
|
||||
for i in range(1):
|
||||
msg_mgr.log_info(
|
||||
'===Rank-%d of each angle (Exclude identical-view cases)===' % (i + 1))
|
||||
msg_mgr.log_info('CL: {}'.format(de_diag(acc[0, :, :, i], True)))
|
||||
msg_mgr.log_info('UP: {}'.format(de_diag(acc[1, :, :, i], True)))
|
||||
msg_mgr.log_info('DN: {}'.format(de_diag(acc[2, :, :, i], True)))
|
||||
msg_mgr.log_info('BG: {}'.format(de_diag(acc[3, :, :, i], True)))
|
||||
return result_dict
|
||||
|
||||
@@ -156,3 +156,66 @@ def evaluate_rank(distmat, p_lbls, g_lbls, max_rank=50):
|
||||
all_cmc = all_cmc.sum(0) / num_valid_p
|
||||
|
||||
return all_cmc, all_AP, all_INP
|
||||
|
||||
|
||||
def evaluate_many(distmat, q_pids, g_pids, q_camids, g_camids, max_rank=50):
|
||||
num_q, num_g = distmat.shape
|
||||
if num_g < max_rank:
|
||||
max_rank = num_g
|
||||
print("Note: number of gallery samples is quite small, got {}".format(num_g))
|
||||
indices = np.argsort(distmat, axis=1) # 对应位置变成从小到大的序号
|
||||
matches = (g_pids[indices] == q_pids[:, np.newaxis]).astype(
|
||||
np.int32) # 根据indices调整顺序 g_pids[indices]
|
||||
# print(matches)
|
||||
|
||||
# compute cmc curve for each query
|
||||
all_cmc = []
|
||||
all_AP = []
|
||||
all_INP = []
|
||||
num_valid_q = 0.
|
||||
for q_idx in range(num_q):
|
||||
# get query pid and camid
|
||||
q_pid = q_pids[q_idx]
|
||||
q_camid = q_camids[q_idx]
|
||||
|
||||
# remove gallery samples that have the same pid and camid with query
|
||||
order = indices[q_idx]
|
||||
remove = (g_pids[order] == q_pid) & (g_camids[order] == q_camid)
|
||||
keep = np.invert(remove)
|
||||
|
||||
# compute cmc curve
|
||||
# binary vector, positions with value 1 are correct matches
|
||||
orig_cmc = matches[q_idx][keep]
|
||||
if not np.any(orig_cmc):
|
||||
# this condition is true when query identity does not appear in gallery
|
||||
continue
|
||||
|
||||
cmc = orig_cmc.cumsum()
|
||||
|
||||
pos_idx = np.where(orig_cmc == 1)
|
||||
max_pos_idx = np.max(pos_idx)
|
||||
inp = cmc[max_pos_idx] / (max_pos_idx + 1.0)
|
||||
all_INP.append(inp)
|
||||
|
||||
cmc[cmc > 1] = 1
|
||||
|
||||
all_cmc.append(cmc[:max_rank])
|
||||
num_valid_q += 1.
|
||||
|
||||
# compute average precision
|
||||
# reference: https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)#Average_precision
|
||||
num_rel = orig_cmc.sum()
|
||||
tmp_cmc = orig_cmc.cumsum()
|
||||
tmp_cmc = [x / (i+1.) for i, x in enumerate(tmp_cmc)]
|
||||
tmp_cmc = np.asarray(tmp_cmc) * orig_cmc
|
||||
AP = tmp_cmc.sum() / num_rel
|
||||
all_AP.append(AP)
|
||||
|
||||
assert num_valid_q > 0, "Error: all query identities do not appear in gallery"
|
||||
|
||||
all_cmc = np.asarray(all_cmc).astype(np.float32)
|
||||
all_cmc = all_cmc.sum(0) / num_valid_q
|
||||
mAP = np.mean(all_AP)
|
||||
mINP = np.mean(all_INP)
|
||||
|
||||
return all_cmc, mAP, mINP
|
||||
|
||||
Reference in New Issue
Block a user