shehan16's picture
Update app.py
a2799b0
import keras
from keras.models import Model
from tensorflow.keras.applications import densenet
from keras import backend as K
import tensorflow as tf
from keras.layers import Dense, GlobalAveragePooling2D
from keras.models import Model
import numpy as np
chexnet_weights_path = "brucechou1983_CheXNet_Keras_0.3.0_weights.h5"
IMG_SIZE = 320
base = densenet.DenseNet121(weights=None,
include_top=False,
input_shape=(IMG_SIZE,IMG_SIZE,3)
)
## workaround - add dummy layer then load weights then pop dummy layer, in order to match expected shape for pretrained weights
predictions = tf.keras.layers.Dense(14, activation='sigmoid', name='predictions')(base.output)
## ,by_name=True - could save on workaround, but don't know if names will necessarily match + how to validate? - https://github.com/keras-team/keras/issues/5397
base = tf.keras.Model(inputs=base.input, outputs=predictions)
base.load_weights(chexnet_weights_path)
print("CheXNet loaded")
base.trainable=False # freeze most layers
base.training=False
base.layers.pop()
base.layers.pop()
### https://stackoverflow.com/questions/41668813/how-to-add-and-remove-new-layers-in-keras-after-loading-weights
new_model = GlobalAveragePooling2D()(base.layers[-4].output)
new_model = Dense(4, activation='softmax')(new_model)
chexnet_model = keras.Model(base.input, new_model)
### Loading Weights from the saved Weights
from keras.models import load_model
chexnet_model.load_weights('./chexnet_with_data_aug_and standardized.05.hdf5')
### User-Defined Functions for Pre-Processing
labels = ['Negative for Pneumonia',
'Typical Appearance',
'Indeterminate Appearance',
'Atypical Appearance']
def get_mean_std(inp):
sample_data = []
sample_data.append(np.array(inp))
mean = np.mean(sample_data)
std = np.std(sample_data)
return mean, std
def standardize_image(inp, preprocess=True):
"""Load and preprocess image."""
mean, std = get_mean_std(inp)
if preprocess:
inp = np.array(inp, dtype=np.float32)
inp -= mean
inp /= std
inp = np.expand_dims(inp, axis=0)
return inp
def preprocess_input(inp):
inp = standardize_image(inp, preprocess=True)
return inp
def get_prediction(inp):
prediction = chexnet_model.predict(inp)
confidences = {labels[i]: float(prediction[i]) for i in range(4)}
return confidences
def classify_image(inp):
inp = standardize_image(inp, preprocess=True)
prediction = chexnet_model.predict(inp)
confidences = {labels[i]: float(prediction[0][i]) for i in range(4)}
return confidences
### Application Code
import gradio as gr
title = "Decision Support System to Diagnose COVID-19 using Chest X-Ray"
description = """
A prototype app for classifying the four COVID-19 Pneumonia Classes, created as a Demo using Gradio and HuggingFace Spaces
. It is currently able to classify a given image as one of the following four classes: Typical Appearance, Atypical Appearance,
Indeterminate Appearance and Negative for Pneumonia. The System has an additional interpretability component to assist the user why a particular decision has been made
"""
examples = ['0a3afeef9c01.png', '65761e66de9f.png', '0bf205469ffa.png', '0c06f6f96a5a.png', '0c1ba97ad7c8.png', '0c2d323a04bf.png', '0c6b440ba98e.png', '0c7b15362352.png', '0c7e3c0eda27.png']
interpretation='default'
enable_queue=True
gr.Interface(fn=classify_image,inputs=gr.inputs.Image(shape=(320, 320)),outputs=gr.outputs.Label(num_top_classes=4),
title=title,description=description, examples=examples,interpretation=interpretation,enable_queue=enable_queue).launch()