平均特征值计算

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