eyeapp / app.py
Ehsanul75's picture
Create app.py
a95a3ab verified
Raw
History Blame Contribute Delete
2.4 kB
import gradio as gr
import torch
import torch.nn as nn
from torchvision import transforms
from torchvision.models import mobilenet_v2
from PIL import Image
import numpy as np
# Define device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Define classes
classes = ["Eyelid", "Normal", "Cataract", "Uveitis", "Conjunctivitis"]
num_classes = len(classes)
# Define image transformations (same as training)
data_transforms = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
# Load the trained model
def load_model():
model = mobilenet_v2(weights=None)
model.classifier[1] = nn.Linear(model.classifier[1].in_features, num_classes)
model.load_state_dict(torch.load("best_mobilenetv2.pth", map_location=device))
model = model.to(device)
model.eval()
return model
# Inference function
def predict(image):
try:
# Load model
model = load_model()
# Convert Gradio image input (numpy array) to PIL Image
if isinstance(image, np.ndarray):
image = Image.fromarray(image).convert('RGB')
else:
image = image.convert('RGB')
# Apply transformations
image = data_transforms(image).unsqueeze(0).to(device)
# Get model predictions
with torch.no_grad():
outputs = model(image)
probs = torch.softmax(outputs, dim=1).cpu().numpy()[0]
predicted_idx = np.argmax(probs)
predicted_class = classes[predicted_idx]
# Prepare output
result = {
"Predicted Class": predicted_class,
"Probabilities": {classes[i]: f"{probs[i]:.4f}" for i in range(num_classes)}
}
return result
except Exception as e:
return f"Error during prediction: {str(e)}"
# Create Gradio interface
interface = gr.Interface(
fn=predict,
inputs=gr.Image(type="pil", label="Upload Eye Image"),
outputs=gr.JSON(label="Prediction Results"),
title="Eye Disease Classification",
description="Upload an eye image to classify it as one of: Eyelid, Normal, Cataract, Uveitis, or Conjunctivitis."
)
# Launch the interface (not needed for Hugging Face Spaces, included for local testing)
if __name__ == "__main__":
interface.launch()