Surendradjh's picture
Update app.py
5eb1659 verified
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")