Abrar20's picture
Update app.py
7b651e2 verified
Raw
History Blame Contribute Delete
2.4 kB
import gradio as gr
import torch
import torch.nn as nn
import timm
from torchvision import transforms
from PIL import Image
# ------------------------ Model Definition ------------------------
class CycloneIntensityModel(nn.Module):
def __init__(self):
super().__init__()
# use the same attribute name (“model”) that your checkpoint used
self.model = timm.create_model('resnet18', pretrained=True)
in_features = self.model.fc.in_features
self.model.fc = nn.Linear(in_features, 1)
def forward(self, x):
return self.model(x)
# Instantiate & load
model = CycloneIntensityModel()
state = torch.load("cyclone_intensity.pth", map_location='cpu')
model.load_state_dict(state) # now keys “model.conv1.weight” → self.model.conv1.weight
model.eval()
# ------------------------ Transforms & Classifier ------------------------
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
def classify_cyclone(intensity: float) -> str:
if 74 <= intensity <= 95:
return "Category 1 – Some damage expected."
elif 96 <= intensity <= 110:
return "Category 2 – Extensive damage expected."
elif 111 <= intensity <= 129:
return "Category 3 – Devastating damage expected."
elif 130 <= intensity <= 156:
return "Category 4 – Catastrophic damage expected."
else:
return "Category 5 – Max-severity damage expected."
# ------------------------ Prediction fn ------------------------
def predict_intensity(img: Image.Image):
img = img.convert("RGB")
tensor = transform(img).unsqueeze(0)
with torch.no_grad():
intensity = model(tensor).item()
category = classify_cyclone(intensity)
return f"{intensity:.2f} Knots", category
# ------------------------ Gradio UI ------------------------
with gr.Blocks() as demo:
gr.Markdown("## Cyclone Intensity Predictor")
with gr.Row():
input_img = gr.Image(type="pil", label="Upload Satellite Image")
with gr.Column():
btn = gr.Button("Predict")
output_int = gr.Textbox(label="Predicted Wind Speed")
output_cat = gr.Textbox(label="Cyclone Category")
btn.click(
fn=predict_intensity,
inputs=input_img,
outputs=[output_int, output_cat]
)
if __name__=="__main__":
demo.launch()