face-service/init.py

105 lines
3.2 KiB
Python

# -*- coding:utf-8 -*-
from traceback import format_exc
from ahserver.serverenv import ServerEnv
from appPublic.registerfunction import RegisterFunction
from appPublic.log import exception
import json
async def status_handler(request, params_kw, *args, **kwargs):
import sys, os
sys.path.insert(0, os.getcwd())
from workers.face_model import health_check
health = health_check()
return json.dumps({
"service": "face-service",
"model": health["model"],
"model_loaded": health["loaded"],
"det_size": health["det_size"],
"endpoints": ["/api/status", "/api/detect", "/api/recognize", "/api/compare"]
}, indent=2, ensure_ascii=False)
async def detect_handler(request, params_kw, *args, **kwargs):
import sys, os, time
sys.path.insert(0, os.getcwd())
from workers.face_model import detect
try:
images = params_kw.get("images", [])
if not images:
return json.dumps({"error": "images list required"})
start = time.time()
all_results = []
for img in images:
result = detect(img)
all_results.append(result)
elapsed = round(time.time() - start, 4)
return json.dumps({
"status": "SUCCEEDED",
"results": all_results,
"elapsed": elapsed
}, ensure_ascii=False)
except Exception as e:
exception(f"{e}, {format_exc()}")
return json.dumps({"error": str(e)})
async def recognize_handler(request, params_kw, *args, **kwargs):
import sys, os, time
sys.path.insert(0, os.getcwd())
from workers.face_model import recognize
try:
images = params_kw.get("images", [])
if not images:
return json.dumps({"error": "images list required"})
start = time.time()
all_results = []
for img in images:
result = recognize(img)
all_results.append(result)
elapsed = round(time.time() - start, 4)
return json.dumps({
"status": "SUCCEEDED",
"results": all_results,
"elapsed": elapsed
}, ensure_ascii=False)
except Exception as e:
exception(f"{e}, {format_exc()}")
return json.dumps({"error": str(e)})
async def compare_handler(request, params_kw, *args, **kwargs):
import sys, os
sys.path.insert(0, os.getcwd())
from workers.face_model import compare
try:
embedding1 = params_kw.get("embedding1")
embedding2 = params_kw.get("embedding2")
if not embedding1 or not embedding2:
return json.dumps({"error": "embedding1 and embedding2 required"})
result = compare(embedding1, embedding2)
return json.dumps({
"status": "SUCCEEDED",
**result
}, ensure_ascii=False)
except Exception as e:
exception(f"{e}, {format_exc()}")
return json.dumps({"error": str(e)})
def load_face_service():
"""Register API handlers"""
env = ServerEnv()
rf = RegisterFunction()
rf.register("status", status_handler)
rf.register("detect", detect_handler)
rf.register("recognize", recognize_handler)
rf.register("compare", compare_handler)