Spaces:
Build error
Build error
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() |