manga-translator / server.py
DenisT's picture
add files
b902873
raw
history blame
2.24 kB
"""
This file contains the FastAPI application that serves the web interface and handles the API requests.
"""
import os
import io
import base64
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from starlette.requests import Request
from PIL import Image
import uvicorn
from ultralytics import YOLO
from utils.predict_bounding_boxes import predict_bounding_boxes
from utils.manga_ocr import get_text_from_images
from utils.translate_manga import translate_manga
from utils.write_text_on_image import write_text
# Load the object detection model
best_model_path = "./model_creation/runs/detect/train5"
object_detection_model = YOLO(os.path.join(best_model_path, "weights/best.pt"))
app = FastAPI()
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"]
)
# Serve static files and templates
app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/fonts", StaticFiles(directory="fonts"), name="fonts")
templates = Jinja2Templates(directory="templates")
@app.get("/")
def home(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.post("/predict")
def predict(request: dict):
image = request["image"]
# Decode base64-encoded image
image = base64.b64decode(image)
image = Image.open(io.BytesIO(image))
# Save the image
image.save("image.jpg")
# Perform object detection
result = predict_bounding_boxes(object_detection_model, "image.jpg")
# Extract text from images
text_list = get_text_from_images("./bounding_box_images")
# Translate the manga
translated_text_list = translate_manga(text_list)
# Write translation text on image
translated_image = write_text(result, translated_text_list, "image.jpg")
# Convert the image to base64
buff = io.BytesIO()
translated_image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue()).decode("utf-8")
# Clean up
os.remove("image.jpg")
os.remove("translated_image.png")
return {"image": img_str}
if __name__ == '__main__':
uvicorn.run('app:app', host='localhost', port=8000, reload=True)