edtech07's picture
Upload folder using huggingface_hub
b0d97f3 verified
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")
]
)