-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy patheval.py
107 lines (87 loc) · 3.42 KB
/
eval.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
103
104
105
106
107
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
import numpy as np
import pandas as pd
import cv2
from glob import glob
from tqdm import tqdm
import tensorflow as tf
from tensorflow.keras.utils import CustomObjectScope
from sklearn.metrics import accuracy_score, f1_score, jaccard_score, precision_score, recall_score
from metrics import dice_loss, dice_coef, iou
H = 512
W = 512
def create_dir(path):
if not os.path.exists(path):
os.makedirs(path)
def read_image(path):
x = cv2.imread(path, cv2.IMREAD_COLOR)
# x = cv2.resize(x, (W, H))
ori_x = x
x = x/255.0
x = x.astype(np.float32)
return ori_x, x
def read_mask(path):
x = cv2.imread(path, cv2.IMREAD_GRAYSCALE) ## (512, 512)
# x = cv2.resize(x, (W, H))
ori_x = x
x = x/255.0
x = x.astype(np.int32)
return ori_x, x
def load_data(path):
x = sorted(glob(os.path.join(path, "image", "*.jpg")))
y = sorted(glob(os.path.join(path, "mask", "*.jpg")))
return x, y
def save_results(ori_x, ori_y, y_pred, save_image_path):
line = np.ones((H, 10, 3)) * 255
ori_y = np.expand_dims(ori_y, axis=-1)
ori_y = np.concatenate([ori_y, ori_y, ori_y], axis=-1)
y_pred = np.expand_dims(y_pred, axis=-1)
y_pred = np.concatenate([y_pred, y_pred, y_pred], axis=-1) * 255
cat_images = np.concatenate([ori_x, line, ori_y, line, y_pred], axis=1)
cv2.imwrite(save_image_path, cat_images)
if __name__ == "__main__":
""" Save the results in this folder """
create_dir("results")
""" Load the model """
with CustomObjectScope({'iou': iou, 'dice_coef': dice_coef, 'dice_loss': dice_loss}):
model = tf.keras.models.load_model("files/model.h5")
""" Load the dataset """
dataset_path = os.path.join("new_data", "test")
test_x, test_y = load_data(dataset_path)
""" Make the prediction and calculate the metrics values """
SCORE = []
for x, y in tqdm(zip(test_x, test_y), total=len(test_x)):
""" Extracting name """
name = x.split("/")[-1].split(".")[0]
""" Read the image and mask """
ori_x, x = read_image(x)
ori_y, y = read_mask(y)
""" Prediction """
y_pred = model.predict(np.expand_dims(x, axis=0))[0]
y_pred = y_pred > 0.5
y_pred = y_pred.astype(np.int32)
y_pred = np.squeeze(y_pred, axis=-1)
""" Saving the images """
save_image_path = f"results/{name}.png"
save_results(ori_x, ori_y, y_pred, save_image_path)
""" Flatten the array """
y = y.flatten()
y_pred = y_pred.flatten()
""" Calculate the metrics """
acc_value = accuracy_score(y, y_pred)
f1_value = f1_score(y, y_pred, labels=[0, 1], average="binary")
jac_value = jaccard_score(y, y_pred, labels=[0, 1], average="binary")
recall_value = recall_score(y, y_pred, labels=[0, 1], average="binary")
precision_value = precision_score(y, y_pred, labels=[0, 1], average="binary")
SCORE.append([name, acc_value, f1_value, jac_value, recall_value, precision_value])
score = [s[1:] for s in SCORE]
score = np.mean(score, axis=0)
print(f"Accuracy: {score[0]:0.5f}")
print(f"F1: {score[1]:0.5f}")
print(f"Jaccard: {score[2]:0.5f}")
print(f"Recall: {score[3]:0.5f}")
print(f"Precision: {score[4]:0.5f}")
""" Saving """
df = pd.DataFrame(SCORE, columns=["Image", "Acc", "F1", "Jaccard", "Recall", "Precision"])
df.to_csv("files/score.csv")