NeuroHealth / app.py
Mikecode123's picture
Update app.py
eb052a3 verified
Raw
History Blame
2.11 kB
import torch
import torchvision.models as models
import torch.nn as nn
from fastapi import FastAPI, UploadFile, File, HTTPException
from PIL import Image
import io
import torchvision.transforms as transforms
app = FastAPI(title="Alzheimer MRI API")
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# -----------------------------
# MODEL LOADER
# -----------------------------
def load_model(path, num_classes=3):
model = models.densenet121(weights=None)
model.classifier = nn.Linear(model.classifier.in_features, num_classes)
model.load_state_dict(torch.load(path, map_location=DEVICE))
model.to(DEVICE)
model.eval()
return model
# -----------------------------
# LOAD ALL MODELS
# -----------------------------
MODELS = {
"ad_dn121": load_model("alzheimers_densenet121.pth"),
"ad_dn169": load_model("alzheimers_densenet169.pth"),
"ad_dn201": load_model("alzheimers_densenet201.pth"),
}
# -----------------------------
# IMAGE TRANSFORM
# -----------------------------
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
# -----------------------------
# PREDICTION FUNCTION
# -----------------------------
def predict(model, image_bytes):
image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
image = transform(image).unsqueeze(0).to(DEVICE)
with torch.no_grad():
outputs = model(image)
probs = torch.softmax(outputs, dim=1)
return probs[0].tolist()
# -----------------------------
# ROUTES
# -----------------------------
@app.get("/")
def home():
return {"message": "Alzheimer MRI API is running"}
@app.post("/predict")
async def predict_image(model_key: str, file: UploadFile = File(...)):
if model_key not in MODELS:
raise HTTPException(status_code=400, detail="Invalid model key")
image_bytes = await file.read()
result = predict(MODELS[model_key], image_bytes)
return {
"model": model_key,
"prediction": result
}