-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevaluation.py
96 lines (63 loc) · 2.95 KB
/
evaluation.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
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from sklearn import metrics
def extract_mask(pred_arr, gt_arr, mask_arr=None):
# we want to make them into vectors
pred_vec = pred_arr.flatten()
gt_vec = gt_arr.flatten()
if mask_arr is not None:
mask_vec = mask_arr.flatten()
idx = list(np.where(mask_vec == 0)[0])
pred_vec = np.delete(pred_vec, idx)
gt_vec = np.delete(gt_vec, idx)
return pred_vec, gt_vec
def calc_auc(pred_arr, gt_arr, mask_arr=None):
pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
roc_auc = metrics.roc_auc_score(gt_vec, pred_vec)
return roc_auc
def numeric_score(pred_arr, gt_arr, kernel_size=(3,3)):
"""Computation of statistical numerical scores:
* FP = False Positives
* FN = False Negatives
* TP = True Positives
* TN = True Negatives
return: tuple (FP, FN, TP, TN)
"""
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, kernel_size)
dilated_gt_arr = cv2.dilate(gt_arr, kernel, iterations=1)
FP = np.float(np.sum(np.logical_and(pred_arr == 1, dilated_gt_arr == 0)))
FN = np.float(np.sum(np.logical_and(pred_arr == 0, gt_arr == 1)))
TP = np.float(np.sum(np.logical_and(pred_arr == 1, dilated_gt_arr == 1)))
TN = np.float(np.sum(np.logical_and(pred_arr == 0, gt_arr == 0)))
return FP, FN, TP, TN
def calc_acc(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
acc = (TP + TN) / (FP + FN + TP + TN)
return acc
def calc_sen(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
sen = TP / (FN + TP + 1e-12)
return sen
def calc_fdr(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
fdr = FP / (FP + TP + 1e-12)
return fdr
def calc_spe(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
spe = TN / (FP + TN + 1e-12)
return spe
def calc_iou(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
iou = TP / (FP + FN + TP + 1e-12)
return iou
def calc_dice(pred_arr, gt_arr, kernel_size=(3,3), mask_arr=None):
# pred_vec, gt_vec = extract_mask(pred_arr, gt_arr, mask_arr=mask_arr)
FP, FN, TP, TN = numeric_score(pred_arr, gt_arr, kernel_size)
dice = 2.0 * TP / (FP + FN + 2.0 * TP + 1e-12)
return dice