Files
2025-07-29 18:15:35 +08:00

101 lines
5.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import APIRouter, HTTPException, Body, Depends
from . import schemas
from .services import face_service, FaceRecognitionService
router = APIRouter()
# Dependency to get the service instance
def get_face_service():
return face_service
@router.post("/register", response_model=schemas.RegisterResponse, summary="注册新的人脸")
async def register(request: schemas.RegisterRequest, service: FaceRecognitionService = Depends(get_face_service)):
"""
为用户注册一张新的人脸。元数据存入PostgreSQL向量存入Milvus。
- **功能**: 将一张图片中的人脸与一个用户ID和姓名关联起来。
- **校验**:
- 检查用户ID是否已被他人注册。
- 确保图片中只包含一张清晰可识别的人脸。
- **操作**: 如果是新用户会在PostgreSQL创建用户记录然后将提取到的人脸特征向量存入Milvus。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
user_info = await service.register_new_face(request.id, request.name, request)
return schemas.RegisterResponse(data=user_info)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
@router.post("/detect", response_model=schemas.DetectResponse, summary="1:N 人脸识别 (Milvus)")
async def detect(request: schemas.ImageSource = Body(...), service: FaceRecognitionService = Depends(get_face_service)):
"""
在一张图片中检测并识别所有已知的人脸。使用Milvus进行高性能向量搜索。
- **功能**: 对比图片中的人脸与Milvus中的所有人脸返回匹配结果。
- **阈值**: 内部使用相似度阈值来判断是否匹配成功。
- **返回**: 返回一个列表,包含所有被识别出的人员信息、位置和置信度。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
detected_faces = await service.detect_faces(request)
return schemas.DetectResponse(data=detected_faces)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
@router.post("/verify", response_model=schemas.VerifyResponse, summary="1:1 人脸认证 (Milvus)")
async def verify(request: schemas.VerifyRequest, service: FaceRecognitionService = Depends(get_face_service)):
"""
验证一张图片中的人脸是否属于指定的用户ID。在Milvus中进行限定范围的向量搜索。
- **功能**: 精确比对,判断“这张脸是不是这个人”。
- **场景**: 用于人脸登录、刷脸支付等高安全要求的场景。
- **返回**: 返回布尔值 `match` 表示是否匹配,以及具体的相似度 `confidence`。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
verification_result = await service.verify_face(request.id, request)
return schemas.VerifyResponse(data=verification_result)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
@router.delete("/users/{user_id}", response_model=schemas.StandardResponse, summary="删除用户 (同步删除PG和Milvus)")
async def delete_user(user_id: int, service: FaceRecognitionService = Depends(get_face_service)):
"""
根据用户ID从PostgreSQL和Milvus中同步删除该用户的所有数据。
"""
try:
deleted_user = await service.delete_user(user_id)
return schemas.StandardResponse(message=f"成功删除用户 {deleted_user['name']} (ID: {user_id})。")
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"服务器内部错误: {e}")
@router.get("/users/{user_id}", response_model=schemas.RegisterResponse, summary="获取单个用户信息")
async def get_user(user_id: int, service: FaceRecognitionService = Depends(get_face_service)):
"""
根据用户ID查询并返回用户的详细信息元数据来自PG人脸数量来自Milvus
"""
user_info = await service.get_user(user_id)
if not user_info:
raise HTTPException(status_code=404, detail=f"ID为 {user_id} 的用户不存在。")
return schemas.RegisterResponse(data=user_info)
@router.get("/users", response_model=schemas.UserListResponse, summary="获取所有用户列表")
async def list_users(skip: int = 0, limit: int = 100, service: FaceRecognitionService = Depends(get_face_service)):
"""
获取数据库中所有已注册用户的列表支持分页元数据来自PG人脸数量来自Milvus
"""
users_list = await service.list_all_users(skip=skip, limit=limit)
return schemas.UserListResponse(data=users_list)