Image-captioner / app.py
Chand11's picture
Upload 5 files
c37e02d verified
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
})