-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEvaluator.py
97 lines (78 loc) · 3.33 KB
/
Evaluator.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
import cv2
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader
import torchvision
from torchvision.transforms import transforms
from tqdm import tqdm
import Models
import Preprocessing
import Utils
from Startup import *
from Timer import Timer
import Trainer
class BlindnessMagicDataset(Dataset):
def __init__(self, data):
self.data = data
#self.transform = Preprocessing.transform_ndarray2tensor()
self.transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.RandomRotation(10, resample=Image.BICUBIC), # Arbitrary degree value
transforms.Resize(IMG_SIZE),
transforms.ToTensor(),
# normalize the images to torchvision models specifications
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
self.col_id = self.data.columns.get_loc('id_code') # should be 0
self.col_label = self.data.columns.get_loc('diagnosis') # should be 1
def __len__(self):
return len(self.data)
def __getitem__(self, index: int):
img_name = os.path.join(INPUT_ROOT, 'train_images_t3_512', self.data.iat[index, self.col_id] + '.png')
image = Preprocessing.load_preprocessed_image(img_name)
image = Image.fromarray(image)
image = self.transform(image)
label = torch.tensor(self.data.iat[index, self.col_label])
return image, label
def evaluate(model, dl, data_length):
model.eval()
with torch.no_grad():
aug_count = 10
predictions = np.zeros(data_length, dtype=np.float)
for i in range(aug_count):
predictions_list = []
labels_list = []
for inputs, labels in dl:
inputs = inputs.to(device)
labels = labels.to(device)
output = model(inputs).squeeze(-1)
#predictions = Utils.predict_class(output)
prediction = output
predictions_list.append(prediction)
labels_list.append(labels)
all_predictions = torch.cat(predictions_list)
all_labels = torch.cat(labels_list)
predictions = predictions + all_predictions.cpu().numpy()
labels = all_labels.cpu().numpy()
predictions = predictions / aug_count
predictions = np.around(np.clip(predictions, 0, NUM_CLASSES - 1)).astype(int)
kappa_score = Utils.compute_kappa(predictions, labels)
accuracy_score = Utils.compute_accuracy(predictions, labels)
print('Evaluation Kappa: {:.4f} Accuracy: {:.4f}'.format(kappa_score, accuracy_score))
return all_predictions
def main():
train_ds, eval_ds, data_properties = Trainer.load_training_datasets()
eval_ds = BlindnessMagicDataset(eval_ds.data)
eval_dl = DataLoader(eval_ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=NUM_WORKERS)
model = Models.load_model_efficientnet(MODEL_PATH)
model.to(device)
print('Beginning evaluation')
with Timer('Finished evaluation in {}') as _:
evaluate(model, eval_dl, len(eval_ds))
if __name__ == '__main__':
main()