Grad_cam / app.py
OmerFarooq's picture
Create app.py
b059e33
raw
history blame
No virus
3.76 kB
import tensorflow as tf
import matplotlib.pyplot as plt
from matplotlib.pyplot import imread
import numpy as np
from tensorflow import keras
from keras.layers import Input, Lambda, Dense, Flatten, Rescaling
from keras.models import Model
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.metrics import auc
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
from sklearn.metrics import RocCurveDisplay
from os import listdir, path
from skimage.util import random_noise
from skimage import img_as_float
import math
import cv2
import os
import PIL
import shutil
import matplotlib.cm as cm
#function for creating model
#returns model, its inputs, Xception's last conv output, the whole model's outputs
def create_model_mod():
inputs = keras.Input(shape = (160,160,3))
#normalizing pixel values
r = Rescaling(scale = 1./255)(inputs)
x = base_model(r, training = False)
gap = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1,activation = 'linear')(gap)
model = keras.Model(inputs, outputs)
model.compile(
loss = keras.losses.BinaryCrossentropy(from_logits = True),
optimizer = keras.optimizers.Adam(0.001),
metrics = ["accuracy"]
)
return model, inputs, x, outputs
def create_heatmap(model, imgs):
#predicting the images and getting the conv outputs and predictions
with tf.GradientTape() as tape:
maps, preds = model(imgs);
#computing gradients of predictions w.r.t the feature maps
grads = tape.gradient(preds, maps)
# global average pooling of each feature map
gap_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
#multiplying each pooled value with its correponding feature map
# maps = maps[0]
heatmap = maps @ gap_grads[..., tf.newaxis]
#removing the extra dimension of value 1
heatmap = tf.squeeze(heatmap)
#applying relu activation
heatmap = tf.keras.activations.relu(heatmap)
return heatmap, preds.numpy()
def superimpose_single(heatmap, img, alpha = 0.4):
heatmap = np.uint8(255 * heatmap)
# Use jet colormap to colorize heatmap
jet = cm.get_cmap("jet")
# Use RGB values of the colormap
jet_colors = jet(np.arange(256))[:, :3]
jet_heatmap = jet_colors[heatmap]
# Create an image with RGB colorized heatmap
jet_heatmap = keras.utils.array_to_img(jet_heatmap)
jet_heatmap = jet_heatmap.resize((160,160))
jet_heatmap = keras.utils.img_to_array(jet_heatmap)
# Superimpose the heatmap on original image
superimposed_img = jet_heatmap * alpha + img
# superimposed_img = keras.utils.array_to_img(superimposed_img)
return superimposed_img
def gen_grad_img_single(weights, img, alpha = 0.4):
model_mod, input, x, output = create_model_mod()
model_mod.load_weights(weights)
grad_model = Model(input, [x, output])
heatmaps, y_pred = create_heatmap(grad_model, img)
for i in range(len(y_pred)):
if y_pred[i] > 0.5: y_pred[i] = 1
else: y_pred[i] = 0
img = superimpose_single(heatmaps, img[0])
return np.array(img).astype('uint8'), y_pred
weights = "weights.h5"
img, y_pred = gen_grad_img_single(weights, img)
demo = gr.Interface(
fn = gen_grad_img_single,
inputs = gr.Image(type = "pil", shape = (224,224)),
# outputs = [gr.outputs.Label(num_top_classes = 2, label = 'Classifiaction'), gr.Textbox('infer_time', label = 'Inference Time(ms)')]
outputs = ["image", gr.Textbox('y_pred', label = 'Prediction')]
)
demo.launch()