-
Notifications
You must be signed in to change notification settings - Fork 4
/
misc.py
102 lines (75 loc) · 2.55 KB
/
misc.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
import numpy as np
import os
from medpy import metric
import torch
class AvgMeter(object):
def __init__(self):
self.reset()
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
def check_mkdir(dir_name):
if not os.path.exists(dir_name):
os.makedirs(dir_name)
def _sigmoid(x):
return 1 / (1 + np.exp(-x))
def cal_precision_recall_mae(prediction, gt):
# input should be np array with data type uint8
assert prediction.dtype == np.uint8
assert gt.dtype == np.uint8
assert prediction.shape == gt.shape
eps = 1e-4
prediction = prediction / 255.
gt = gt / 255.
mae = np.mean(np.abs(prediction - gt))
hard_gt = np.zeros(prediction.shape)
hard_gt[gt > 0.5] = 1
t = np.sum(hard_gt)
precision, recall = [], []
# calculating precision and recall at 255 different binarizing thresholds
for threshold in range(256):
threshold = threshold / 255.
hard_prediction = np.zeros(prediction.shape)
hard_prediction[prediction > threshold] = 1
tp = np.sum(hard_prediction * hard_gt)
p = np.sum(hard_prediction)
precision.append((tp + eps) / (p + eps))
recall.append((tp + eps) / (t + eps))
return precision, recall, mae
def cal_fmeasure(precision, recall):
assert len(precision) == 256
assert len(recall) == 256
beta_square = 0.3
max_fmeasure = max([(1 + beta_square) * p * r / (beta_square * p + r) for p, r in zip(precision, recall)])
return max_fmeasure
def cal_Jaccard(prediction, gt):
# input should be np array with data type uint8
assert prediction.dtype == np.uint8
assert gt.dtype == np.uint8
assert prediction.shape == gt.shape
prediction = prediction / 255.
gt = gt / 255.
pred = (prediction > 0.5)
gt = (gt > 0.5)
Jaccard = metric.binary.jc(pred, gt)
return Jaccard
def cal_BER(prediction, label, thr = 127.5):
prediction = (prediction > thr)
label = (label > thr)
prediction_tmp = prediction.astype(np.float)
label_tmp = label.astype(np.float)
TP = np.sum(prediction_tmp * label_tmp)
TN = np.sum((1 - prediction_tmp) * (1 - label_tmp))
Np = np.sum(label_tmp)
Nn = np.sum((1-label_tmp))
BER = 0.5 * (2 - TP / Np - TN / Nn) * 100
shadow_BER = (1 - TP / Np) * 100
non_shadow_BER = (1 - TN / Nn) * 100
return BER, shadow_BER, non_shadow_BER