Implement face uploading API

This commit is contained in:
Nicolas Mowen 2024-10-22 07:46:24 -06:00
parent a5b61d4c61
commit e4210a7eb8
5 changed files with 41 additions and 3 deletions

View File

@ -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

View File

@ -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."},
)

View File

@ -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:

View File

@ -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,

View File

@ -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}")