Skip to content

Commit

Permalink
feat: add make key face photo sup
Browse files Browse the repository at this point in the history
  • Loading branch information
cir9no committed Jan 26, 2025
1 parent 6d51775 commit 4ab274f
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 16 deletions.
4 changes: 2 additions & 2 deletions face_recognition/face_cluster_updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
22 changes: 17 additions & 5 deletions face_recognition/face_recognition_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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()
7 changes: 5 additions & 2 deletions face_recognition/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import base64
import os
import json
import posixpath

from seaserv import seafile_api
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
4 changes: 2 additions & 2 deletions repo_metadata/index_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down Expand Up @@ -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):
Expand Down
6 changes: 3 additions & 3 deletions repo_metadata/script/update_face_recognition.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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__":
Expand Down
4 changes: 2 additions & 2 deletions repo_metadata/slow_task_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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'
Expand Down
29 changes: 29 additions & 0 deletions seafevent_server/request_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down Expand Up @@ -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

0 comments on commit 4ab274f

Please sign in to comment.