File size: 2,625 Bytes
91516cd
 
 
 
 
 
 
 
2667bd1
91516cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2667bd1
 
f7bb977
 
 
 
2667bd1
f7bb977
 
2667bd1
f7bb977
5eb1659
 
 
 
2667bd1
44ddc90
 
 
 
91516cd
2667bd1
44ddc90
 
 
91516cd
2667bd1
44ddc90
 
 
 
 
 
91516cd
2667bd1
44ddc90
 
 
 
 
 
5eb1659
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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")