feat(worker): 接口1 四庭七眼测量真实实现(替换 Mock)

worker 侧从 Mock 替换为真实算法:
- face_analysis 包:detector(MediaPipe 478点) / pose(solvePnP 姿态) /
  calibration(虹膜直径法) / hair_segmenter+bisenet_model(方案B 头发分割) /
  measure(方案A兜底+B/A决策+七眼+换算) / annotation(numpy渐变线+中文标注)
- app.py:/api/v1/face/measure 接真实实现,返回 annotated_image_base64
  (不落盘不拼URL,落盘由网关做);加 X-Internal-Token 鉴权、/health 就绪态、
  可配置分辨率门槛、异常兜底
- 部署:start.sh/run_worker.sh/hair-worker.service 监听 8187;worker_config 示例
- 测试 tests/:Tier1合成真值<1e-6 + Tier2缩放不变 + Tier3叠加 + 错误码集成 +
  数值回归,pytest 24 项全绿
- 文档补实测基线表 + RTX5090/torch 说明

注:worker 为 RTX 5090(sm_120),pinned torch 2.2.2(cu121) 只到 sm_90,
BiSeNet 已自动回退 CPU(方案B 正常);要用 GPU 需换 torch cu128(≥2.7)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
xsl
2026-06-14 16:07:28 +08:00
co-authored by Claude Opus 4.8
parent 3b706ec0ef
commit 8d3b145111
25 changed files with 1806 additions and 35 deletions
+40
View File
@@ -0,0 +1,40 @@
"""MediaPipe Face Mesh 关键点索引常量(四庭七眼测量用)。
MediaPipe Face Mesh 对 468 个点按固定拓扑编号;开启 refine_landmarks=True 后
额外输出 10 个虹膜点(索引 468–477),总计 478 点。本模块集中定义本接口
所需的全部索引,避免散落在各处的魔数。详见技术方案 §2。
"""
# --- 四庭纵向中轴关键点 ---
GLABELLA_9 = 9 # 眉间 / glabella(上点)
GLABELLA_151 = 151 # 眉间 / glabella(下点),与 9 取中点作为眉心
NOSE_BOTTOM = 94 # 鼻翼下缘 / subnasale(人中顶部)
CHIN_TIP = 152 # 下巴尖 / menton(下颌最低点)
# --- 七眼横向关键点 ---
LEFT_EYE_OUTER = 33 # 左眼外角
LEFT_EYE_INNER = 133 # 左眼内角
RIGHT_EYE_INNER = 362 # 右眼内角
RIGHT_EYE_OUTER = 263 # 右眼外角
LEFT_CHEEK = 234 # 左脸颧弓(脸宽左端)
RIGHT_CHEEK = 454 # 右脸颧弓(脸宽右端)
# --- 鼻尖(solvePnP 用,可选) ---
NOSE_TIP = 1 # 鼻尖(也有用 4 的版本)
NOSE_TIP_ALT = 4
# --- 虹膜关键点(refine_landmarks=True 才输出,尺度校准用) ---
IRIS_LEFT_CENTER = 468 # 左眼虹膜中心
IRIS_LEFT_LEFT = 469 # 左虹膜左边缘
IRIS_LEFT_RIGHT = 471 # 左虹膜右边缘
IRIS_RIGHT_CENTER = 473 # 右眼虹膜中心
IRIS_RIGHT_LEFT = 474 # 右虹膜左边缘
IRIS_RIGHT_RIGHT = 476 # 右虹膜右边缘
# --- solvePnP 姿态估计用的 6 点(与通用 3D 头模一一对应,见 pose.py ---
MOUTH_LEFT = 61 # 左嘴角
MOUTH_RIGHT = 291 # 右嘴角
PNP_INDICES = [NOSE_TIP, CHIN_TIP, LEFT_EYE_OUTER, RIGHT_EYE_OUTER, MOUTH_LEFT, MOUTH_RIGHT]
# 含虹膜时的关键点总数
NUM_LANDMARKS_WITH_IRIS = 478