File size: 3,321 Bytes
5918063
5b920f8
04f5d68
44acddd
2d15367
44acddd
c1364b9
44acddd
2244f4f
5918063
44acddd
 
736bf26
c4f2cca
 
44acddd
aeee3ba
 
 
44acddd
ff705c3
2d15367
 
4ce9948
44acddd
39e53c4
44acddd
 
4ce9948
81536c9
cb6b69f
c4f2cca
9c02022
b3619b5
c4f2cca
b3619b5
79424d9
44acddd
9c02022
16ced81
 
44acddd
2244f4f
 
 
 
c4f2cca
3ebd9c2
c4f2cca
59f0d7a
 
44acddd
c4f2cca
3ebd9c2
79424d9
 
8ff0421
8b43d65
 
0a18ced
8b43d65
e0c2ed1
 
 
 
a81cbb2
 
5b920f8
c4f2cca
9c02022
 
335c0e5
9c02022
ac75a1a
9618376
04f5d68
 
 
 
e6702de
 
aeee3ba
 
52ba617
 
 
 
 
 
 
 
aeee3ba
 
e6702de
 
 
 
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import os
import time
from fastapi import FastAPI, Request, UploadFile, HTTPException
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 mimetypes  # For determining file type

import subprocess
from pathlib import Path
from config import settings
import logging


app = FastAPI(
    title=settings.PROJECT_NAME, openapi_url=f"{settings.API_V1_STR}/openapi.json"
)

app.mount("/static", StaticFiles(directory="app/static"), name="static")
templates = Jinja2Templates(directory="app/templates")


@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, file: UploadFile):
    try:
    
        print('File name:', file.filename)
        
        input_file_path = f"app/static/{file.filename}"
        output_file_path = "app/static/output"

        # Save the uploaded file
        with open(input_file_path, "wb") as input_file:
            input_file.write(await file.read())

        # Determine the file type
        file_type, _ = mimetypes.guess_type(file.filename)
        is_video = file_type and file_type.startswith('video')

        print('Detect start')

        # Run YOLOv7 detection and save output
        subprocess.run(["python", "app/detect.py", "--conf", "0.5", "--img-size", "640", "--weights", "app/model/best.pt", "--no-trace",  
                        "--source", str(input_file_path), "--save-txt", "--save-conf", "--exist-ok", "--project", str(output_file_path)], check=True)

        print('Detect end')

        original_image_path = f"../static/{file.filename}"
        output_image_path = f"../static/output/exp/{file.filename}"
        
        print('original_image_path :', str(original_image_path))
        print('output_image_path :', str(output_image_path))
        print('is_video :', str(is_video))

        # NOTE: Open the app in Safari browser as mov file play is not supported by chrome 
        # Video file - 8a3c3d7c-fd4fb0c8.mov (kb) , 0d4498d3-d983805d.mov (3mb)- good data 
        # image file - ceaa4904-2fec7d06.jpg, 

        # if(str(is_video).lower() == "true"):
        #     time.sleep(15)

        # Render HTML using Jinja2Templates
        return templates.TemplateResponse(
            "result.html",
            {"request": request, "output_image": str(output_image_path), "is_video": str(is_video).lower()}
        )

    
    except subprocess.CalledProcessError as e:
        # Handle subprocess error (e.g., log the error, return an error response)
        print(f"Subprocess error: {e}")
        raise HTTPException(status_code=500, detail="Subprocess error")



# 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)