接口11/12:固定 pushed 遮罩 + multiband 融合,移除其他算法选项
遮罩算法只保留 pushed(发际线外推),融合算法只保留 multiband(多频段金字塔), eroded/closed/feather/alpha_gradient/seamless 等旧选项从接口参数层移除。 - generate_hairline_grow: 删除 mask_type/blend_method/feather_px/color_match 参数, 内部固定 mask_type=pushed、blend_method=multiband - app.py 接口11/12: 删除 mask_type/blend_method/feather_px/color_match Form 参数, 调用处改关键字传参;grow_v2 只传 image+hairline_id 即默认走最新算法 - 前端两个测试页: 删除遮罩/融合下拉选项及相关联动,固定展示 pushed 步骤 - 文档: 更新为"固定 pushed + multiband,移除其他选项"
This commit is contained in:
@@ -1297,19 +1297,15 @@ async def hairline_grow(
|
||||
hairgrow_strength: float = Form(default=0.75, description="区域生发强度(仅 hairgrow 后端),默认 0.75"),
|
||||
is_hr: bool = Form(default=False, description="高清模式(换发型输出 1152×1536,否则 576×768)"),
|
||||
seg_model: str = Form(default="segformer", description="头发分割模型:bisenet | segformer(默认 segformer)"),
|
||||
mask_type: str = Form(default="eroded", description="遮罩类型:eroded(内缩) | closed(闭合区域) | pushed(发际线外推)(默认 eroded)"),
|
||||
erode_cm: float = Form(default=1.2, description="遮罩外缘朝中心151内缩距离(厘米,同接口9),默认 1.2"),
|
||||
hairline_push_cm: float = Form(default=1.0, description="发际线外推距离(厘米,往头发方向推进;仅 mask_type=pushed 生效),默认 1.0"),
|
||||
hairline_edge: str = Form(default="column", description="发际线提取方式:column(逐列最低点) | contour(形态学轮廓)(仅 pushed 生效),默认 column"),
|
||||
swap_mode: str = Form(default="ext_mask", description="换发型取图模式:ext_mask(改造换发型用接口9遮罩) | as_is(不改换发型,贴回再裁)(默认 ext_mask)"),
|
||||
blend_method: str = Form(default="feather", description="接缝融合:feather(高斯羽化) | alpha_gradient(距离渐变) | seamless(泊松无缝) | multiband(多频段金字塔)(默认 feather)"),
|
||||
feather_px: int = Form(default=15, description="羽化/渐变过渡宽度(像素),默认 15"),
|
||||
erode_cm: float = Form(default=0.6, description="baseline 参考内缩距离(厘米),默认 0.6"),
|
||||
hairline_push_cm: float = Form(default=1.0, description="发际线外推距离(厘米,往头发方向推进),默认 1.0"),
|
||||
hairline_edge: str = Form(default="column", description="发际线提取方式:column | contour,默认 column"),
|
||||
swap_mode: str = Form(default="ext_mask", description="换发型取图模式:ext_mask | as_is(默认 ext_mask)"),
|
||||
edge_erode_px: int = Form(default=3, description="贴图前遮罩内缩像素(防边缘露皮/光晕),默认 3"),
|
||||
denoising_strength: float = Form(default=0.6, description="换发型 webui 重绘强度(越大生发越激进),默认 0.6"),
|
||||
color_match: bool = Form(default=False, description="融合前对生成图做 Reinhard 颜色校正(消除整体色差,seamless 下自动跳过),默认 false"),
|
||||
mb_levels: int = Form(default=5, description="multiband 多频段金字塔层数(2~6,越大低频色差抹得越宽,仅 multiband 生效),默认 5"),
|
||||
mb_levels: int = Form(default=5, description="多频段金字塔层数(2~6,越大低频色差抹得越宽),默认 5"),
|
||||
):
|
||||
"""接口11:发际线生发 + 分步可视化"""
|
||||
"""接口11:发际线生发 + 分步可视化。遮罩固定 pushed、融合固定 multiband。"""
|
||||
raw, e = await resolve_image_bytes(image_file, image_url, image_base64)
|
||||
if e is not None:
|
||||
return e
|
||||
@@ -1323,14 +1319,16 @@ async def hairline_grow(
|
||||
from face_analysis.hairline_grow import generate_hairline_grow, NoFaceError, SwapError
|
||||
from uuid import uuid4 as _uuid4
|
||||
rid = _uuid4().hex[:8]
|
||||
logger.info("[%s] 接口11 收到请求: mask_type=%s hairline_push_cm=%s hairline_edge=%s",
|
||||
rid, mask_type, hairline_push_cm, hairline_edge)
|
||||
logger.info("[%s] 接口11 收到请求: hairline_push_cm=%s hairline_edge=%s mb_levels=%s",
|
||||
rid, hairline_push_cm, hairline_edge, mb_levels)
|
||||
try:
|
||||
data = await run_in_threadpool(
|
||||
generate_hairline_grow, image, hairline_id, is_hr, seg_model,
|
||||
mask_type, erode_cm, swap_mode, blend_method, feather_px, edge_erode_px,
|
||||
denoising_strength, gen_backend, hairgrow_strength, color_match, mb_levels,
|
||||
hairline_push_cm=hairline_push_cm, hairline_edge=hairline_edge, rid=rid)
|
||||
generate_hairline_grow, image, hairline_id,
|
||||
is_hr=is_hr, seg_model=seg_model, erode_cm=erode_cm, swap_mode=swap_mode,
|
||||
edge_erode_px=edge_erode_px, denoising_strength=denoising_strength,
|
||||
gen_backend=gen_backend, hairgrow_strength=hairgrow_strength,
|
||||
mb_levels=mb_levels, hairline_push_cm=hairline_push_cm,
|
||||
hairline_edge=hairline_edge, rid=rid)
|
||||
except NoFaceError:
|
||||
return err(1001, "无法识别人像")
|
||||
except SwapError as se:
|
||||
@@ -1348,17 +1346,15 @@ async def hairline_grow(
|
||||
|
||||
@app.post(
|
||||
"/api/v1/hairline/grow_v2",
|
||||
summary="接口12 发际线生发(固定金字塔融合,仅返回最终图)",
|
||||
summary="接口12 发际线生发(固定 pushed 遮罩 + 多频段融合,仅返回最终图)",
|
||||
tags=["生发"],
|
||||
description=f"""
|
||||
接口11 的固定参数精简版,适合生产直调。与接口11 共用同一管线,区别仅在于:
|
||||
接口11 的固定参数精简版,适合生产直调。与接口11 共用同一管线,遮罩固定 pushed(发际线外推),
|
||||
融合固定 multiband(多频段金字塔)。本接口固定 `erode_cm=0.6`、`mb_levels=5` 不暴露,
|
||||
**只返回 `final_base64`**(最终合成图),不附带分步可视化。
|
||||
|
||||
- **固定** `blend_method=multiband`(多频段金字塔融合)、`mb_levels=5`、`erode_cm=0.6`
|
||||
(外缘朝中心151 内缩 0.6cm)。这三项不可调,故本接口不暴露。
|
||||
- **返回值精简**:只返回 `final_base64`(最终合成图),不再附带接口11 的分步可视化。
|
||||
|
||||
其余参数(hairline_id、seg_model、gen_backend、is_hr、denoising_strength、color_match、
|
||||
edge_erode_px 等)仍保留为可选 Form,调用方可按需覆盖,未传则用接口11 同款默认值。
|
||||
其余参数(hairline_id、seg_model、gen_backend、is_hr、denoising_strength、edge_erode_px、
|
||||
hairline_push_cm、hairline_edge 等)保留为可选 Form,调用方可按需覆盖。
|
||||
|
||||
{_image_fields_desc}
|
||||
""",
|
||||
@@ -1372,16 +1368,13 @@ async def hairline_grow_v2(
|
||||
hairgrow_strength: float = Form(default=0.75, description="区域生发强度(仅 hairgrow 后端),默认 0.75"),
|
||||
is_hr: bool = Form(default=False, description="高清模式(换发型输出 1152×1536,否则 576×768)"),
|
||||
seg_model: str = Form(default="segformer", description="头发分割模型:bisenet | segformer(默认 segformer)"),
|
||||
mask_type: str = Form(default="eroded", description="遮罩类型:eroded(内缩) | closed(闭合区域) | pushed(发际线外推)(默认 eroded)"),
|
||||
swap_mode: str = Form(default="ext_mask", description="换发型取图模式:ext_mask(改造换发型用接口9遮罩) | as_is(不改换发型,贴回再裁)(默认 ext_mask)"),
|
||||
feather_px: int = Form(default=15, description="羽化/渐变过渡宽度(像素,本接口固定 multiband 故不生效,仅留作兼容)"),
|
||||
swap_mode: str = Form(default="ext_mask", description="换发型取图模式:ext_mask | as_is(默认 ext_mask)"),
|
||||
edge_erode_px: int = Form(default=3, description="贴图前遮罩内缩像素(防边缘露皮/光晕),默认 3"),
|
||||
denoising_strength: float = Form(default=0.6, description="换发型 webui 重绘强度(越大生发越激进),默认 0.6"),
|
||||
color_match: bool = Form(default=False, description="融合前对生成图做 Reinhard 颜色校正(消除整体色差),默认 false"),
|
||||
hairline_push_cm: float = Form(default=1.0, description="发际线外推距离(厘米,仅 mask_type=pushed 生效),默认 1.0"),
|
||||
hairline_edge: str = Form(default="column", description="发际线提取方式:column | contour(仅 pushed 生效),默认 column"),
|
||||
hairline_push_cm: float = Form(default=1.0, description="发际线外推距离(厘米),默认 1.0"),
|
||||
hairline_edge: str = Form(default="column", description="发际线提取方式:column | contour,默认 column"),
|
||||
):
|
||||
"""接口12:发际线生发(固定 multiband/mb_levels=5/erode_cm=0.6,仅返回最终图)。"""
|
||||
"""接口12:发际线生发(固定 pushed 遮罩 + multiband 融合,仅返回最终图)。"""
|
||||
raw, e = await resolve_image_bytes(image_file, image_url, image_base64)
|
||||
if e is not None:
|
||||
return e
|
||||
@@ -1394,12 +1387,13 @@ async def hairline_grow_v2(
|
||||
from fastapi.concurrency import run_in_threadpool
|
||||
from face_analysis.hairline_grow import generate_hairline_grow, NoFaceError, SwapError
|
||||
try:
|
||||
# 固定三项:blend_method=multiband、mb_levels=5、erode_cm=0.6
|
||||
# 固定:mask_type=pushed、blend_method=multiband、erode_cm=0.6、mb_levels=5
|
||||
data = await run_in_threadpool(
|
||||
generate_hairline_grow, image, hairline_id, is_hr, seg_model,
|
||||
mask_type, 0.6, swap_mode, "multiband", feather_px, edge_erode_px,
|
||||
denoising_strength, gen_backend, hairgrow_strength, color_match, 5,
|
||||
hairline_push_cm=hairline_push_cm, hairline_edge=hairline_edge)
|
||||
generate_hairline_grow, image, hairline_id,
|
||||
is_hr=is_hr, seg_model=seg_model, erode_cm=0.6, swap_mode=swap_mode,
|
||||
edge_erode_px=edge_erode_px, denoising_strength=denoising_strength,
|
||||
gen_backend=gen_backend, hairgrow_strength=hairgrow_strength,
|
||||
mb_levels=5, hairline_push_cm=hairline_push_cm, hairline_edge=hairline_edge)
|
||||
except NoFaceError:
|
||||
return err(1001, "无法识别人像")
|
||||
except SwapError as se:
|
||||
|
||||
Reference in New Issue
Block a user