--- a +++ b/eval.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, print_function + +from os import environ, getcwd +from os.path import join + +import keras +import numpy as np +import pandas as pd +import sklearn as skl +import tensorflow as tf +from keras.applications import NASNetMobile +from keras.layers import Dense, GlobalAveragePooling2D +from keras.metrics import binary_accuracy, binary_crossentropy +from keras.models import Model +from keras.optimizers import Adam +from keras.preprocessing.image import ImageDataGenerator + +from mura import Mura + +pd.set_option('display.max_rows', 20) +pd.set_option('precision', 4) +np.set_printoptions(precision=4) + +environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Shut up tensorflow! +print("tf : {}".format(tf.__version__)) +print("keras : {}".format(keras.__version__)) +print("numpy : {}".format(np.__version__)) +print("pandas : {}".format(pd.__version__)) +print("sklearn : {}".format(skl.__version__)) + +# Hyper-parameters / Globals +BATCH_SIZE = 512 # tweak to your GPUs capacity +IMG_HEIGHT = 224 # ResNetInceptionv2 & Xception like 299, ResNet50/VGG/Inception 224, NASM 331 +IMG_WIDTH = IMG_HEIGHT +CHANNELS = 3 +DIMS = (IMG_HEIGHT, IMG_WIDTH, CHANNELS) # blame theano +MODEL_TO_EVAL = './models/NASNetMobile.hdf5' +DATA_DIR = 'MURA-v1.0/' +EVAL_CSV = 'valid.csv' +EVAL_DIR = 'data/val' + +# load up our csv with validation factors +data_dir = join(getcwd(), DATA_DIR) +eval_csv = join(data_dir, EVAL_CSV) +df = pd.read_csv(eval_csv, names=['img', 'label'], header=None) +eval_imgs = df.img.values.tolist() +eval_labels = df.label.values.tolist() + +eval_datagen = ImageDataGenerator(rescale=1. / 255) +eval_generator = eval_datagen.flow_from_directory( + EVAL_DIR, class_mode='binary', shuffle=False, target_size=(IMG_HEIGHT, IMG_WIDTH), batch_size=BATCH_SIZE) +n_samples = eval_generator.samples +base_model = NASNetMobile(input_shape=DIMS, weights='imagenet', include_top=False) +x = base_model.output +x = GlobalAveragePooling2D(name='avg_pool')(x) # comment for RESNET +x = Dense(1, activation='sigmoid', name='predictions')(x) +model = Model(inputs=base_model.input, outputs=x) +model.load_weights(MODEL_TO_EVAL) +model.compile(optimizer=Adam(lr=1e-3), loss=binary_crossentropy, metrics=['binary_accuracy']) +score, acc = model.evaluate_generator(eval_generator, n_samples / BATCH_SIZE) +print(model.metrics_names) +print('==> Metrics with eval') +print("loss :{:0.4f} \t Accuracy:{:0.4f}".format(score, acc)) +y_pred = model.predict_generator(eval_generator, n_samples / BATCH_SIZE) +mura = Mura(eval_generator.filenames, y_true=eval_generator.classes, y_pred=y_pred) +print('==> Metrics with predict') +print(mura.metrics()) +print(mura.metrics_by_encounter()) +# print(mura.metrics_by_study_type())