Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| from tensorflow.keras.models import load_model | |
| from PIL import Image | |
| # Load the trained model | |
| MODEL_PATH = "vgg19_fine_tuned_block5_91.keras" | |
| model = load_model(MODEL_PATH) | |
| # Define class labels and confidence threshold | |
| CLASS_LABELS = ["NORMAL", "PNEUMONIA"] | |
| CONFIDENCE_THRESHOLD = 0.7 | |
| def preprocess_image(image): | |
| img = image.convert("RGB") # Ensure the image is RGB | |
| img = img.resize((128, 128)) # Resize to model's input size | |
| img_array = np.array(img) / 255.0 # Normalize pixel values to [0, 1] | |
| img_array = np.expand_dims(img_array, axis=0) # Add batch dimension | |
| return img_array | |
| def predict_image(image): | |
| img_array = preprocess_image(image) | |
| prediction = model.predict(img_array) | |
| confidence = np.max(prediction) | |
| if confidence < CONFIDENCE_THRESHOLD: | |
| return "Uncertain: Low confidence", confidence | |
| predicted_class = CLASS_LABELS[np.argmax(prediction)] | |
| return predicted_class, confidence | |
| def acknowledge(agree): | |
| if agree: | |
| return ( | |
| gr.update(visible=True), | |
| "Thank you for acknowledging the disclaimer. You may now use the app.", | |
| ) | |
| else: | |
| return gr.update(visible=False), "You must accept the disclaimer to proceed." | |
| # Create a Gradio interface using Blocks | |
| with gr.Blocks() as app: | |
| gr.Markdown( | |
| "**Disclaimer:** This application is a student project developed as part of coursework and is intended solely for educational and experimental purposes. It is not a substitute for professional medical advice, diagnosis, or treatment. The results provided by this application should not be relied upon for medical decision-making. Use at your own discretion." | |
| ) | |
| agree = gr.Checkbox( | |
| label="I acknowledge that this application is for experimental use only and not suitable for medical purposes." | |
| ) | |
| message = gr.Textbox(interactive=False) | |
| with gr.Row(visible=False) as interface_row: | |
| image_input = gr.Image(type="pil") | |
| submit_button = gr.Button("Submit") | |
| predicted_class = gr.Textbox(label="Predicted Class") | |
| confidence = gr.Textbox(label="Confidence") | |
| submit_button.click( | |
| fn=predict_image, inputs=image_input, outputs=[predicted_class, confidence] | |
| ) | |
| agree.change(acknowledge, agree, [interface_row, message]) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| app.launch() | |