File size: 1,797 Bytes
5bd5901
 
 
 
 
 
 
 
 
 
 
870a38f
5bd5901
 
 
 
a898e11
 
5bd5901
a898e11
 
 
 
 
5bd5901
a898e11
5bd5901
 
a898e11
5bd5901
a898e11
5bd5901
92105c7
 
5bd5901
92105c7
 
 
ee4c1f6
5bd5901
a898e11
 
5bd5901
 
92105c7
5bd5901
 
92105c7
5bd5901
a898e11
5bd5901
 
a898e11
5bd5901
a898e11
5bd5901
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from fastapi import FastAPI, File, UploadFile, Form
from fastapi.responses import StreamingResponse
from fastapi.staticfiles import StaticFiles
import shutil
import cv2
import numpy as np
import dlib
from torchvision import transforms
import torch.nn.functional as F
import gradio as gr
import os
import torch
from io import BytesIO

app = FastAPI()

# Load model and necessary components
model = None

def load_model():
    global model
    from vtoonify_model import Model
    model = Model(device='cuda' if torch.cuda.is_available() else 'cpu')
    model.load_model('cartoon1')
    
# Define endpoints
@app.post("/upload/")
async def process_image(file: UploadFile = File(...), top: int = Form(...), bottom: int = Form(...), left: int = Form(...), right: int = Form(...)):
    global model
    if model is None:
        load_model()

    # Read the uploaded image file
    contents = await file.read()

    # Convert the uploaded image to numpy array
    nparr = np.frombuffer(contents, np.uint8)
    frame_rgb = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

    # Process the uploaded image
    aligned_face, instyle, message = model.detect_and_align_image(frame_rgb, top, bottom, left, right)
    processed_image, message = model.image_toonify(aligned_face, instyle, model.exstyle, style_degree=0.5, style_type='cartoon1')

    # Convert processed image to bytes
    _, encoded_image = cv2.imencode('.jpg', processed_image)

    # Return the processed image as a streaming response
    return StreamingResponse(io.BytesIO(encoded_image.tobytes()), media_type="image/jpeg")

# Mount static files directory
app.mount("/", StaticFiles(directory="AB", html=True), name="static")

# Define index route
@app.get("/")
def index():
    return FileResponse(path="/app/AB/index.html", media_type="text/html")