import gradio as gr import tensorflow as tf import numpy as np from PIL import Image import os # Define the image size used for training (must match original training) img_size = 224 # Reconstruct the base model (EfficientNetB0) architecture base_model = tf.keras.applications.EfficientNetB0( include_top=False, weights=None, # IMPORTANT: Do not load imagenet weights here directly input_shape=(img_size, img_size, 3) ) # Explicitly build the base model and then load its ImageNet weights from the local file base_model.build(input_shape=(None, img_size, img_size, 3)) base_model.load_weights('efficientnetb0_notop.h5') # Load pre-downloaded ImageNet weights # Freeze base_model. The fine-tuned weights will be loaded later. base_model.trainable = False # Reconstruct the full model architecture as it was during training model = tf.keras.Sequential([ base_model, tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.BatchNormalization(), tf.keras.layers.Dense(128, activation="relu"), tf.keras.layers.Dropout(0.3), tf.keras.layers.Dense(4, activation="softmax") ]) # Build the model to create its layers and allocate memory, necessary before loading weights # Pass an example input shape (None for batch size) model.build(input_shape=(None, img_size, img_size, 3)) # Load the trained weights into the reconstructed model model.load_weights('my_model_weights.weights.h5') # This path must match the saved file name # Class mapping (assuming this is consistent from your training script) idx_to_class = {0: 'glioma', 1: 'meningioma', 2: 'notumor', 3: 'pituitary'} class_labels = list(idx_to_class.values()) def predict_image(image): img = Image.fromarray(image) img = img.resize((img_size, img_size)) img_array = np.array(img) img_array = np.expand_dims(img_array, axis=0) img_array = tf.keras.applications.efficientnet.preprocess_input(img_array) predictions = model.predict(img_array)[0] predicted_class_idx = np.argmax(predictions) predicted_class_label = class_labels[predicted_class_idx] confidence = predictions[predicted_class_idx] * 100 return predicted_class_label, f"{confidence:.2f}%" # Create the Gradio interface iface = gr.Interface( fn=predict_image, inputs=gr.Image(type="numpy", label="Upload MRI Scan"), outputs=[ gr.Textbox(label="Predicted Class"), gr.Textbox(label="Confidence") ], title="Brain Tumor MRI Classification", description="Upload an MRI scan to get a prediction for brain tumor type and confidence.", examples=[ os.path.join("/kaggle/input/brain-tumor-mri-dataset/Testing/notumor/Te-no_0015.jpg"), os.path.join("/kaggle/input/brain-tumor-mri-dataset/Testing/glioma/Te-gl_0010.jpg") ] )