feat: 接口5 新增 face_measure(复用接口1测量数值)+ 接口1 七眼 eye1~eye7
接口5(/api/v1/hairline/generate)在发际线结果基础上新增 data.face_measure, 复用接口1的四庭七眼测量数值(四庭/七眼 eye1~eye7/landmarks/姿态), 不含标注图;独立流程容错,测量失败时为 null 不影响发际线主结果。 重构:提取 _run_face_measure_data() 共用函数,接口1/6 改调它再补标注图, 行为不变(43 测试全过,错误码 1001/1003/1008 回归正常)。 接口1/5 七眼新增 eye1~eye7 从左到右 7 段宽度(cm),eye1/eye7 耳朵不可见 时为 null(保留键)。 测试页 test_interface5.html:移除点击切换卡片网格改为所有发型平铺, 新增四庭七眼测量卡片。前端接入页 integration.html / 接口文档同步更新。
This commit is contained in:
@@ -155,6 +155,25 @@ def test_hairline_gen_female(client, monkeypatch):
|
||||
assert "image_middle_url" not in imgs[0]
|
||||
c = d["best_hairline_center_point"]
|
||||
assert 0 <= c["x"] <= 682 and 0 <= c["y"] <= 811 # 落在原图范围内
|
||||
# face_measure:复用接口1测量数值(容错,失败为 null;本用例正常 → 必须有完整结构)
|
||||
fm = d["face_measure"]
|
||||
assert fm is not None, "face_measure 不应为 null(正常正面照)"
|
||||
assert set(["face_total_height_cm", "four_courts", "seven_eyes",
|
||||
"landmarks", "hairline_source", "head_pose"]).issubset(fm.keys())
|
||||
# 不应含标注图字段(接口5 只要数值,不要画线图)
|
||||
assert "annotated_image_base64" not in fm
|
||||
assert "annotated_image_url" not in fm
|
||||
# 子结构
|
||||
assert set(["top_court_cm", "upper_court_cm", "middle_court_cm",
|
||||
"lower_court_cm", "ratios"]).issubset(fm["four_courts"].keys())
|
||||
assert set(["eye_width_cm", "face_width_cm", "inter_eye_distance_cm",
|
||||
"ratios"]).issubset(fm["seven_eyes"].keys())
|
||||
# 七眼 eye1~eye7 键必须存在(eye1/eye7 在耳朵不可见时可为 null)
|
||||
assert set([f"eye{i}" for i in range(1, 8)]).issubset(fm["seven_eyes"].keys())
|
||||
assert set(["hair_top", "hairline", "brow_center",
|
||||
"nose_bottom", "chin_tip"]).issubset(fm["landmarks"].keys())
|
||||
assert fm["hairline_source"] in ("segmentation", "estimated")
|
||||
assert set(["yaw", "pitch", "roll"]).issubset(fm["head_pose"].keys())
|
||||
|
||||
|
||||
# 接口4(用户特征)已迁到网关本机实现(直接调豆包),不再在 worker;
|
||||
@@ -174,6 +193,12 @@ def test_success_structure(client):
|
||||
"lower_court_cm", "ratios"]).issubset(data["four_courts"].keys())
|
||||
assert set(["eye_width_cm", "face_width_cm", "inter_eye_distance_cm",
|
||||
"ratios"]).issubset(data["seven_eyes"].keys())
|
||||
# 七眼:从左到右 eye1~eye7(eye1/eye7 在耳朵不可见时可为 null,但键必须存在)
|
||||
assert set([f"eye{i}" for i in range(1, 8)]).issubset(data["seven_eyes"].keys())
|
||||
# eye3/eye5 为左右眼宽、eye4 为两眼间距,与 eye_width_cm/inter_eye_distance_cm 语义一致
|
||||
assert data["seven_eyes"]["eye3"] is not None
|
||||
assert data["seven_eyes"]["eye4"] is not None
|
||||
assert data["seven_eyes"]["eye5"] is not None
|
||||
assert data["hairline_source"] in ("segmentation", "estimated")
|
||||
# base64 解码为合法 PNG(非 URL)
|
||||
assert "annotated_image_url" not in data
|
||||
|
||||
Reference in New Issue
Block a user