diff --git a/backend/app/database/faces.py b/backend/app/database/faces.py index 7e20e8be1..b44438315 100644 --- a/backend/app/database/faces.py +++ b/backend/app/database/faces.py @@ -133,12 +133,14 @@ def db_insert_face_embeddings_by_image_id( image_id, embeddings, confidence, bbox, cluster_id ) + def get_all_face_embeddings(): conn = sqlite3.connect(DATABASE_PATH) cursor = conn.cursor() try: - cursor.execute(""" + cursor.execute( + """ SELECT f.embeddings, f.bbox, @@ -153,7 +155,8 @@ def get_all_face_embeddings(): JOIN images i ON f.image_id=i.id LEFT JOIN image_classes ic ON i.id = ic.image_id LEFT JOIN mappings m ON ic.class_id = m.class_id - """) + """ + ) results = cursor.fetchall() images_dict = {} @@ -173,7 +176,7 @@ def get_all_face_embeddings(): embeddings_json = json.loads(embeddings) bbox_json = json.loads(bbox) except json.JSONDecodeError: - continue; + continue images_dict[image_id] = { "embeddings": embeddings_json, "bbox": bbox_json, @@ -203,6 +206,7 @@ def get_all_face_embeddings(): finally: conn.close() + def db_get_faces_unassigned_clusters() -> List[Dict[str, Union[FaceId, FaceEmbedding]]]: """ Get all faces that don't have assigned clusters. diff --git a/backend/app/models/FaceDetector.py b/backend/app/models/FaceDetector.py index 3f4bb192b..4023447a2 100644 --- a/backend/app/models/FaceDetector.py +++ b/backend/app/models/FaceDetector.py @@ -51,7 +51,7 @@ def detect_faces(self, image_id: str, image_path: str, forSearch: bool = False): embedding = self.facenet.get_embedding(processed_face) embeddings.append(embedding) - if (not forSearch and embeddings): + if not forSearch and embeddings: db_insert_face_embeddings_by_image_id( image_id, embeddings, confidence=confidences, bbox=bboxes ) diff --git a/backend/app/routes/face_clusters.py b/backend/app/routes/face_clusters.py index 731dcbd67..351a7a2f0 100644 --- a/backend/app/routes/face_clusters.py +++ b/backend/app/routes/face_clusters.py @@ -255,21 +255,42 @@ def face_tagging(payload: AddSingleImageRequest): image_id = str(uuid.uuid4()) result = fd.detect_faces(image_id, image_path, forSearch=True) if not result or result["num_faces"] == 0: - return GetAllImagesResponse(success=True, message=f"Successfully retrieved {len(matches)} images", data=[]) + return GetAllImagesResponse( + success=True, + message=f"Successfully retrieved {len(matches)} images", + data=[], + ) process_face = result["processed_faces"][0] new_embedding = fn.get_embedding(process_face) images = get_all_face_embeddings() if len(images) == 0: - return GetAllImagesResponse(success=True, message=f"Successfully retrieved {len(matches)} images", data=[]) + return GetAllImagesResponse( + success=True, + message=f"Successfully retrieved {len(matches)} images", + data=[], + ) else: for image in images: max_similarity = 0 - similarity = FaceNet_util_cosine_similarity(new_embedding, image["embeddings"]) + similarity = FaceNet_util_cosine_similarity( + new_embedding, image["embeddings"] + ) max_similarity = max(max_similarity, similarity) if max_similarity >= CONFIDENCE_PERCENT: - matches.append(ImageData(id=image["id"], path=image["path"], folder_id=image["folder_id"], thumbnailPath=image["thumbnailPath"], metadata=image["metadata"], isTagged=image["isTagged"], tags=image["tags"], bboxes=image["bbox"])) + matches.append( + ImageData( + id=image["id"], + path=image["path"], + folder_id=image["folder_id"], + thumbnailPath=image["thumbnailPath"], + metadata=image["metadata"], + isTagged=image["isTagged"], + tags=image["tags"], + bboxes=image["bbox"], + ) + ) return GetAllImagesResponse( success=True, diff --git a/backend/app/schemas/images.py b/backend/app/schemas/images.py index dba0e3c80..ac1400159 100644 --- a/backend/app/schemas/images.py +++ b/backend/app/schemas/images.py @@ -38,6 +38,7 @@ class FaceTaggingResponse(BaseModel): message: str data: dict + class ImagesResponse(BaseModel): image_files: List[str] folder_path: str diff --git a/frontend/src/pages/PersonImages/PersonImages.tsx b/frontend/src/pages/PersonImages/PersonImages.tsx index 23f860688..9c9bef81d 100644 --- a/frontend/src/pages/PersonImages/PersonImages.tsx +++ b/frontend/src/pages/PersonImages/PersonImages.tsx @@ -113,7 +113,7 @@ export const PersonImages = () => { {/* Media Viewer Modal */} - {isImageViewOpen && } + {isImageViewOpen && } ); };