FaceAging-AI / main.py
parthmax24's picture
initial commit
98129a3
from fastapi import FastAPI, File, UploadFile, Form
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from fastapi.requests import Request
from helper import *
from PIL import Image
import numpy as np
import io
import cv2
import base64
app = FastAPI()
# CORS for JS frontend
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"]
)
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
def root(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.post("/convert/")
async def convert_image(file: UploadFile = File(...), conversion: str = Form(...)):
contents = await file.read()
image = Image.open(io.BytesIO(contents)).convert("RGB")
image_np = np.array(image)
faces = extract_faces_opencv(image_np)
if not faces:
return {"error": "No face detected"}
face = cv2.resize(faces[0], (256, 256)) # process only 1 face for now
if conversion == "young_to_old":
result = generate_Y2O(face)
elif conversion == "old_to_young":
result = generate_O2Y(face)
else:
return {"error": "Invalid conversion type"}
# Convert to base64
result_img = (result * 255).astype(np.uint8)
_, buffer = cv2.imencode(".png", result_img[:, :, ::-1]) # BGR to RGB
base64_img = base64.b64encode(buffer).decode("utf-8")
return {"image": base64_img}