leak-detection-api / api_app.py
iwin10s's picture
Upload api_app.py
bc72390 verified
Raw
History Blame Contribute Delete
1.94 kB
from fastapi import FastAPI, File, UploadFile
from transformers import ViTForImageClassification, AutoImageProcessor
from transformers import pipeline
import io
from PIL import Image
import torch
import os
# --- Setup ---
app = FastAPI()
MODEL_PATH = "."
# --- CRITICAL CHANGE: REMOVE THE try/except BLOCK TEMPORARILY ---
# The deployment will crash, but the logs will show the exact reason.
processor = AutoImageProcessor.from_pretrained(MODEL_PATH)
model = ViTForImageClassification.from_pretrained(MODEL_PATH)
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
# --- Prediction Endpoint ---
@app.post("/predict")
async def predict(file: UploadFile = File(...)):
"""Accepts an image file and returns the probability of a leak."""
try:
# 1. Read the uploaded file bytes
data = await file.read()
# 2. Open the image using PIL
img = Image.open(io.BytesIO(data)).convert("RGB")
# 3. Preprocess the image (resize, normalize)
inputs = processor(images=img, return_tensors="pt")
inputs = {k:v.to(device) for k,v in inputs.items()}
# 4. Run inference
with torch.no_grad():
outputs = model(**inputs)
# Apply softmax to get probabilities
probs = torch.softmax(outputs.logits, dim=-1).cpu().numpy()[0]
# The 'leak' label has ID 1 (based on your id2label = {0: "no_leak", 1: "leak"})
prob_leak = float(probs[1])
return {
"prediction": "leak" if prob_leak >= 0.5 else "no_leak",
"leak_probability": prob_leak
}
except Exception as e:
return {"error": str(e), "message": "Prediction failed."}
# --- Root Endpoint (for health check) ---
@app.get("/")
def home():
return {"status": "Model API is running"}