maxsn2200's picture
Update app.py
503ce12 verified
Raw
History Blame Contribute Delete
1.88 kB
import gradio as gr
import torch
import torch.nn as nn
from torchvision import transforms, models
from PIL import Image
MODEL_PATH = 'banana_classifier.pth'
CLASS_NAMES = ['overripe', 'ripe', 'rotten', 'unripe']
IMG_SIZE = (224, 224)
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = models.efficientnet_b0(weights='IMAGENET1K_V1')
num_ftrs = model.classifier[1].in_features
model.classifier[1] = nn.Linear(num_ftrs, len(CLASS_NAMES))
model.load_state_dict(torch.load(MODEL_PATH, map_location=DEVICE))
model = model.to(DEVICE)
model.eval()
print("Model loaded and ready for prediction.")
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(IMG_SIZE),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
])
def predict_image(image: Image.Image):
try:
image = image.convert('RGB')
image_tensor = transform(image).unsqueeze(0).to(DEVICE)
with torch.no_grad():
outputs = model(image_tensor)
probs = torch.nn.functional.softmax(outputs[0], dim=0)
confidences = {CLASS_NAMES[i]: float(probs[i]) for i in range(len(CLASS_NAMES))}
return confidences
except Exception as e:
print("Error during prediction:", e)
return {"error": str(e)}
iface = gr.Interface(
fn=predict_image,
inputs=gr.Image(type="pil", label="Upload a Banana Image"),
outputs=gr.Label(num_top_classes=2, label="Prediction Results"),
title="Banana Ripeness Classifier",
description=(
"Upload an image of a banana and the model will predict its ripeness level: "
"**unripe**, **ripe**, **overripe**, or **rotten**."
),
examples=[
'2.jpg',
'1.jpeg'
],
allow_flagging="never"
)
if __name__ == "__main__":
iface.launch()