From 81101715c82459f7d5e367dbf30e84b63570ef12 Mon Sep 17 00:00:00 2001 From: xsl Date: Mon, 14 Sep 2026 14:40:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A32):=20female=201..5=20?= =?UTF-8?q?=E6=8D=A2=E5=8F=91=E5=9E=8B=E5=88=86=E6=94=AF=E9=87=8D=E7=BB=98?= =?UTF-8?q?=E9=80=8F=E4=BC=A0=20prompt=EF=BC=88=E6=AD=A4=E5=89=8D=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E4=B8=BA=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同 59e01d3(ubuntu3090_debug),按 main 代码形态适配:main 的 _call_local_redraw 尚无 prompt/max_side/unet_name 参数,此处只加 prompt。 - _call_local_redraw 增加 prompt 入参并转发给 run_redraw(None 时行为不变, 仍用内置默认「填充遮罩区域的头发」) - generate_grow_results_swap 换发型分支调用处补传 prompt;自定义提示词现可 替换工作流节点60文本(与 male / female 6/7 行为一致);prompt 不进 change_hair(swapHair),仅作用于最后一步 ComfyUI 发际线带重绘 - 换词后首次请求因缓存失效重载明显变慢(实测 45s vs 命中 8s),后续恢复 - 文档同步:接口文档.md prompt 参数说明更新 --- docs/接口文档.md | 2 +- hairline/service.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/接口文档.md b/docs/接口文档.md index 4924577..ddced52 100644 --- a/docs/接口文档.md +++ b/docs/接口文档.md @@ -268,7 +268,7 @@ | hair_style | string | **是** | 发型序号,**逗号分隔多选**(如 `1,2,3`),最多不超过该性别的预设数。female:1=ellipse, 2=flower, 3=heart, 4=straight, 5=wave, 6=bigflower, 7=clasicalflower;male:1=ellipse, 2=inverse_arc, 3=m, 4=straight, 5=heart, 6=Softpetal, 7=wave。越界/非法返回 `1007` | | beauty_enabled | bool | 否 | 生发图是否带美颜效果,默认 false(当前阶段不生效) | | use_mask | bool | 否 | 是否启用 inpaint 遮罩,默认 `true`。`false` 时用干净原图生成(空遮罩、不烧模板黑线),供测试对比。仅对原生发(male / female 6/7)管线生效 | -| prompt | string | 否 | ComfyUI 提示词,默认「填充遮罩区域的头发」,会替换工作流节点 60 的文本。仅对原生发管线生效(female 1..5 换发型分支的提示词内部固定) | +| prompt | string | 否 | ComfyUI 提示词,默认「填充遮罩区域的头发」,会替换工作流节点 60 的文本。所有分支生效(male / female 6/7 原生生发,female 1..5 换发型后的发际线带重绘;不进 change_hair)。注:非默认提示词会使 ComfyUI 的 CLIP 条件缓存失效,换词后首次请求明显变慢(实测 45s vs 命中缓存 8s),相同提示词的后续请求恢复正常 | | flux_model | string | 否 | Flux 模型文件名(如 `flux-2-klein-9b-Q5_K_M.gguf`)。缺省用工作流默认(9B-Q4_K_M);`.gguf` 自动切 UnetLoaderGGUF 并同步配套 qwen CLIP | | redraw_max_side | int | 否 | female 1..5 重绘管线送模型前的长边上限像素。缺省=服务端默认(`REDRAW_MAX_SIDE`,当前 1024);`0`=不缩图(原图直送,更慢) | diff --git a/hairline/service.py b/hairline/service.py index 2beb441..293fc18 100644 --- a/hairline/service.py +++ b/hairline/service.py @@ -52,15 +52,19 @@ _REPO = os.path.dirname(os.path.dirname(__file__)) _TEXTURE_DIR = os.path.join(_REPO, "hairline_texture") _BLACK_TEXTURE_DIR = os.path.join(_REPO, "hairline_texture_black") -def _call_local_redraw(image_png_bytes, mask_png_bytes, timeout=300.0): +def _call_local_redraw(image_png_bytes, mask_png_bytes, timeout=300.0, + prompt=None): """直接调 ComfyUI 重绘(替代原 local_test HTTP 服务)。 传 final 图 + 纯红遮罩 PNG,返回重绘后的 PNG bytes。 失败抛异常(调用方负责 try/except 跳过)。 + + prompt:None 用 run_redraw 内置默认「填充遮罩区域的头发」,否则用传入的提示词。 """ from .redraw import run_redraw # front=True:接口2 时延敏感,插到 ComfyUI 队列最前,避免排在接口3/5 的批量任务后面 - return run_redraw(image_png_bytes, mask_png_bytes, timeout=timeout, front=True) + return run_redraw(image_png_bytes, mask_png_bytes, timeout=timeout, + prompt=prompt, front=True) # 发际线贴图档位:middle=默认(hairline_texture/),high/low 各自独立文件夹。 _TEXTURE_DIRS = { @@ -259,7 +263,10 @@ def generate_grow_results_swap(image_bgr: np.ndarray, hair_styles: list[int] | N 一致的原生生发(ComfyUI add_hair),由 _grow_native_one 完成(黑模板 + inpaint 遮罩)。 overlay 仍是发际线曲线透明层(与 generate_grow_results 完全一致)。 - prompt 仅用于原生生发分支(换发型分支的提示词由 redraw 流程内部固定)。 + prompt 两条分支都生效:换发型分支传入 _call_local_redraw,原生生发分支传给 + _grow_native_one。None/默认「填充遮罩区域的头发」时走 run_redraw 内置默认, + 不改变原行为;传不同提示词会使 ComfyUI 的 CLIP 条件缓存失效并重载(实测换词 + 后首次请求重绘 45s vs 缓存命中 8s),后续相同提示词恢复快路径。 Returns: list[dict] {"hairline_type","order","overlay","grown_png"(jpg bytes 或 None)}; 无人脸返回 None。单个发型换发型/重绘失败时 grown_png=None,不抛异常。 """ @@ -312,7 +319,8 @@ def generate_grow_results_swap(image_bgr: np.ndarray, hair_styles: list[int] | N final_bytes = base64.b64decode(final_b64) mask_bytes = base64.b64decode(mask_b64) # 后端直接调 ComfyUI 重绘,返回重绘后的 PNG - grown_png = _call_local_redraw(final_bytes, mask_bytes) + grown_png = _call_local_redraw(final_bytes, mask_bytes, + prompt=prompt) if grown_png is None: logger.warning("接口2 换发型:type=%s 重绘结果为空", key) except NoFaceError: