Ehsanul75's picture
Update app.py
1cdec30 verified
Raw
History Blame Contribute Delete
3.01 kB
import gradio as gr
import numpy as np
import cv2
import tensorflow as tf
# Load the trained model
model = tf.keras.models.load_model("vgg19_bone_fracture_model.h5")
# Preprocess uploaded image (matching your training pipeline)
def preprocess_image(image, target_size=(128, 128)):
# Convert image to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# Resize image to target size
resized = cv2.resize(gray, target_size)
# Normalize image
normalized = resized / 255.0
# Apply CLAHE (Contrast Limited Adaptive Histogram Equalization)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_clahe = clahe.apply((normalized * 255).astype(np.uint8))
# Apply Otsu thresholding
_, img_otsu = cv2.threshold(img_clahe, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Apply Canny edge detection
edges = cv2.Canny(img_otsu, 50, 150)
# Return the final image with 3 channels (for CNN input)
stacked = np.stack([normalized] * 3, axis=-1)
return np.expand_dims(stacked, axis=0)
# Prediction function
def predict(image):
input_data = preprocess_image(image)
prediction = model.predict(input_data)[0]
class_names = ['Not Fractured', 'Fractured']
# Return the prediction probabilities for each class
return {class_names[i]: float(prediction[i]) for i in range(2)}
# Gradio app with submit button and colorful interface
iface = gr.Interface(
fn=predict,
inputs=gr.Image(type="numpy", label="Upload Bone X-ray"),
outputs=gr.Label(num_top_classes=2, label="Prediction"),
title="Bone Fracture Detection (CNN Model)",
description=(
"Upload a bone X-ray image to predict whether it shows a fracture or not. "
"The model will provide the likelihood for each class: 'Fractured' or 'Not Fractured'."
),
theme="compact", # Compact layout for a cleaner design
live=False, # Disable live prediction, only after submit
allow_flagging="never", # Disable flagging
css="""
.gradio-container {
background-color: #f0f8ff; /* Light blue background */
border-radius: 15px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
.gradio-title {
color: #004b8d; /* Dark blue for title */
font-family: 'Arial', sans-serif;
}
.gradio-description {
color: #555555; /* Dark grey for description */
font-size: 16px;
}
.gradio-button {
background-color: #008cba; /* Blue button */
color: white;
font-weight: bold;
border-radius: 12px;
}
.gradio-button:hover {
background-color: #006f89; /* Darker blue on hover */
}
.gradio-output {
font-size: 18px;
font-weight: bold;
color: #008cba; /* Blue color for output */
}
""",
)
# Run the app (only for local testing)
if __name__ == "__main__":
iface.launch()