from fastapi import FastAPI, Request, UploadFile from fastapi.responses import HTMLResponse, FileResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel import subprocess from pathlib import Path from config import settings app = FastAPI( title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json" ) app.mount("/static", FileResponse, name="static") templates = Jinja2Templates(directory="templates") app.mount("/static", StaticFiles(directory="app/static"), name="static") templates = Jinja2Templates(directory="app/templates") class Item(BaseModel): file: UploadFile @app.get("/", response_class=HTMLResponse) async def root(request: Request): return templates.TemplateResponse("index.html", {"request": request}) @app.post("/detect", response_class=HTMLResponse) async def detect_objects(request: Request, item: Item): input_file = f"uploads/{item.file.filename}" output_file = f"static/output/{item.file.filename}" # Save the uploaded file with open(input_file, "wb") as file: file.write(item.file.file.read()) # Run YOLOv7 detection and save output subprocess.run(["python", "detect.py", "--weights", "model/best.pt", "--img-size", "640", "--source", input_file, "--save-txt", "--save-conf", "--exist-ok", "--output", output_file]) # Render HTML using Jinja2Templates return templates.TemplateResponse( "result.html", {"request": request, "original_image": f"/static/{item.file.filename}", "output_image": f"/static/output/{item.file.filename}"}, ) # Set all CORS enabled origins if settings.BACKEND_CORS_ORIGINS: app.add_middleware( CORSMiddleware, allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Start app if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8001)