save code
This commit is contained in:
+4
-3
@@ -56,9 +56,10 @@
|
||||
失败回退比例推算(方案A,`hairline_source` 透出)。标注图 numpy 向量化渐变线 + 思源黑体。返回 `annotated_image_base64`。
|
||||
- 门槛可配:`MIN_SHORT_SIDE`/`MIN_LONG_SIDE`(默认600/800)、姿态阈值 `FRONTAL_*_THR`(默认30°)。
|
||||
|
||||
### 接口6 四庭七眼测量 v2 `/api/v1/face/measure-v2`(worker)—— 复刻接口1
|
||||
- **做什么**:与接口 1 完全一致(正面照 → 四庭七眼 cm 与占比 + 5 个关键点 + 标注 PNG)。
|
||||
- **怎么实现**:与接口 1 共用 `_face_measure_impl()`,零额外逻辑。对外路径 `/api/v1/face/measure-v2`。
|
||||
### 接口6 四庭七眼测量 v2 `/api/v1/face/measure-v2`(worker)—— 接口1 的去顶庭变体
|
||||
- **做什么**:基于接口 1,**去顶庭**:不画头顶横线、不返回顶庭数据(`four_courts` 仅上/中/下庭,`landmarks` 无 `hair_top`,`face_total_height_cm` 为三庭之和)。
|
||||
- **与接口1 的标注差异**(`create_annotated_image(variant="v6")`):①竖线范围改为发际线→下巴尖;②不画人头最左/最右端线(仅七眼 6 点 5 段,接口1 为 8 线 7 段);③左侧只标上/中/下庭。箭头/虚线/字体等与接口1 一致。
|
||||
- **怎么实现**:与接口 1 共用 `_face_measure_impl(variant="v6")`;v6 时标注走变体分支、数据由 app.py 边界删顶庭字段并重算三庭比例。
|
||||
- **网关改动**:新增路由 `POST /api/v1/face/measure-v2`,转发到 worker 同路径;base64→URL 改写无需改动。
|
||||
|
||||
### 接口2 C端生发 `/api/v1/hair/grow`(worker)—— 预览 + 生发图
|
||||
|
||||
+21
-18
@@ -133,13 +133,12 @@
|
||||
|
||||
| 项目 | 要求 |
|
||||
|------|------|
|
||||
| 字体及线颜色 | `#FFFFFF` 100% |
|
||||
| 数值排布 | 四庭数值统一在图片**左侧**呈现;七眼间距**上下穿插**展示 |
|
||||
| 字体 | PingFangSC-Regular,字号 10pt |
|
||||
| 线宽 | 横线、竖线、虚线均为 1pt |
|
||||
| 线样式 | 横线、竖线渐变消失;虚线两侧呈现箭头 |
|
||||
|
||||
> **【待确认】** 标注图片需提供设计稿后才能最终确定样式。
|
||||
| 颜色 | 字体及所有线/箭头 `#FFFFFF` 100%,透明底 |
|
||||
| 尺寸 | 字号/线宽/虚线/箭头按图片**短边自适应缩放**(非固定 pt) |
|
||||
| 横线 | 5 条分界线(头顶/发际线/眉心/鼻翼下缘/下巴尖),两端渐变消失并略超出最外侧竖线;线名在线**右上方** |
|
||||
| 竖线 | 人头最左 + 七眼 6 点 + 人头最右(最外两条取自头发分割轮廓),两端渐变消失并略超出头顶/下巴 |
|
||||
| 数值排布 | 四庭数值(名 + 数值两行,**不带 cm**)统一在图片**左侧**呈现;七眼段宽**上下穿插**展示;底部统一标「单位cm」 |
|
||||
| 线样式 | 段宽/庭高用**虚线 + 实心三角双箭头**标示(箭头尖端落在虚线两端) |
|
||||
|
||||
### 响应示例(当前 Mock 返回值)
|
||||
|
||||
@@ -179,7 +178,12 @@
|
||||
|
||||
## 接口 6:四庭七眼测量 v2 接口
|
||||
|
||||
**说明**:功能与[接口 1](#接口-1四庭七眼测量标注接口)完全一致,复刻实现。输入用户正面照,返回四庭七眼测量数据和标注 PNG。
|
||||
**说明**:基于[接口 1](#接口-1四庭七眼测量标注接口)的变体。与接口 1 的差异:
|
||||
|
||||
- **去顶庭**:不画头顶横线、不返回顶庭数据。`four_courts` 仅含上/中/下庭,`landmarks` 无 `hair_top`,`face_total_height_cm` 为三庭之和(不含顶庭)。
|
||||
- **竖线范围**:纵向竖线从**发际线**画到**下巴尖**(接口 1 为头顶→下巴尖)。
|
||||
- **不画人头最左/最右端线**:仅画七眼 6 点(左脸颊/左眼外角/左眼内角/右眼内角/右眼外角/右脸颊)共 5 段标尺,不取头发轮廓的头部端线(接口 1 会多出最左/最右 2 条头部端线、共 7 段)。
|
||||
- 其余(实心三角箭头、虚线样式、字体、单位cm、七眼数据)与接口 1 一致。
|
||||
|
||||
**请求**:`POST /api/v1/face/measure-v2`
|
||||
|
||||
@@ -189,15 +193,13 @@
|
||||
|
||||
### 输出(data)
|
||||
|
||||
与接口 1 完全相同。详见[接口 1 输出](#接口-1四庭七眼测量标注接口)。
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| annotated_image_url | string | 标注图层 PNG URL(透明底,仅标注线/文字,不含人物) |
|
||||
| face_total_height_cm | number | 面部总高度(cm) |
|
||||
| four_courts | object | 四庭数据(顶庭/上庭/中庭/下庭,各含 cm 与 ratio) |
|
||||
| face_total_height_cm | number | 面部总高度(cm)= 上庭 + 中庭 + 下庭(**不含顶庭**) |
|
||||
| four_courts | object | 三庭数据(上/中/下庭,各含 cm 与 ratio;**无顶庭**) |
|
||||
| seven_eyes | object | 七眼数据(眼宽/脸宽/两眼间距,各含 cm 与 ratio) |
|
||||
| landmarks | object | 五个关键点像素坐标 |
|
||||
| landmarks | object | 四个关键点像素坐标(发际线/眉心/鼻翼下缘/下巴尖) |
|
||||
|
||||
### 响应示例
|
||||
|
||||
@@ -208,18 +210,19 @@
|
||||
"request_id": "mock-request-id",
|
||||
"data": {
|
||||
"annotated_image_url": "https://hair.xiangsilian.com/static/sample.jpg",
|
||||
"face_total_height_cm": 13.76,
|
||||
"face_total_height_cm": 10.32,
|
||||
"four_courts": {
|
||||
"top_court_cm": 3.44, "upper_court_cm": 3.44, "middle_court_cm": 3.44, "lower_court_cm": 3.44,
|
||||
"ratios": { "top_court": 0.25, "upper_court": 0.25, "middle_court": 0.25, "lower_court": 0.25 }
|
||||
"upper_court_cm": 3.44, "middle_court_cm": 3.44, "lower_court_cm": 3.44,
|
||||
"ratios": { "upper_court": 0.333, "middle_court": 0.333, "lower_court": 0.333 }
|
||||
},
|
||||
"seven_eyes": {
|
||||
"eye_width_cm": 3.44, "face_width_cm": 24.08, "inter_eye_distance_cm": 3.44,
|
||||
"ratios": { "eye_width": 0.143, "inter_eye_distance": 0.143 }
|
||||
},
|
||||
"landmarks": {
|
||||
"hair_top": { "x": 540, "y": 120 }, "hairline": { "x": 540, "y": 430 },
|
||||
"brow_center": { "x": 540, "y": 740 }, "nose_bottom": { "x": 540, "y": 1050 },
|
||||
"hairline": { "x": 540, "y": 430 },
|
||||
"brow_center": { "x": 540, "y": 740 },
|
||||
"nose_bottom": { "x": 540, "y": 1050 },
|
||||
"chin_tip": { "x": 540, "y": 1360 }
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -113,25 +113,25 @@ async def hair_grow_v2(request: Request):
|
||||
|
||||
---
|
||||
|
||||
## 6. 🔲【新增】接口6 四庭七眼测量 v2(`/api/v1/face/measure-v2`)
|
||||
## 6. ✅【已完成】接口6 四庭七眼测量 v2(`/api/v1/face/measure-v2`)
|
||||
|
||||
**背景**:worker 侧已新增接口 6,功能与接口 1 完全一致(复刻),共用同一实现。
|
||||
**背景**:worker 侧接口 6 是接口 1 的**去顶庭变体**(不再完全一致):不画头顶横线/不返回顶庭数据、竖线范围发际线→下巴尖、不画人头最左/最右端线。worker 侧与接口 1 共用 `_face_measure_impl(variant="v6")`。
|
||||
|
||||
**网关需新增一个路由**:
|
||||
**网关已新增路由**(`gateway/app.py` 已实现,网关机器 pull 后生效):
|
||||
|
||||
```python
|
||||
# gateway/app.py
|
||||
|
||||
@app.post("/api/v1/face/measure-v2", tags=["人脸分析"])
|
||||
async def face_measure_v2(request: Request):
|
||||
"""接口6:四庭七眼测量 v2(复刻接口1)"""
|
||||
"""接口6:四庭七眼测量 v2(去顶庭 + 去头部端线)"""
|
||||
return await _proxy(request, "/api/v1/face/measure-v2")
|
||||
```
|
||||
|
||||
**无需额外改动**:
|
||||
- 入参:与接口 1 完全相同(image_file/url/base64 三选一)
|
||||
- 出参:`annotated_image_base64` → 经现有 `rewrite_base64_to_url` 自动改写为 `annotated_image_url`
|
||||
- worker 侧与接口 1 共用 `_face_measure_impl()`,逻辑零差异
|
||||
- worker 侧 v6 差异(去顶庭字段、变体标注)由 `_face_measure_impl` 内部处理,网关透明转发
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user