Surendradjh's picture
Update app.py
5eb1659 verified
Raw History Blame Contribute Delete
2.63 kB
import streamlit as st
import numpy as np
import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import cv2
from PIL import Image
import os
# Load pre-trained model
model = ResNet50(weights='imagenet')
last_conv_layer_name = 'conv5_block3_out'
# Grad-CAM function
def make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=None):
grad_model = tf.keras.models.Model(
[model.inputs],
[model.get_layer(last_conv_layer_name).output, model.output]
)
with tf.GradientTape() as tape:
conv_outputs, predictions = grad_model(img_array)
if pred_index is None:
pred_index = tf.argmax(predictions[0])
class_channel = predictions[:, pred_index]
grads = tape.gradient(class_channel, conv_outputs)
pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
conv_outputs = conv_outputs[0]
heatmap = conv_outputs @ pooled_grads[..., tf.newaxis]
heatmap = tf.squeeze(heatmap)
heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
return heatmap.numpy()
# Streamlit UI
st.title("🧠 Image Classifier + Grad-CAM Visualizer")
choice = st.selectbox(
"Select Option:",
("Upload Image", "Use Sample Image")
)
if choice == "Upload Image":
image_= st.file_uploader("📤 Upload an image (JPG, JPEG, PNG)", type=["jpg", "jpeg", "png"])
else:
image_= Image.open(r"dog.jpg").convert('RGB')
if image_ == None:
st.write("Upload Image")
else:
# Preprocess image
image_resized = image_.resize((224, 224))
x = image.img_to_array(image_resized)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
# Prediction
preds = model.predict(x)
pred_class = decode_predictions(preds, top=1)[0][0]
st.markdown(f"**Predicted:** `{pred_class[1]}` with `{pred_class[2]*100:.2f}%` confidence")
# Grad-CAM
heatmap = make_gradcam_heatmap(x, model, last_conv_layer_name)
img_cv = np.array(image_resized)
heatmap = cv2.resize(heatmap, (img_cv.shape[1], img_cv.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
superimposed_img = cv2.addWeighted(img_cv, 0.6, heatmap, 0.4, 0)
# Display images
col1, col2 = st.columns(2)
with col1:
st.image(image_resized, caption="Original Image", use_container_width=True)
with col2:
st.image(superimposed_img, caption="Grad-CAM", use_container_width=True)
# except Exception as e:
# st.write("Upload image")