admin 管理员
积分160
帖子0
注册

全身图的脸为什么总是崩:量化根因 + FaceDetailer 脸部二次重绘实战(ComfyUI + Impact Pack)

📌 置顶

全身图的脸为什么总是崩:量化根因 + FaceDetailer 脸部二次重绘实战

关键词:SDXL · 角色 LoRA · 全身图脸部崩坏 · FaceDetailer · ComfyUI-Impact-Pack · ADetailer · Tesla P40 · 实测数据

角色 LoRA 训好之后,最容易被忽略的一个坑是:半身/特写图的脸很稳,一旦换成全身图,脸就崩了——常见表现是眼睛变成横向条纹、一只眼金一只眼绿、五官糊成一团或整体歪掉。很多人第一反应是"LoRA 训废了",然后回去重训。其实跟 LoRA 版本没关系:v3 到 v8 都会这样。本文把根因量出来,并给出可复现的修复方案(脸部二次重绘),所有数字都是本地那张 24G 卡上的实测值。

一、先量化:全身图里脸到底有多大

别用形容词讨论"糊不糊",先量像素。把出图叠上 100 像素间隔的坐标网格,逐张读脸(眉毛到下巴、不含头发与头饰)的实际像素范围:

构图画布脸高(像素)单眼宽
正面全身832×1216约 87 px约 25 px
正面全身1024×1024约 139–143 px约 30 px
脸特写1024×1024约 500 px约 130 px

换算到潜在空间(SDXL 的 latent 是 1/8 分辨率)就更直观了:832×1216 的图,其 latent 只有 104×152,整张脸落在约 11×11 个 latent 像素里,一只眼睛只占 3–4 个 latent 像素。

二、三条根因(缺一不可)

  1. latent 像素预算不足。 采样器在"没有足够像素可画"的区域,只能猜五官的位置与形状。3–4 个 latent 像素画一只眼睛,等于让画师用 3 个格子画瞳孔。
  2. 采样器会把这种"猜"放大。 带随机注入的采样器(例如 euler_ancestral)每一步都加噪声,在小 latent 区域里,猜对的细节会被噪声淹没,猜错的部分反而被强化成横向条纹、异色、拉长变形——这正是"崩"的直接来源。换成非 ancestral 采样器能减轻,但不能解决(因为第 1 条还在)。
  3. 训练分布不匹配。 数据集里的脸通常是以大脸裁图形式喂进去的(脸占画面 30%–60%)。于是模型积累的是"大脸先验",没有"小脸先验":脸一大就稳、一小就崩。这也解释了为什么"特写很完美、全身一塌糊涂"。

顺带排掉两个误判方向:加 3d, cg, realistic 这类词是风格控制,对脸部结构无效;把脸写进负面词更没用。这不是提示词问题,是像素问题。

三、为什么普通的 hires 二次采样救不了

常见的两阶段 hires(放大 1.25 倍再以 denoise 0.3 重采样)只能把脸从 87 px 抬到约 110–154 px,仍远低于五官稳定所需的尺度;而且低 denoise 的二次采样不会重建五官结构,只是"给糊掉的脸刷了层清漆"。想在原画布内凭空造出分辨率是不可能的——画布不放大,脸就永远只有那点像素。

真正的解法是工业界早就用惯的思路:把脸裁出来单独重绘,再贴回去。这就是 ADetailer / FaceDetailer 的核心机制,也是本文的方案。

四、机制:脸部二次重绘的五步

  1. 检测:用目标检测模型找出脸部框图(本文用 YOLOv8 人脸模型 face_yolov8m)。
  2. 裁剪与外扩:按框图外扩取一块(含少量头发/颈部,保证贴回无缝)。
  3. 放大到训练分布:把这块裁图缩放,使脸在裁图里占到约 512 px(guide_size)——这一步是关键,等于把"小脸"还原成模型熟悉的"大脸"。
  4. 低强度重绘:用同一个角色 LoRA、以 denoise 0.4 左右重绘这块裁图。既修正五官,又不会换人。
  5. 羽化贴回原图:用带羽化的蒙版贴回,接缝不可见。

实测效果:原来两眼上的横向黑色条纹乱码被彻底修掉,变成干净、对称、带花型虹膜的金瞳;发丝、红色头饰、颈饰、颈部接缝全部保持一致,没有引入新的崩坏。

五、安装:ComfyUI-Impact-Pack 的正确姿势(含一个能把环境搞坏的坑)

FaceDetailer 节点在 ComfyUI-Impact-Pack 里;从 v8.x 起,人脸检测器节点 UltralyticsDetectorProvider 被挪到了 ComfyUI-Impact-Subpack,两个都要装。

坑一(最危险):千万不要直接执行 pip install -r requirements.txt。 该插件的 requirements 里有 git+https://github.com/facebookresearch/sam2,pip 为了构建它会去下载一整个 GPU 版 torch(实测 554 MB 级)来替换你现有的 torch——本次是靠哈希校验失败才没装成,否则环境当场就废了。正确的做法是跳过 sam2,只装真正需要的包(你少掉的只是 SAM2 功能,脸部修复用 YOLO 检测框完全够用):


