# 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"""
Result: {label}
""" # 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("""
🩺 Pneumonia Detection from Chest X-rays
Upload a chest X-ray image to predict if the lungs are Normal or show signs of Pneumonia.
""") 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("""
Made with ❤️ by Hruthik Pavarala
""") if __name__ == "__main__": demo.launch()