# import os | |
# import numpy as np | |
# from PIL import Image | |
# import cv2 | |
# from flask import Flask, request, render_template | |
# from werkzeug.utils import secure_filename | |
# from tensorflow.keras.models import load_model | |
# from gradcam_utils import generate_and_merge_heatmaps | |
# app = Flask(__name__) | |
# UPLOAD_FOLDER = 'static/uploads' | |
# HEATMAP_PATH = 'static/heatmap.jpg' | |
# os.makedirs(UPLOAD_FOLDER, exist_ok=True) | |
# app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER | |
# # Load your trained ensemble model | |
# model = load_model('ensemble_model_best(92.3).h5') | |
# # Load the three base models (if required for gradcam) | |
# from models import create_vgg19_model, create_efficientnet_model, create_densenet_model | |
# vgg_model = create_vgg19_model() | |
# efficientnet_model = create_efficientnet_model() | |
# densenet_model = create_densenet_model() | |
# print('Model loaded. Visit http://127.0.0.1:5000/') | |
# def get_className(classNo): | |
# return "Normal" if classNo == 0 else "Pneumonia" | |
# def getResult(img_path): | |
# image = cv2.imread(img_path) | |
# image = Image.fromarray(image, 'RGB') | |
# image = image.resize((224, 224)) | |
# image = np.array(image) | |
# input_img = np.expand_dims(image, axis=0) / 255.0 | |
# result = model.predict(input_img) | |
# result01 = np.argmax(result, axis=1) | |
# return result01 | |
# @app.route('/', methods=['GET']) | |
# def index(): | |
# return render_template('index.html') | |
# @app.route('/predict', methods=['POST']) | |
# def upload(): | |
# if request.method == 'POST': | |
# f = request.files['file'] | |
# filename = secure_filename(f.filename) | |
# file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) | |
# f.save(file_path) | |
# # Get prediction | |
# value = getResult(file_path) | |
# result = get_className(value[0]) | |
# # Generate Grad-CAM heatmap | |
# heatmap_img = generate_and_merge_heatmaps( | |
# file_path, vgg_model, efficientnet_model, densenet_model | |
# ) | |
# # Save heatmap image | |
# cv2.imwrite(HEATMAP_PATH, cv2.cvtColor(heatmap_img, cv2.COLOR_RGB2BGR)) | |
# return render_template( | |
# 'result.html', | |
# prediction=result, | |
# original_image=file_path, | |
# heatmap_image=HEATMAP_PATH | |
# ) | |
# return None | |
# if __name__ == '__main__': | |
# app.run(host='0.0.0.0', port=5000, debug=True) | |
# import gradio as gr | |
# import numpy as np | |
# import cv2 | |
# from PIL import Image | |
# from tensorflow.keras.models import load_model | |
# from models import create_vgg19_model, create_efficientnet_model, create_densenet_model | |
# from gradcam_utils import generate_and_merge_heatmaps | |
# # Load models | |
# ensemble_model = load_model("ensemble_model_best(92.3).h5") | |
# vgg_model = create_vgg19_model() | |
# efficientnet_model = create_efficientnet_model() | |
# densenet_model = create_densenet_model() | |
# def get_class_name(class_id): | |
# return "Normal" if class_id == 0 else "Pneumonia" | |
# def predict_and_heatmap(image): | |
# # Preprocess input image | |
# img = image.resize((224, 224)) | |
# img_array = np.array(img) / 255.0 | |
# img_array = np.expand_dims(img_array, axis=0) | |
# # Predict using ensemble model | |
# prediction = ensemble_model.predict(img_array) | |
# class_id = np.argmax(prediction[0]) | |
# result = get_class_name(class_id) | |
# # Save uploaded image temporarily | |
# temp_img_path = "temp_input.jpg" | |
# image.save(temp_img_path) | |
# # Generate Grad-CAM heatmap | |
# heatmap_img = generate_and_merge_heatmaps( | |
# temp_img_path, vgg_model, efficientnet_model, densenet_model | |
# ) | |
# return result, Image.fromarray(heatmap_img) | |
# # Gradio Interface | |
# interface = gr.Interface( | |
# fn=predict_and_heatmap, | |
# inputs=gr.Image(type="pil", label="Upload Chest X-ray"), | |
# outputs=[ | |
# gr.Label(label="Prediction"), | |
# gr.Image(label="Grad-CAM Heatmap") | |
# ], | |
# title="Pneumonia Detection Using Deep Learning", | |
# description="Upload a chest X-ray to detect Pneumonia and see the heatmap visualization (Grad-CAM)." | |
# ) | |
# if __name__ == "__main__": | |
# interface.launch() | |
import gradio as gr | |
import numpy as np | |
import tensorflow as tf | |
from tensorflow.keras.models import load_model | |
from PIL import Image | |
import os | |
from models import create_vgg19_model | |
from gradcam_utils import generate_heatmap_tf_explain | |
# Load your trained model | |
ensemble_model = load_model("ensemble_model_best(92.3).h5") | |
vgg_model = create_vgg19_model() # Only used for Grad-CAM (tf-explain) | |
# Label names | |
def get_class_name(class_id): | |
return "Normal" if class_id == 0 else "Pneumonia" | |
# Prediction + Heatmap generation | |
def predict_and_heatmap(image): | |
img = image.resize((224, 224)) | |
img_array = np.array(img) / 255.0 | |
img_array = np.expand_dims(img_array, axis=0) | |
prediction = ensemble_model.predict(img_array) | |
class_id = int(np.argmax(prediction[0])) | |
label = get_class_name(class_id) | |
result_html = f""" | |
<div style=' | |
text-align: center; | |
font-size: 1.5rem; | |
font-weight: bold; | |
color: {"green" if class_id == 0 else "red"}; | |
background-color: #f0f8ff; | |
border: 2px solid {"green" if class_id == 0 else "red"}; | |
padding: 10px; | |
border-radius: 10px; | |
width: fit-content; | |
margin: 0 auto; | |
'> | |
Result: {label} | |
</div> | |
""" | |
# Generate Grad-CAM heatmap using tf-explain (on VGG19) | |
heatmap_img = generate_heatmap_tf_explain(image, vgg_model, class_index=class_id) | |
return result_html, heatmap_img | |
# Function to load sample image | |
def load_sample(): | |
return Image.open("sample_pneumonia.jpeg") | |
# Gradio interface | |
with gr.Blocks(theme="soft") as demo: | |
gr.Markdown(""" | |
<div style="text-align: center; font-size: 2.5rem; font-weight: bold; color: #0b5394; margin-bottom: 1rem;"> | |
🩺 Pneumonia Detection from Chest X-rays | |
</div> | |
<div style="text-align: center; font-size: 1.1rem; margin-bottom: 2rem;"> | |
Upload a chest X-ray image to predict if the lungs are Normal or show signs of Pneumonia. | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=1, min_width=600): | |
image_input = gr.Image(type="pil", label="Upload Chest X-Ray", interactive=True, width=600, height=600) | |
prediction_output = gr.HTML(label="Prediction") | |
heatmap_output = gr.Image(label="Grad-CAM Heatmap", width=600, height=600) | |
with gr.Row(): | |
submit_button = gr.Button("Predict") | |
clear_button = gr.Button("Clear") | |
sample_button = gr.Button("Load Sample X-ray") | |
submit_button.click(fn=predict_and_heatmap, inputs=image_input, outputs=[prediction_output, heatmap_output]) | |
clear_button.click(fn=lambda: (None, "", None), inputs=[], outputs=[image_input, prediction_output, heatmap_output]) | |
sample_button.click(fn=load_sample, inputs=[], outputs=[image_input]) | |
gr.Markdown(""" | |
<div style="text-align: center; font-size: 0.95rem; color: #888; margin-top: 30px;"> | |
Made with ❤️ by <a href="https://github.com/hruthik733" target="_blank" style="color: #0b5394; text-decoration: none; font-weight: bold;"> | |
Hruthik Pavarala</a> | |
</div> | |
""") | |
if __name__ == "__main__": | |
demo.launch() | |