mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-15 15:45:27 +03:00
Implement face uploading API
This commit is contained in:
parent
a5b61d4c61
commit
e4210a7eb8
@ -8,6 +8,8 @@ imutils == 0.5.*
|
|||||||
joserfc == 1.0.*
|
joserfc == 1.0.*
|
||||||
pathvalidate == 3.2.*
|
pathvalidate == 3.2.*
|
||||||
markupsafe == 2.1.*
|
markupsafe == 2.1.*
|
||||||
|
python-multipart == 0.0.12
|
||||||
|
# General
|
||||||
mypy == 1.6.1
|
mypy == 1.6.1
|
||||||
numpy == 1.26.*
|
numpy == 1.26.*
|
||||||
onvif_zeep == 0.2.12
|
onvif_zeep == 0.2.12
|
||||||
|
|||||||
@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter, Request, UploadFile
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
from frigate.api.defs.tags import Tags
|
from frigate.api.defs.tags import Tags
|
||||||
|
from frigate.embeddings import EmbeddingsContext
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -12,5 +14,24 @@ router = APIRouter(tags=[Tags.events])
|
|||||||
|
|
||||||
|
|
||||||
@router.get("/faces")
|
@router.get("/faces")
|
||||||
def get_faces() -> None:
|
def get_faces():
|
||||||
return None
|
return JSONResponse(content={"message": "there are faces"})
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/faces/{name}")
|
||||||
|
async def register_face(request: Request, name: str, file: UploadFile):
|
||||||
|
#if not file.content_type.startswith("image"):
|
||||||
|
# return JSONResponse(
|
||||||
|
# status_code=400,
|
||||||
|
# content={
|
||||||
|
# "success": False,
|
||||||
|
# "message": "Only an image can be used to register a face.",
|
||||||
|
# },
|
||||||
|
# )
|
||||||
|
|
||||||
|
context: EmbeddingsContext = request.app.embeddings
|
||||||
|
context.register_face(name, await file.read())
|
||||||
|
return JSONResponse(
|
||||||
|
status_code=200,
|
||||||
|
content={"success": True, "message": "Successfully registered face."},
|
||||||
|
)
|
||||||
|
|||||||
@ -12,6 +12,7 @@ class EmbeddingsRequestEnum(Enum):
|
|||||||
embed_description = "embed_description"
|
embed_description = "embed_description"
|
||||||
embed_thumbnail = "embed_thumbnail"
|
embed_thumbnail = "embed_thumbnail"
|
||||||
generate_search = "generate_search"
|
generate_search = "generate_search"
|
||||||
|
register_face = "register_face"
|
||||||
|
|
||||||
|
|
||||||
class EmbeddingsResponder:
|
class EmbeddingsResponder:
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
"""SQLite-vec embeddings database."""
|
"""SQLite-vec embeddings database."""
|
||||||
|
|
||||||
|
import base64
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import multiprocessing as mp
|
import multiprocessing as mp
|
||||||
@ -189,6 +190,12 @@ class EmbeddingsContext:
|
|||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def register_face(self, face_name: str, image_data: bytes) -> None:
|
||||||
|
self.requestor.send_data(
|
||||||
|
EmbeddingsRequestEnum.register_face.value,
|
||||||
|
{"face_name": face_name, "image": base64.b64encode(image_data).decode("ASCII")},
|
||||||
|
)
|
||||||
|
|
||||||
def update_description(self, event_id: str, description: str) -> None:
|
def update_description(self, event_id: str, description: str) -> None:
|
||||||
self.requestor.send_data(
|
self.requestor.send_data(
|
||||||
EmbeddingsRequestEnum.embed_description.value,
|
EmbeddingsRequestEnum.embed_description.value,
|
||||||
|
|||||||
@ -109,6 +109,13 @@ class EmbeddingMaintainer(threading.Thread):
|
|||||||
return serialize(
|
return serialize(
|
||||||
self.embeddings.text_embedding([data])[0], pack=False
|
self.embeddings.text_embedding([data])[0], pack=False
|
||||||
)
|
)
|
||||||
|
elif topic == EmbeddingsRequestEnum.register_face.value:
|
||||||
|
self.embeddings.embed_face(
|
||||||
|
data["face_name"],
|
||||||
|
base64.b64decode(data["image"]),
|
||||||
|
upsert=True,
|
||||||
|
)
|
||||||
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Unable to handle embeddings request {e}")
|
logger.error(f"Unable to handle embeddings request {e}")
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user