1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-23 20:37:42 +00:00

face_cluster (#6470)

* face_cluster

* update

* update

* feat: update ui

* feat: optimize code

* feat: update code

* feat: optimize ui

* feat: optimize view name

---------

Co-authored-by: zheng.shen <zheng.shen@seafile.com>
Co-authored-by: 杨国璇 <ygx@Hello-word.local>
This commit is contained in:
shenzheng-1
2024-10-16 11:09:30 +08:00
committed by GitHub
parent 24405a6600
commit 065f1584b5
24 changed files with 872 additions and 31 deletions

View File

@@ -20,6 +20,42 @@ def add_init_metadata_task(params):
return json.loads(resp.content)['task_id']
def add_init_face_recognition_task(params):
payload = {'exp': int(time.time()) + 300, }
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
headers = {"Authorization": "Token %s" % token}
url = urljoin(SEAFEVENTS_SERVER_URL, '/add-init-face-recognition-task')
resp = requests.get(url, params=params, headers=headers)
return json.loads(resp.content)['task_id']
def get_metadata_by_faces(faces, metadata_server_api):
from seafevents.repo_metadata.utils import METADATA_TABLE, FACES_TABLE
sql = f'SELECT * FROM `{METADATA_TABLE.name}` WHERE `{METADATA_TABLE.columns.id.name}` IN ('
parameters = []
query_result = []
for face in faces:
link_row_ids = [item['row_id'] for item in face.get(FACES_TABLE.columns.photo_links.name, [])]
if not link_row_ids:
continue
for link_row_id in link_row_ids:
sql += '?, '
parameters.append(link_row_id)
if len(parameters) >= 10000:
sql = sql.rstrip(', ') + ');'
results = metadata_server_api.query_rows(sql, parameters).get('results', [])
query_result.extend(results)
sql = f'SELECT * FROM `{METADATA_TABLE.name}` WHERE `{METADATA_TABLE.columns.id.name}` IN ('
parameters = []
if parameters:
sql = sql.rstrip(', ') + ');'
results = metadata_server_api.query_rows(sql, parameters).get('results', [])
query_result.extend(results)
return query_result
def generator_base64_code(length=4):
possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789'
ids = random.sample(possible, length)
@@ -57,6 +93,36 @@ def get_sys_columns():
return columns
def get_link_column(face_table_id):
from seafevents.repo_metadata.utils import METADATA_TABLE, FACES_TABLE
columns = [
METADATA_TABLE.columns.face_links.to_dict({
'link_id': FACES_TABLE.link_id,
'table_id': METADATA_TABLE.id,
'other_table_id': face_table_id,
'display_column_key': FACES_TABLE.columns.name.key,
}),
]
return columns
def get_face_columns(face_table_id):
from seafevents.repo_metadata.utils import METADATA_TABLE, FACES_TABLE
columns = [
FACES_TABLE.columns.photo_links.to_dict({
'link_id': FACES_TABLE.link_id,
'table_id': METADATA_TABLE.id,
'other_table_id': face_table_id,
'display_column_key': METADATA_TABLE.columns.obj_id.key,
}),
FACES_TABLE.columns.vector.to_dict(),
FACES_TABLE.columns.name.to_dict(),
]
return columns
def get_unmodifiable_columns():
from seafevents.repo_metadata.utils import METADATA_TABLE
columns = [
@@ -90,6 +156,20 @@ def init_metadata(metadata_server_api):
metadata_server_api.add_columns(METADATA_TABLE.id, sys_columns)
def init_faces(metadata_server_api):
from seafevents.repo_metadata.utils import METADATA_TABLE, FACES_TABLE
resp = metadata_server_api.create_table(FACES_TABLE.name)
# init link column
link_column = get_link_column(resp['id'])
metadata_server_api.add_columns(METADATA_TABLE.id, link_column)
# init face column
face_columns = get_face_columns(resp['id'])
metadata_server_api.add_columns(resp['id'], face_columns)
def get_file_download_token(repo_id, file_id, username):
return seafile_api.get_fileserver_access_token(repo_id, file_id, 'download', username, use_onetime=True)