From 4ab274f5ebef9d92755e508c1fbc7fc743a27dbe Mon Sep 17 00:00:00 2001 From: cir9no <44470218+cir9no@users.noreply.github.com> Date: Sun, 26 Jan 2025 17:07:33 +0800 Subject: [PATCH] feat: add make key face photo sup --- face_recognition/face_cluster_updater.py | 4 +-- face_recognition/face_recognition_manager.py | 22 ++++++++++---- face_recognition/utils.py | 7 +++-- repo_metadata/index_worker.py | 4 +-- .../script/update_face_recognition.py | 6 ++-- repo_metadata/slow_task_handler.py | 4 +-- seafevent_server/request_handler.py | 29 +++++++++++++++++++ 7 files changed, 60 insertions(+), 16 deletions(-) diff --git a/face_recognition/face_cluster_updater.py b/face_recognition/face_cluster_updater.py index d39cee2c..b0a8903a 100644 --- a/face_recognition/face_cluster_updater.py +++ b/face_recognition/face_cluster_updater.py @@ -2,7 +2,7 @@ import json from seafevents.db import init_db_session_class -from seafevents.face_recognition.face_recognition_manager import FaceRecognitionManager +from seafevents.face_recognition.face_recognition_manager import face_recognition_manager from seafevents.repo_data import repo_data from seafevents.utils import get_opt_from_conf_or_env from seafevents.mq import get_mq @@ -12,7 +12,7 @@ class RepoFaceClusterUpdater(object): def __init__(self, config): - self._face_recognition_manager = FaceRecognitionManager(config) + self._face_recognition_manager = face_recognition_manager.init(config) self._session = init_db_session_class(config) self.mq_server = '127.0.0.1' self.mq_port = 6379 diff --git a/face_recognition/face_recognition_manager.py b/face_recognition/face_recognition_manager.py index 19211ae9..8c150521 100644 --- a/face_recognition/face_recognition_manager.py +++ b/face_recognition/face_recognition_manager.py @@ -14,23 +14,28 @@ from seafevents.face_recognition.constants import UNKNOWN_PEOPLE_NAME from seafevents.face_recognition.utils import get_faces_rows, get_cluster_by_center, b64encode_embeddings, \ b64decode_embeddings, VECTOR_DEFAULT_FLAG, get_min_cluster_size, SUPPORTED_IMAGE_FORMATS, EMBEDDING_UPDATE_LIMIT, \ - save_cluster_face + save_cluster_face, get_image_face, save_face -from seaserv import seafile_api, get_org_id_by_repo_id +from seaserv import seafile_api logger = logging.getLogger('face_recognition') class FaceRecognitionManager(object): - def __init__(self, config): - self._db_session_class = init_db_session_class(config) - self.metadata_server_api = MetadataServerAPI('seafevents') + def __init__(self): + self._db_session_class = None + self.metadata_server_api = None self.image_embedding_api = None + def init(self, config): self._parse_config(config) def _parse_config(self, config): + self._db_session_class = init_db_session_class(config) + self.metadata_server_api = MetadataServerAPI('seafevents') + self.image_embedding_api = None + ai_section_name = 'AI' if config.has_section(ai_section_name): image_embedding_service_url = get_opt_from_conf_or_env(config, ai_section_name, 'image_embedding_service_url') @@ -257,3 +262,10 @@ def save_face_cluster_message_to_user_notification(self, repo_id, username): ["('%s', '%s', '%s', '%s', %s)" % value for value in values]) session.execute(text(sql)) session.commit() + + def update_key_face_photo(self, repo_id, people_id, obj_id): + face_image = get_image_face(repo_id, obj_id, self.image_embedding_api, center=None) + filename = f'{people_id}.jpg' + save_face(repo_id, face_image, filename, replace=True) + +face_recognition_manager = FaceRecognitionManager() diff --git a/face_recognition/utils.py b/face_recognition/utils.py index 5a5a7c4e..99ae6d1e 100644 --- a/face_recognition/utils.py +++ b/face_recognition/utils.py @@ -1,5 +1,6 @@ import base64 import os +import json import posixpath from seaserv import seafile_api @@ -80,7 +81,7 @@ def get_face_embeddings(repo_id, image_embedding_api, obj_ids): return embeddings -def get_image_face(repo_id, obj_id, image_embedding_api, center): +def get_image_face(repo_id, obj_id, image_embedding_api, center=None): result = image_embedding_api.face_embeddings(repo_id, [obj_id], True).get('data', []) if not result: return None @@ -118,10 +119,12 @@ def get_min_cluster_size(faces_num): return max(faces_num // 100, 5) -def save_face(repo_id, image, filename): +def save_face(repo_id, image, filename, replace=False): tmp_content_path = posixpath.join(FACES_TMP_DIR, filename) with open(tmp_content_path, 'wb') as f: f.write(image) + if replace: + seafile_api.del_file(repo_id, FACES_SAVE_PATH, json.dumps([filename]), 'system') seafile_api.post_file(repo_id, tmp_content_path, FACES_SAVE_PATH, filename, 'system') os.remove(tmp_content_path) diff --git a/repo_metadata/index_worker.py b/repo_metadata/index_worker.py index c6664c25..38d4af97 100644 --- a/repo_metadata/index_worker.py +++ b/repo_metadata/index_worker.py @@ -11,7 +11,7 @@ from seafevents.utils import get_opt_from_conf_or_env from seafevents.db import init_db_session_class from seafevents.repo_metadata.metadata_server_api import MetadataServerAPI -from seafevents.face_recognition.face_recognition_manager import FaceRecognitionManager +from seafevents.face_recognition.face_recognition_manager import face_recognition_manager logger = logging.getLogger(__name__) @@ -44,7 +44,7 @@ def __init__(self, config): self._parse_config(config) self.mq = get_mq(self.mq_server, self.mq_port, self.mq_password) - self.face_recognition_manager = FaceRecognitionManager(config) + self.face_recognition_manager = face_recognition_manager.init(config) self.set_signal() def _parse_config(self, config): diff --git a/repo_metadata/script/update_face_recognition.py b/repo_metadata/script/update_face_recognition.py index 516d2e3c..5c3e9018 100644 --- a/repo_metadata/script/update_face_recognition.py +++ b/repo_metadata/script/update_face_recognition.py @@ -4,7 +4,7 @@ import sys from seafevents.db import init_db_session_class -from seafevents.repo_metadata.face_recognition_manager import FaceRecognitionManager +from seafevents.face_recognition.face_recognition_manager import face_recognition_manager from seafevents.repo_metadata.utils import get_face_recognition_enabled_repo_list, get_faces_rows from seafevents.repo_metadata.constants import FACES_TABLE from seafevents.app.config import get_config @@ -88,9 +88,9 @@ def main(): seafevents_conf = os.environ.get('EVENTS_CONFIG_FILE') config = get_config(seafevents_conf) - face_recognition_manager = FaceRecognitionManager(config) + face_recog_manager = face_recognition_manager.init(config) session = init_db_session_class(config) - update_face_info(face_recognition_manager, session) + update_face_info(face_recog_manager, session) if __name__ == "__main__": diff --git a/repo_metadata/slow_task_handler.py b/repo_metadata/slow_task_handler.py index f9431c2f..5d0fc8ef 100644 --- a/repo_metadata/slow_task_handler.py +++ b/repo_metadata/slow_task_handler.py @@ -8,7 +8,7 @@ from seafevents.mq import get_mq from seafevents.utils import get_opt_from_conf_or_env from seafevents.repo_metadata.metadata_server_api import MetadataServerAPI -from seafevents.face_recognition.face_recognition_manager import FaceRecognitionManager +from seafevents.face_recognition.face_recognition_manager import face_recognition_manager from seafevents.repo_metadata.utils import add_file_details from seafevents.db import init_db_session_class @@ -21,7 +21,7 @@ class SlowTaskHandler(object): def __init__(self, config): self.metadata_server_api = MetadataServerAPI('seafevents') - self.face_recognition_manager = FaceRecognitionManager(config) + self.face_recognition_manager = face_recognition_manager.init(config) self.should_stop = threading.Event() self.mq_server = '127.0.0.1' diff --git a/seafevent_server/request_handler.py b/seafevent_server/request_handler.py index 9ddb4d64..794859ac 100644 --- a/seafevent_server/request_handler.py +++ b/seafevent_server/request_handler.py @@ -9,6 +9,7 @@ from seafevents.seasearch.index_task.index_task_manager import index_task_manager from seafevents.repo_metadata.metadata_server_api import MetadataServerAPI from seafevents.repo_metadata.utils import add_file_details +from seafevents.face_recognition.face_recognition_manager import face_recognition_manager app = Flask(__name__) logger = logging.getLogger(__name__) @@ -269,3 +270,31 @@ def add_convert_wiki_task(): return make_response((e, 500)) return {'task_id': task_id}, 200 + + +@app.route('/update-key-face-photo', methods=['POST']) +def update_key_photo(): + is_valid, error = check_auth_token(request) + if not is_valid: + return make_response((error, 403)) + + try: + data = json.loads(request.data) + except Exception as e: + logger.exception(e) + return {'error_msg': 'Bad request.'}, 400 + + repo_id = data.get('repo_id') + people_id = data.get('people_id') + obj_id = data.get('obj_id') + + if not repo_id: + return {'error_msg': 'repo_id invalid.'}, 400 + if not people_id: + return {'error_msg': 'people_id invalid.'}, 400 + if not obj_id: + return {'error_msg': 'obj_id invalid.'}, 400 + + face_recognition_manager.update_key_face_photo(repo_id, people_id, obj_id) + + return {'msg': 'Key Photo updated successfully'}, 200