AI 图片双眼不对齐:5 类原因 + 两遍修眼路径

一只眼高一点、虹膜方向不一致、或一只瞳孔更大?根因是眼睛区域的 latent 像素太少。先跑一遍修脸,再单独跑一遍修眼就能救回来。

你生成一张人像,缩略图看着没问题,放大一看眼睛微妙地不对:一只比另一只高几个像素、两个虹膜方向不太一致、或者一只瞳孔明显更大。原因很直接:在 SDXL 默认 1024x1024 的半身像里,眼睛区域在 latent 空间里只有大约 50x30 像素,模型已经没有分辨率预算去把对称的五官锁死了。

最快的修法(对大多数人有效):在基础图出完之后跑两遍 ADetailer / FaceDetailer——第一遍用 face_yolov8n.pt、denoise 设 0.4,把整张脸在全分辨率下重建一次;第二遍只针对眼睛(用 mediapipe_face_mesh_eyes_only 或 Civitai 上的眼睛检测模型),并把 Mask merge mode 设成 Merge,这样两只眼睛会被一起重绘、保持一致。顺序很关键:先修脸,再在干净的脸里精修眼睛。

你属于哪一类?

症状最可能的原因跳到
脸在画面里很小、整张脸都糊脸的 latent 分辨率太低原因 1、Step 1
只有竖图 / 9:16 才出现眼睛漂移非方形长宽比原因 2、Step 5 预防
每张图眼睛都错、工作流里没有脸部节点完全没有脸 / 眼睛 pass原因 3、Step 1-2
降低 LoRA 权重后眼睛就正常风格 LoRA 把五官压歪了原因 4
提高步数后眼睛改善采样不足原因 5

常见原因

按命中率从高到低。

1. 脸在 latent 空间里太小

SDXL 默认 1024x1024 渲染一张半身像时,眼睛区域大约只有 50x30 像素。模型是在那个分辨率下决定眼睛位置的,根本不可能把两个瞳孔放到亚像素级精确。

如何判断:放大看脸。如果脸在画面里占比不到 30% 左右,就属于”低分辨率脸”区间,眼睛漂移几乎是必然。

2. 竖图或非方形长宽比

SDXL 的原生分辨率是 1024x1024(约 105 万像素)。当你渲染 832x1216 或 9:16 时,脸被压进一条窄窄的竖条里,更容易歪、轻微倾斜、或者左右眼高度不一。

如何判断:相同 Prompt、相同 seed,切到 1024x1024 跑一次。如果方图眼睛对齐、竖图就跑偏,那就是长宽比的锅。

3. pipeline 里没有脸 / 眼睛 pass

ComfyUI / Automatic1111 / Forge 的默认文生图工作流不会专门跑一次脸。模型输出什么就是什么。没有专门的脸部细化步骤,眼睛不对齐是常态而不是例外。

如何判断:检查工作流。ComfyUI 里看有没有 FaceDetailer 节点(来自 Impact Pack);A1111 / Forge 里看 Prompt 下方的 ADetailer 面板有没有勾上。两个都没有,你就没有兜底。

4. 风格 LoRA 把五官比例压歪了

强风格 LoRA(尤其是动漫-写实混合或绘画风的 LoRA 在 1.0 及以上权重下)经常会扭曲五官比例。风格盖在基础解剖结构上,把眼睛位置带偏。

如何判断:相同 seed,把 LoRA 权重从 1.0 降到 0.6 重生成。如果眼睛自己修正了,就是 LoRA 过力。

5. 步数太少或采样器选得不对

Euler aDPM++ 2M Karras 这类采样器一般要 25-35 步才能把精细解剖跑完。如果你用 turbo / lightning 采样器只跑 15 步,模型还没把五官细化完就停了。

如何判断:同 seed 把步数从 20 提到 35。如果眼睛改善,就是采样不够。

最短修复路径

Step 1:加一遍 face-detailer pass

A1111 / Forge 里展开 ADetailer 面板并勾上(这个扩展由 Bing-su 开发,没有的话去 Extensions 装一下);ComfyUI 里挂一个 ComfyUI-Impact-Pack 的 FaceDetailer 节点。第一个标签 / 第一遍参数:

ADetailer model:        face_yolov8n.pt
Detection confidence:   0.3
Inpaint denoising:      0.4   (0.35-0.45 区间;默认 0.5 可能改掉人物身份)
Mask blur:              4
Inpaint width/height:   1024  (不是基础渲染尺寸)
Sampler steps:          20-25,采样器和基础一致

detailer 会先裁出脸、放大、在全分辨率下只重绘脸、再合成回去。眼睛区域这下拿到了完整的 latent 预算。在 ComfyUI 里,如果重绘的脸贴不回原图,调一下 bbox_crop_factor(试试 1.5)和 bbox_dilation,让蒙版更贴合检测到的区域。

Step 2:再加一遍只针对眼睛的 pass

整脸 pass 能修掉大部分情况,但顽固的瞳孔 / 虹膜不一致需要单独处理眼睛。ADetailer 里切到 2nd 标签加一个眼睛检测器;ComfyUI 里再串一个 FaceDetailer(或 DetailerForEach),用眼睛分割模型。

第二遍模型:        mediapipe_face_mesh_eyes_only   (ADetailer 自带)
                  或 Civitai 上的眼睛模型(如 "Eye Detailer/Segmentation"、
                  "Eyeful")来获得更紧的蒙版
