skin-cancer / app.py
asmaa1's picture
Update app.py
6d41e47 verified
import tensorflow as tf
import gradio as gr
import numpy as np
from PIL import Image
from tensorflow.keras.models import load_model
# Load your trained model and label map
path="skinDiseaseDetection (1).h5"
model = load_model(path)
label_map={0: 'pigmented benign keratosis',
1: 'melanoma',
2: 'vascular lesion',
3: 'actinic keratosis',
4: 'squamous cell carcinoma',
5: 'basal cell carcinoma',
6: 'seborrheic keratosis',
7: 'dermatofibroma',
8: 'nevus'}
def predict_image(image):
"""
Predict the class of an uploaded image of a skin lesion.
Parameters:
- image: The uploaded image in PIL format.
Returns:
- predicted_class: The name of the predicted class or an error message.
- confidence: The confidence score of the prediction (0 to 1) or None.
- prediction_type: The type of prediction or an error message.
"""
if image is None:
return "Please upload an image.", None, "No Diagnosis"
# Preprocess the image
image = image.resize((100, 75)) # Resize to model's expected input size
image_array = np.asarray(image)
image_array = (image_array - np.mean(image_array)) / np.std(image_array) # Normalize
image_array = np.expand_dims(image_array, axis=0) # Add batch dimension
# Make prediction using the loaded model
predictions = model.predict(image_array)
predicted_index = np.argmax(predictions, axis=1)[0]
confidence = np.max(predictions)
predicted_class = label_map[predicted_index]
# Define classes for benign and malignant lesions
benign_classes = [
'pigmented benign keratosis',
'vascular lesion',
'actinic keratosis',
'seborrheic keratosis',
'dermatofibroma',
'nevus'
]
malignant_classes = [
'melanoma',
'squamous cell carcinoma',
'basal cell carcinoma'
]
# Determine the type of prediction
if predicted_class in benign_classes:
prediction_type = 'Benign Neoplasm'
elif predicted_class in malignant_classes:
prediction_type = 'Malignant Neoplasm'
else:
prediction_type = 'Unknown Neoplasm'
return predicted_class, float(f"{confidence:.2f}"), prediction_type # Format confidence here
# Example images and their descriptions
examples = [
["bcc.jpg"],
["d.jpg"],
["m.PNG"],
["sck.jpg"]
]
# Set up the Gradio interface
iface = gr.Interface(
fn=predict_image,
inputs=gr.Image(type="pil", label="Upload Skin Lesion Image"),
outputs=[
gr.Label(label="Predicted Class"),
gr.Number(label="Confidence Score", precision=2),
gr.Textbox(label="Diagnosis Type", interactive=False)
],
title="Skin Cancer Image Classification",
description="Upload an image of a skin lesion to predict its type and determine if the diagnosis is Benign or Malignant.",
theme="default", # Use a valid theme like "default" or "compact"
allow_flagging="never", # Optional: Disable flagging for a cleaner UI
examples=examples ,
css="""
.gradio-container {
font-family: 'Arial', sans-serif;
background-color: #ddebf7;
border-radius: 10px;
padding: 20px;
}
.gr-button {
background-color: #4CAF50;
color: white;
}
.gr-image {
border: 2px solid #ddd;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.output-textbox {
font-size: 1.2em;
text-align: center;
color: #333;
}
""",
)
# Launch the Gradio interface
iface.launch()