Spaces:
Running
Running
Synced repo using 'sync_with_huggingface' Github Action
Browse files- main.py +13 -8
- templates/index.html +19 -21
main.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
# Import Fast API
|
2 |
from fastapi import FastAPI, Request, UploadFile, File
|
3 |
from fastapi.templating import Jinja2Templates
|
4 |
-
|
5 |
|
6 |
# Import bytes
|
7 |
from io import BytesIO
|
@@ -44,14 +44,14 @@ model = YOLO(model_path)
|
|
44 |
# Index route
|
45 |
@app.get("/")
|
46 |
async def root(request: Request):
|
47 |
-
context = {"request": request}
|
48 |
# Render index.html
|
49 |
-
return templates.TemplateResponse("index.html",
|
50 |
|
51 |
|
52 |
# Upload images decorator
|
53 |
@app.post("/predict-img")
|
54 |
-
def predict_image(file: UploadFile = File(...)):
|
|
|
55 |
try:
|
56 |
# Try to read the file
|
57 |
contents = file.file.read()
|
@@ -88,8 +88,13 @@ def predict_image(file: UploadFile = File(...)):
|
|
88 |
results.save(img_bytes, "JPEG")
|
89 |
img_bytes.seek(0)
|
90 |
|
91 |
-
|
92 |
-
|
|
|
|
|
|
|
|
|
93 |
|
94 |
-
|
95 |
-
|
|
|
|
1 |
# Import Fast API
|
2 |
from fastapi import FastAPI, Request, UploadFile, File
|
3 |
from fastapi.templating import Jinja2Templates
|
4 |
+
import base64
|
5 |
|
6 |
# Import bytes
|
7 |
from io import BytesIO
|
|
|
44 |
# Index route
|
45 |
@app.get("/")
|
46 |
async def root(request: Request):
|
|
|
47 |
# Render index.html
|
48 |
+
return templates.TemplateResponse("index.html", {"request": request})
|
49 |
|
50 |
|
51 |
# Upload images decorator
|
52 |
@app.post("/predict-img")
|
53 |
+
def predict_image(request: Request, file: UploadFile = File(...)):
|
54 |
+
|
55 |
try:
|
56 |
# Try to read the file
|
57 |
contents = file.file.read()
|
|
|
88 |
results.save(img_bytes, "JPEG")
|
89 |
img_bytes.seek(0)
|
90 |
|
91 |
+
img_bytes = base64.b64encode(img_bytes.getvalue()).decode()
|
92 |
+
|
93 |
+
try:
|
94 |
+
os.remove(image)
|
95 |
+
except Exception as e:
|
96 |
+
logging.error(f"Error deleting image: {e}")
|
97 |
|
98 |
+
return templates.TemplateResponse(
|
99 |
+
"index.html", {"request": request, "img": img_bytes}
|
100 |
+
)
|
templates/index.html
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
7 |
<meta
|
8 |
name="viewport"
|
9 |
-
content="width=device-width, initial-scale=1, shrink-to-fit=
|
10 |
/>
|
11 |
|
12 |
<!-- Bootstrap CSS -->
|
@@ -23,30 +23,28 @@
|
|
23 |
crossorigin="anonymous"
|
24 |
></script>
|
25 |
|
26 |
-
<title>
|
27 |
</head>
|
28 |
<body>
|
29 |
-
<div class="
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
Upload files
|
41 |
</button>
|
42 |
-
</
|
43 |
-
</form>
|
44 |
-
<!-- Optional JavaScript; choose one of the two! -->
|
45 |
-
|
46 |
-
<!-- Option 1: Bootstrap Bundle with Popper -->
|
47 |
-
|
48 |
-
<!-- Option 2: Separate Popper and Bootstrap JS -->
|
49 |
|
|
|
|
|
|
|
|
|
|
|
50 |
<script
|
51 |
src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"
|
52 |
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
|
|
|
6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
7 |
<meta
|
8 |
name="viewport"
|
9 |
+
content="width=device-width, initial-scale=1, shrink-to-fit=yes"
|
10 |
/>
|
11 |
|
12 |
<!-- Bootstrap CSS -->
|
|
|
23 |
crossorigin="anonymous"
|
24 |
></script>
|
25 |
|
26 |
+
<title>Face detector</title>
|
27 |
</head>
|
28 |
<body>
|
29 |
+
<div class="text-center p-5">
|
30 |
+
<h2 class="text-center p-2">Face detection App</h2>
|
31 |
+
<label for="formFile" class="form-label"
|
32 |
+
>Upload file to detect faces on the image</label
|
33 |
+
>
|
34 |
+
<form method="post" action="/predict-img" enctype="multipart/form-data">
|
35 |
+
<div class="w-25 p-2 mx-auto">
|
36 |
+
<input class="form-control" type="file" id="formFile" name="file" />
|
37 |
+
</div>
|
38 |
+
<button type="submit" class="btn btn-primary mx-auto ml-4">
|
39 |
+
Detect faces
|
|
|
40 |
</button>
|
41 |
+
</form>
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
+
{% if img %}
|
44 |
+
<h2 class="text-center p-4">Predicted faces</h2>
|
45 |
+
<img src="data:image/jpeg;base64,{{ img }}" />
|
46 |
+
{% endif %}
|
47 |
+
</div>
|
48 |
<script
|
49 |
src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"
|
50 |
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
|