from fastapi import FastAPI, UploadFile, File, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates import shutil import io import numpy as np from PIL import Image import tensorflow as tf from tensorflow.keras.applications.mobilenet_v2 import ( MobileNetV2, preprocess_input, decode_predictions ) app = FastAPI() templates = Jinja2Templates(directory="templates") # Load the model once model = MobileNetV2(weights="imagenet") @app.get("/", response_class=HTMLResponse) async def home(request: Request): return templates.TemplateResponse("index.html", {"request": request, "result": ""}) @app.post("/", response_class=HTMLResponse) async def upload(request: Request, file: UploadFile = File(...)): contents = await file.read() img = Image.open(io.BytesIO(contents)).resize((224, 224)).convert("RGB") img_array = np.array(img) img_array = np.expand_dims(img_array, axis=0) img_array = preprocess_input(img_array) preds = model.predict(img_array) decoded_preds = decode_predictions(preds, top=3)[0] # Combine top 3 results result_text = "\n".join( f"{label} - {confidence * 100:.2f}%" for (_, label, confidence) in decoded_preds ) return templates.TemplateResponse("index.html", { "request": request, "result": result_text })