# 1) 先把不能动的包钉死(写进 constraints.txt)
numpy==2.2.6
torch==2.13.0+cu126
torchvision==0.28.0+cu126

# 2) 只装必要依赖(跳过 sam2)
pip install -c constraints.txt \
opencv-python-headless piexif scikit-image dill \
segment-anything ultralytics transformers

# 3) 克隆插件(主包 + Subpack)
git clone --depth 1 https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
git clone --depth 1 https://github.com/ltdrdata/ComfyUI-Impact-Subpack.git

# 4) 下载人脸检测模型(放到 models/ultralytics/bbox/)
curl -L -o models/ultralytics/bbox/face_yolov8m.pt \
https://hf-mirror.com/Bingsu/adetailer/resolve/main/face_yolov8m.pt

# 5) 重启 ComfyUI
systemctl restart comfyui

用 constraints 钉住版本的意义:任何依赖想升级它们会直接报冲突,而不是静默替换。装完务必复核一次 pip list,确认 torch 版本没变。

坑二:判断插件装没装,不能看 HTTP 状态码。 请求一个不存在的节点,接口同样返回 200,只是内容为空对象。必须看返回内容是否为空,并交叉确认插件目录存在、模型目录里有文件:


curl -s http://127.0.0.1:8188/object_info/FaceDetailer # 空对象 = 没装
ls custom_nodes/ | grep Impact # 目录在不在
ls models/ultralytics/bbox/ # 检测模型在不在

坑三:GitHub 可能抽风。 本次遇到 TLS 连接被中断,改用镜像(ghproxy、gitclone 之类)才成功;国内从 HuggingFace 下载模型走 hf-mirror 更稳。

六、工作流参数与耗时(实测)

工作流结构:出图(单阶段 txt2img)→ FaceDetailer 脸修 → 贴回;另外把检测到的脸裁片和检测蒙版各存一份,便于事后核对"检测框到底落在哪、有没有框歪"。

参数取值说明
guide_size512脸裁片放大到 512 px 再重绘,贴近"大脸"训练分布
denoise0.40太低修不动、太高会换脸;0.35–0.45 是可用区间
step / cfg / 采样器30 / 5.5 / euler_ancestral + normal与出图阶段保持一致,便于对比
feather28羽化贴回,接缝不可见
noise_mask / force_inpaint开 / 开只重绘脸区,不污染周围
整条链路耗时241 s / 张出图 116 s + 脸修约 125 s(832×1216)

检测器在 832×1216 全身图上检出的脸框实测为 139×138 px——这个数字反过来印证了第一节的结论:这就是 SDXL 要在 3–4 个 latent 像素里画眼睛的那张脸。脸部重绘不改变画布尺寸,它改变的是"画这张脸时用的有效分辨率"。

七、边界与交付建议

  • 脸修能修结构崩坏(条纹、异色、五官错位),但不能凭空造分辨率:832×1216 里的脸依旧是那个尺寸,贴回后是"干净的小脸",不是"大脸"。
  • 要让脸真正看得清,两条路:① 放大画布(两阶段 hires 到 1040×1520 或更高,再叠加脸修);② 每张交付图附一张脸特写。工程上通常是"交付图走 ①,预览图走 ②"。
  • 检测模型的框偶尔会落在"额头+头饰"上而不是脸上(尤其是配饰夸张的角色)。所以工作流里把检测蒙版单独存一份、交付前扫一眼,是廉价而有效的兜底。

八、踩坑清单(可直接对照排查)

现象真实原因对策
装插件时 pip 开始下载巨大的 torchrequirements 里的 git 依赖(sam2)需要构建环境跳过该依赖,用 constraints 钉死版本
接口返回 200,但节点用不了不存在的节点也返回 200,内容为空看内容是否为空 + 查插件目录与模型目录
换画幅后出图突然变慢近一倍ComfyUI 换分辨率要重新加载模型同批出图固定画幅;不同画幅分批判
用"清晰度指标"判断脸修好坏,越修越低重绘结果缩放回原尺寸会被抗锯齿平滑,高频指标必然下降看眼区和脸的实际像素尺度 + 目视对照,别只看数值
自动检测框位置飘古典检测器在动漫脸上误检率高用专用人脸检测模型,并保存蒙版人工复核

九、小结

把这件事压缩成四句话:

① 全身图脸崩是像素问题,不是模型问题。 脸只有 87–143 px、眼睛 25–30 px,落在 11×11 个 latent 像素里,采样器只能猜。
② 提示词与 hires 都治不了根。 前者管风格,后者只刷清漆。
③ 正解是脸部二次重绘: 检测 → 裁出 → 放大到 512 → 用同一个 LoRA 以 denoise 0.4 重绘 → 羽化贴回;整条链路每张只加约两分钟。
④ 想真正看清脸,只有放大画布这一条路。 在原画布内重绘无法凭空造出分辨率。

完整工作流(出图 + FaceDetailer + 脸裁片/蒙版留档)已在本机 ComfyUI 的工作流列表里,参数就是上表那套,可以直接拉下来改成自己的角色 LoRA 用。有同样问题的欢迎在楼下讨论。

This is a test signature
暂无回复,快来抢沙发吧!
请 登录 后发表回复
hljs.highlightAll();