Files
Face-Verifying/app/api.py

108 lines
4.5 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
from . import schemas
from .services import face_service
router = APIRouter()
@router.post("/register", response_model=schemas.RegisterResponse, summary="注册新的人脸")
async def register(request: schemas.RegisterRequest):
"""
为用户注册一张新的人脸。
- **功能**: 将一张图片中的人脸与一个用户ID和姓名关联起来。
- **校验**:
- 检查用户ID是否已被他人注册。
- 确保图片中只包含一张清晰可识别的人脸。
- **操作**: 如果是新用户,会创建用户记录;然后将提取到的人脸特征向量存入数据库。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
user_info = face_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 人脸识别")
async def detect(request: schemas.ImageSource = Body(...)):
"""
在一张图片中检测并识别所有已知的人脸。
- **功能**: 对比图片中的人脸与数据库中的所有人脸,返回匹配结果。
- **阈值**: 内部使用相似度阈值来判断是否匹配成功。
- **返回**: 返回一个列表,包含所有被识别出的人员信息、位置和置信度。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
detected_faces = face_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 人脸认证")
async def verify(request: schemas.VerifyRequest):
"""
验证一张图片中的人脸是否属于指定的用户ID。
- **功能**: 精确比对,判断“这张脸是不是这个人”。
- **场景**: 用于人脸登录、刷脸支付等高安全要求的场景。
- **返回**: 返回布尔值 `match` 表示是否匹配,以及具体的相似度 `confidence`。
"""
try:
if not request.url and not request.face_data:
raise ValueError("必须提供图片的url或face_data。")
verification_result = face_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="删除用户")
async def delete_user(user_id: int):
"""
根据用户ID从数据库中删除该用户及其所有注册的人脸信息。
"""
try:
deleted_user = face_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):
"""
根据用户ID查询并返回用户的详细信息。
"""
user_info = face_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):
"""
获取数据库中所有已注册用户的列表,支持分页。
"""
users_list = face_service.list_all_users(skip=skip, limit=limit)
return schemas.UserListResponse(data=users_list)
# 可以在这里继续添加其他API端点...