Fix focus endpoint crash
This commit is contained in:
17
app/main.py
17
app/main.py
@@ -1,3 +1,5 @@
|
|||||||
|
from io import BytesIO
|
||||||
|
|
||||||
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
||||||
from fastapi.responses import HTMLResponse, StreamingResponse
|
from fastapi.responses import HTMLResponse, StreamingResponse
|
||||||
from app.config import settings
|
from app.config import settings
|
||||||
@@ -113,7 +115,18 @@ async def focus(
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
payload = await file.read()
|
payload = await file.read()
|
||||||
return process_image(payload, file.filename or "upload", buffer_ratio=buffer_ratio, detector=detector)
|
result = process_image(payload, file.filename or "upload", buffer_ratio=buffer_ratio, detector=detector)
|
||||||
|
return {
|
||||||
|
"filename": result["filename"],
|
||||||
|
"detector": result["detector"],
|
||||||
|
"method": result["method"],
|
||||||
|
"buffer_ratio": result["buffer_ratio"],
|
||||||
|
"detected_bbox": result["detected_bbox"],
|
||||||
|
"square_bbox": result["square_bbox"],
|
||||||
|
"source_size": result["source_size"],
|
||||||
|
"crop_data_url": result["crop_data_url"],
|
||||||
|
"annotated_data_url": result["annotated_data_url"],
|
||||||
|
}
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
||||||
|
|
||||||
@@ -129,6 +142,6 @@ async def focus_image(
|
|||||||
try:
|
try:
|
||||||
payload = await file.read()
|
payload = await file.read()
|
||||||
result = process_image(payload, file.filename or "upload", buffer_ratio=buffer_ratio, detector=detector)
|
result = process_image(payload, file.filename or "upload", buffer_ratio=buffer_ratio, detector=detector)
|
||||||
return StreamingResponse(result["crop_bytes_io"], media_type=result["mime_type"])
|
return StreamingResponse(BytesIO(result["crop_bytes"]), media_type=result["mime_type"])
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from io import BytesIO
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@@ -91,7 +90,7 @@ def detect_face(image: np.ndarray) -> BBox | None:
|
|||||||
faces = FACE_CASCADE.detectMultiScale(gray, scaleFactor=1.08, minNeighbors=5, minSize=(24, 24))
|
faces = FACE_CASCADE.detectMultiScale(gray, scaleFactor=1.08, minNeighbors=5, minSize=(24, 24))
|
||||||
if len(faces) == 0:
|
if len(faces) == 0:
|
||||||
return None
|
return None
|
||||||
x, y, w, h = max((map(int, face) for face in faces), key=lambda rect: rect[2] * rect[3])
|
x, y, w, h = max((tuple(map(int, face)) for face in faces), key=lambda rect: rect[2] * rect[3])
|
||||||
return BBox(x=x, y=y, w=w, h=h)
|
return BBox(x=x, y=y, w=w, h=h)
|
||||||
|
|
||||||
|
|
||||||
@@ -192,5 +191,5 @@ def process_image(image_bytes: bytes, filename: str, buffer_ratio: float = 0.15,
|
|||||||
"crop_data_url": _data_url(crop_bytes, mime_type),
|
"crop_data_url": _data_url(crop_bytes, mime_type),
|
||||||
"annotated_data_url": _data_url(annotated_bytes, mime_type),
|
"annotated_data_url": _data_url(annotated_bytes, mime_type),
|
||||||
"mime_type": mime_type,
|
"mime_type": mime_type,
|
||||||
"crop_bytes_io": BytesIO(crop_bytes),
|
"crop_bytes": crop_bytes,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user