Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ db/schema.sql

db.txt

.venv
33 changes: 33 additions & 0 deletions app/service/face_embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,39 @@ async def compute_average_embedding(

return averaged.astype(float).tolist()

async def compute_event_embedding(
self,
payloads: Sequence[FaceImagePayload],
) -> dict[str, list[list[float]]]:

if not payloads:
raise AppException.bad_request(
"At least one image is required"
)

results: dict[str, list[list[float]]] = {}

for payload in payloads:
try:
image = self._decode_image(payload)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

faces: list[FaceStub] = await asyncio.to_thread(
self.face_embedding.model.get, image_rgb # type: ignore
)

results[payload["filename"]] = [
face.embedding.flatten().tolist()
for face in faces
if face.embedding is not None
]

except Exception as e:
print(f"[FaceEmbeddingService] Skipping {payload['filename']}: {e}")
results[payload["filename"]] = []

return results

def _decode_image(self, payload: FaceImagePayload) -> np.ndarray:

buffer = np.frombuffer(payload["bytes"], dtype=np.uint8)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Maya/2-ai-face-detection
Maya/3-ai-face-embedding
feat/ai_pipline
* feat/event-face-embeddings
fix/optimize-face-detection
fix/remove-redundant-face-detection
main