|
|
from enum import Enum |
|
|
from typing import List, Optional |
|
|
|
|
|
from pydantic import BaseModel |
|
|
|
|
|
|
|
|
class ModelType(str, Enum): |
|
|
"""模型类型枚举""" |
|
|
|
|
|
HOWCUTEAMI = "howcuteami" |
|
|
DEEPFACE = "deepface" |
|
|
HYBRID = "hybrid" |
|
|
|
|
|
|
|
|
class ImageScoreItem(BaseModel): |
|
|
file_path: str |
|
|
score: float |
|
|
is_cropped_face: bool = False |
|
|
size_bytes: int |
|
|
size_str: str |
|
|
last_modified: str |
|
|
nickname: Optional[str] = None |
|
|
|
|
|
|
|
|
class SearchRequest(BaseModel): |
|
|
keyword: Optional[str] = "" |
|
|
searchType: Optional[str] = "face" |
|
|
top_k: Optional[int] = 5 |
|
|
score_threshold: float = 0.0 |
|
|
nickname: Optional[str] = None |
|
|
|
|
|
|
|
|
class ImageSearchRequest(BaseModel): |
|
|
image: Optional[str] = None |
|
|
searchType: Optional[str] = "face" |
|
|
top_k: Optional[int] = 5 |
|
|
score_threshold: float = 0.0 |
|
|
nickname: Optional[str] = None |
|
|
|
|
|
|
|
|
class ImageFileList(BaseModel): |
|
|
results: List[ImageScoreItem] |
|
|
count: int |
|
|
|
|
|
class PagedImageFileList(BaseModel): |
|
|
results: List[ImageScoreItem] |
|
|
count: int |
|
|
page: int |
|
|
page_size: int |
|
|
total_pages: int |
|
|
|
|
|
class CelebrityMatchResponse(BaseModel): |
|
|
filename: str |
|
|
display_name: Optional[str] = None |
|
|
distance: float |
|
|
similarity: float |
|
|
confidence: float |
|
|
face_filename: Optional[str] = None |
|
|
|
|
|
|
|
|
class CategoryStatItem(BaseModel): |
|
|
category: str |
|
|
display_name: str |
|
|
count: int |
|
|
|
|
|
|
|
|
class CategoryStatsResponse(BaseModel): |
|
|
stats: List[CategoryStatItem] |
|
|
total: int |
|
|
|