| from sklearn import metrics
|
| import numpy as np
|
|
|
|
|
| def parse_metric_for_print(metric_dict):
|
| if metric_dict is None:
|
| return "\n"
|
| str = "\n"
|
| str += "================================ Each dataset best metric ================================ \n"
|
| for key, value in metric_dict.items():
|
| if key != 'avg':
|
| str= str+ f"| {key}: "
|
| for k,v in value.items():
|
| str = str + f" {k}={v} "
|
| str= str+ "| \n"
|
| else:
|
| str += "============================================================================================= \n"
|
| str += "================================== Average best metric ====================================== \n"
|
| avg_dict = value
|
| for avg_key, avg_value in avg_dict.items():
|
| if avg_key == 'dataset_dict':
|
| for key,value in avg_value.items():
|
| str = str + f"| {key}: {value} | \n"
|
| else:
|
| str = str + f"| avg {avg_key}: {avg_value} | \n"
|
| str += "============================================================================================="
|
| return str
|
|
|
|
|
| def get_test_metrics(y_pred, y_true, img_names):
|
|
|
| def get_video_metrics(image, pred, label):
|
| result_dict = {}
|
| new_label = []
|
| new_pred = []
|
|
|
|
|
|
|
|
|
|
|
| for item in np.transpose(np.stack((image, pred, label)), (1, 0)):
|
|
|
| s = item[0]
|
| if '\\' in s:
|
| parts = s.split('\\')
|
| else:
|
| parts = s.split('/')
|
| vid_name = parts[-2]
|
| b = parts[-1]
|
|
|
| if vid_name not in result_dict:
|
| result_dict[vid_name] = []
|
|
|
| result_dict[vid_name].append(item)
|
| image_arr = list(result_dict.values())
|
|
|
| for video in image_arr:
|
| pred_sum = 0
|
| label_sum = 0
|
| leng = 0
|
| for frame in video:
|
| pred_sum += float(frame[1])
|
| label_sum += int(frame[2])
|
| leng += 1
|
| new_pred.append(pred_sum / leng)
|
| new_label.append(int(label_sum / leng))
|
| fpr, tpr, thresholds = metrics.roc_curve(new_label, new_pred)
|
| v_auc = metrics.auc(fpr, tpr)
|
| fnr = 1 - tpr
|
| v_eer = fpr[np.nanargmin(np.absolute((fnr - fpr)))]
|
| return v_auc, v_eer
|
|
|
| y_pred = y_pred.squeeze()
|
|
|
| y_true[y_true >= 1] = 1
|
|
|
| fpr, tpr, thresholds = metrics.roc_curve(y_true, y_pred, pos_label=1)
|
| auc = metrics.auc(fpr, tpr)
|
|
|
| fnr = 1 - tpr
|
| eer = fpr[np.nanargmin(np.absolute((fnr - fpr)))]
|
|
|
| ap = metrics.average_precision_score(y_true, y_pred)
|
|
|
| prediction_class = (y_pred > 0.5).astype(int)
|
| correct = (prediction_class == np.clip(y_true, a_min=0, a_max=1)).sum().item()
|
| acc = correct / len(prediction_class)
|
| if type(img_names[0]) is not list:
|
|
|
| v_auc, _ = get_video_metrics(img_names, y_pred, y_true)
|
| else:
|
|
|
| v_auc=auc
|
|
|
| return {'acc': acc, 'auc': auc, 'eer': eer, 'ap': ap, 'pred': y_pred, 'video_auc': v_auc, 'label': y_true}
|
|
|