平均特征值计算

This commit is contained in:
ZZX9599
2025-09-04 10:46:05 +08:00
parent bae7785a97
commit ea82a33a8f

View File

@ -6,12 +6,16 @@ from schema.face_schema import FaceCreateRequest, FaceUpdateRequest, FaceRespons
from schema.response_schema import APIResponse from schema.response_schema import APIResponse
from middle.auth_middleware import get_current_user from middle.auth_middleware import get_current_user
from schema.user_schema import UserResponse from schema.user_schema import UserResponse
from ocr.feature_extraction import BinaryFaceFeatureHandler
router = APIRouter( router = APIRouter(
prefix="/faces", prefix="/faces",
tags=["人脸管理"] tags=["人脸管理"]
) )
# 创建 BinaryFaceFeatureHandler 的实例
binary_face_feature_handler = BinaryFaceFeatureHandler()
# ------------------------------ # ------------------------------
# 1. 创建人脸记录核心修正ID 数据库自增,前端无需传) # 1. 创建人脸记录核心修正ID 数据库自增,前端无需传)
@ -43,7 +47,6 @@ async def create_face(
# 调用人脸识别得到特征值 # 调用人脸识别得到特征值
# 2. 插入数据库:无需传 ID自增只传 name 和 eigenvalueNone # 2. 插入数据库:无需传 ID自增只传 name 和 eigenvalueNone
insert_query = """ insert_query = """
INSERT INTO face (name, eigenvalue) INSERT INTO face (name, eigenvalue)
@ -240,7 +243,7 @@ def get_all_face_name_with_eigenvalue() -> dict:
""" """
获取所有人脸的名称及其对应的特征值,组成字典返回 获取所有人脸的名称及其对应的特征值,组成字典返回
key: 人脸名称name key: 人脸名称name
value: 人脸特征值eigenvalue value: 人脸特征值eigenvalue,若名称重复则返回平均特征值
过滤掉name为None的记录避免字典key为None的情况 过滤掉name为None的记录避免字典key为None的情况
""" """
conn = None conn = None
@ -254,11 +257,25 @@ def get_all_face_name_with_eigenvalue() -> dict:
cursor.execute(query) cursor.execute(query)
faces = cursor.fetchall() faces = cursor.fetchall()
# 构建name到eigenvalue的映射字典 # 先收集所有名称对应的特征值列表(处理重复名称)
face_dict = { name_to_eigenvalues = {}
face["name"]: face["eigenvalue"] for face in faces:
for face in faces name = face["name"]
} eigenvalue = face["eigenvalue"]
if name in name_to_eigenvalues:
name_to_eigenvalues[name].append(eigenvalue)
else:
name_to_eigenvalues[name] = [eigenvalue]
# 构建最终字典:重复名称取平均特征值,唯一名称直接取特征值
face_dict = {}
for name, eigenvalues in name_to_eigenvalues.items():
print("调用的特征值是:" + eigenvalues)
if len(eigenvalues) > 1:
# 调用平均特征值计算方法
face_dict[name] = binary_face_feature_handler.get_average_feature(eigenvalues)
else:
face_dict[name] = eigenvalues[0]
return face_dict return face_dict
@ -266,4 +283,4 @@ def get_all_face_name_with_eigenvalue() -> dict:
raise Exception(f"获取人脸名称与特征值失败:{str(e)}") from e raise Exception(f"获取人脸名称与特征值失败:{str(e)}") from e
finally: finally:
# 确保资源释放 # 确保资源释放
db.close_connection(conn, cursor) db.close_connection(conn, cursor)