from fastapi import FastAPI, Request, UploadFile from fastapi.responses import HTMLResponse, FileResponse from fastapi.templating import Jinja2Templates from pydantic import BaseModel import subprocess from pathlib import Path from app.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") 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)