Confidence:        0.35
Mask merge mode:   Merge        <-- 关键:把两只眼睛当成一个蒙版一起重绘
Inpaint denoising: 0.35-0.45
ADetailer 提示词:   matching pupils, symmetric eyes, both eyes same size, sharp iris detail

Mask merge mode = Merge(在 ADetailer 的 Mask preprocessing 里)是保证两只眼睛一致的关键——不开它的话,每只眼睛会被独立重绘,可能又各走各的。这一遍只修眼睛的 pass,是针对”双眼不对齐”这个具体症状最高杠杆的一步。

Step 3:face-restore 兜底(CodeFormer / GFPGAN)

如果你加不了 detailer pass(比如只有 Extras / 放大流程),退一步用 face-restore 模型。注意权重方向——绝大多数人会搞反:

A1111 "CodeFormer weight (fidelity)" 滑块:
  0 = 修复效果最强(最锐,但可能改掉身份、抹平皮肤)
  1 = 效果最弱(最接近原图)
  推荐:0.5-0.7  (越接近 1 越能保住质感 / 身份)

GFPGAN visibility: 0.5-0.8

注意:这就是命令行版 CodeFormer --fidelity_weight 参数里的同一个 w 值——w=0 是质量最高(修复最强,可能改掉身份)、w=1 是保真度最高(最接近原图)。A1111 直接把滑块值原样传给 CodeFormer,所以值越高,修得越温和、越忠实于原图。这俩模型是在对齐过的人脸数据集上训的,能修正眼睛对称和瞳孔大小,但修复时会顺带平滑皮肤——所以别把效果拉满。

Step 4:自动修不好时手动局部重绘

两遍都救不回来的图:

  1. 把图扔进 Automatic1111 / Forge 的 img2img → Inpaint
  2. 只蒙住眼睛区域,Mask blur 设 8
  3. Denoising strength 设 0.45
  4. Inpaint area 选 “Only masked”,Only masked padding 设 32
  5. Prompt 改成 symmetric eyes, matching pupils, both eyes same size, looking at camera, sharp iris detail
  6. 一次生成 4 张挑最干净的一张

Step 5:生成时就预防

正向 Prompt 里加:

symmetric face, both eyes aligned, matching pupils, perfect eye anatomy, sharp iris detail, eye contact

负向 Prompt 里加:

asymmetric eyes, mismatched pupils, lazy eye, cross-eyed, heterochromia, different iris color, droopy eyelid

这些提示词本身解决不了分辨率问题,但能让模型在 detailer 兜底前先选个更好的默认。

如何确认修好了

  • 用 100%(全分辨率)打开图,别看图库缩略图。
  • 重点检查三件事:眼睛高度(脑补一条水平线,两个内眼角应该都落在线上)、瞳孔大小(比直径)、虹膜 / 视线方向(两眼应朝同一方向)。
  • 把图左右翻转。你已经看习惯、不再注意的不对称,在镜像副本上会重新跳出来——镜像后还是对的,才是真对称。

预防建议

  • 每张人像默认就启用 face-detailer / ADetailer,存进默认工作流或 preset,永远别裸出图。
  • 近景人像再常备一遍只修眼睛、Mask merge mode = Merge 的 pass。
  • 竖图先在 1024x1024 出图再纵向扩图,不要直接走 832x1216。
  • CodeFormer 效果保持适中(A1111 权重 0.5-0.7),永远不要把皮肤纹理抹掉。
  • 风格 LoRA 权重上限压在 0.7-0.8,给基础解剖结构留空间。

常见问题

为什么只有近景人像眼睛会坏,全身图反而看着没事? 全身图把整张脸——连同两只眼睛——塞进很小一块 latent 空间,模型根本没尝试去画精细的眼睛细节,你也就没注意到。近景给了眼睛足够像素,错误才变得显眼。两者都能靠 face / 眼睛 detailer pass 改善,只是近景把毛病放大了。

ADetailer 的修脸 pass 跑了,眼睛还是不对,怎么办? 这正是要加第二遍、只修眼睛的 pass 的时候(Step 2)。用 mediapipe_face_mesh_eyes_only 或 Civitai 的眼睛检测模型,把 Mask merge mode 设成 Merge,再加一个针对眼睛的 ADetailer 提示词。把两只眼睛当一个合并蒙版重绘,才能阻止它们又各走各的。

眼睛 pass 的 denoising 设多少? 保持在 0.35-0.45 区间。FaceDetailer 默认的 0.5 做通用清理没问题,但可能改掉人物身份;更低的 denoise 能修结构(眼睛不对齐、瞳孔大小错)同时保住你生成的那张脸。

光靠 “Restore faces”(CodeFormer/GFPGAN)能修好吗? 经常能修一部分,但它会平滑皮肤、可能让整张图变软。A1111 里 CodeFormer 权重滑块和直觉相反:0 是效果最强、1 是最温和,所以用 0.5-0.7 才能保住质感。针对性的 ADetailer / 局部重绘眼睛 pass 更干净,因为它只动眼睛。

这是 ComfyUI 独有还是 A1111 独有的问题? 都不是——这是基础扩散模型的分辨率限制,所以 ComfyUI、Automatic1111、Forge 和大多数 SDXL/SD 流程里都会出现。修法(专门的脸 pass 加眼睛 pass)在它们里都有:ComfyUI 用 FaceDetailer,A1111/Forge 用 ADetailer。

相关阅读

外部参考:ADetailer (Bing-su) on GitHubComfyUI-Impact-PackCodeFormer

标签: #ai-image #排查 #anatomy #face-restore