Midjourney 出图很好看,但有一个很影响体验的问题:局部细节一放大就容易碎。头发碎成一片噪点、手指多出来一两节、衣服纹理像破布、皮肤跟磨砂一样。你重新抽卡又未必能抽到满意的构图,沿用原提示词再生成,出来的可能根本不是同一张图。
这次我们来看一个更省事的处理思路:在 ComfyUI 里,用一套不需要写提示词的工作流,直接对 Midjourney 生成的破碎细节做修复。核心做法是放低重绘幅度,配合 ControlNet tile 锁住原图结构,再用放大模型重新刻画纹理。整个过程不用重新设计提示词,不用重抽卡,只需要把你想要修复的图丢进来,跑一遍工作流,重点观察降噪幅度和 tile ControlNet 是否生效。
这篇文章会从“破碎细节到底怎么来的”讲起,再到 ComfyUI 环境准备、工作流节点接法、修复效果验证、接口 API 调用和批量修复,最后给出一套通用的排查清单。如果你已经在用 ComfyUI,或者手头有一堆 Midjourney 需要局部修复的图,这篇可以直接按步骤操作。
1. 核心能力速览
先交代这套工作流的关键参数和适用边界,方便你判断值不值得往下读。
| 能力项 | 说明 |
|---|---|
| 项目类型 | ComfyUI 图像修复与放大工作流 |
| 输入素材 | Midjourney 或其他 AI 生成的图片、摄影图、重绘后期图 |
| 核心功能 | 免提示词修复破碎细节、纹理重绘、局部重绘、放大重构 |
| 主要节点 | Load Image、VAE Encode、ControlNet tile、KSampler、VAE Decode、Ultimate SD Upscale 或等效放大节点 |
| 是否写提示词 | 正向提示词留空,负向可留默认或放少量通用负面词 |
| 关键参数 | denoise 约 0.3-0.5,CFG 约 4-7,放大模型按本机显存选择 |
| 显存需求 | 需按实际模型版本测试;tile ControlNet 可在较低显存环境运行 |
| 支持平台 | Windows / Linux 下部署 ComfyUI 均可 |
| 启动方式 | 本地命令启动、秋叶一键整合包、API 服务启动 |
| 是否支持 API | 支持,ComfyUI 原生 /prompt 接口 |
| 是否支持批量任务 | 支持,可批量丢图进队列 |
| 适合场景 | Midjourney 成图精修、AI 图片放大、纹理修复、细节增强 |
需要说明的是:这套工作流的价值并不在于“发明了一个新模型”,而是把已有的图生图、ControlNet、放大模型组合成一条固定流程。你不需要对每张图重新写提示词,也不需要在 Photoshop 里一笔一笔修。
1.1 哪些情况适合用
- 手指、眼睛、牙齿等部位在放大后出现明显畸形。
- 头发、皮肤、布料纹理呈现“破碎感”,像细碎噪点拼出来的。
- 构图满意,但分辨率不够,放大后出现涂抹感。
- 同一个角色、同一套场景,不想为了修复某个局部而重新生成。
- 批量整理一批 Midjourney 图片,希望统一修复后再进素材库。
1.2 哪些情况不适合用
- 整张图模糊、构图失败、主体完全错位,这种请重新抽卡,修复成本反而高。
- 需要严格保留原图每一个像素不动,只处理某个极小区域,应该用局部重绘 Mask。
- 对大幅细节有专业摄影级要求,还是需要进入 Photoshop 或 Lightroom 做精细控制。
2. 破碎细节是怎么产生的
很多人以为 Midjourney 输出的图可以直接用,但放大到 200% 以上就会发现局部经不起看。破碎感的来源主要有四个。
第一,Midjourney 本身是在潜空间里生成图像,最终解码成像素图时,高频细节会被模型“猜”出来。模型猜得准的区域就很清晰,猜不准的区域就产生伪影和噪点,尤其集中在手指、文字、复杂纹理这些难以建模的部位。第二,放大过程中如果使用简单的邻近插值或普通放大算法,边缘会出现锯齿、模糊和错误纹理。第三,降噪器在生成阶段会优先保证整体构图,对局部小结构的约束比较弱,所以同一种材质在不同区域会出现不一致的破碎表现。第四,当你把图送去给其他工具二次生成时,如果重绘幅度太高,模型会加入自己的想象,导致原结构被破坏。
理解这一点,就能明白为什么“免提示词修复”这条路可行:既然破碎细节是模型在潜空间里“猜”得不准确的结果,那就让模型在低重绘幅度下再猜一次,把局部猜得更合理。同时用 ControlNet tile 把原图的结构、边缘、空间关系锁住,避免第二次猜测时改变构图或物体位置。
2.1 为什么不是简单放大
如果只是把分辨率调高,破碎区域不会自动变好,只会被放大得更大。修复的关键步骤是“重绘”,不是“放大”。放大只是让模型有更多像素空间去重新生成纹理,真正改变破碎状态的是 KSampler 里的降噪过程。所以我们看到很多修复工作流会把放大和重绘做在一起:先解码回像素,再用放大模型提升分辨率,然后以低降噪幅度再做一次图生图。
3. 免提示词修复的原理
“免提示词修复”看起来像魔法,实际原理可以拆成三个部分。
3.1 空提示词 + 低降噪,只重绘细节不重写构图
正常的文生图,提示词决定了画面里有什么。修复破碎细节时,如果我们继续写提示词,模型容易受文字影响,把原有构图带偏,比如把人物衣服改掉、背景多出东西。空提示词的方式等于告诉模型:不要根据文字想象画面,只根据输入图像本身的特征来重绘。
低降噪数值是关键。denoise 越低,输出越接近输入图;denoise 越高,模型重画的程度越大。修复破碎细节时,一般从 0.3 开始,太高会把原图改得面目全非,太低则无法清理破碎区域。
3.2 ControlNet tile 锁结构
ControlNet tile 是一个专门处理“输入图结构保持”的控制模型。它会把原图切成 tile 块,提取里面的空间关系,并在采样阶段约束模型不要改变这些结构。有了它,哪怕你用的是空提示词,模型也会尽量保留原图的人物轮廓、位置、边缘和空间布局。这样可以放心把降噪幅度提到 0.4 甚至 0.5,让模型有足够自由去修复细节,同时不会把画面结构重画一遍。
3.3 放大模型负责生成新纹理
重绘过程中,模型把破碎的纹理区域重新生成了一遍。为了确保生成后的纹理足够细腻,我们通常会先做一次放大,让模型在高分辨率下重绘。常见的做法是使用 Ultimate SD Upscale 节点,配合 4x-UltraSharp 之类的放大模型,把图片放大 1.5 到 2 倍,然后再进入 KSampler 做低降噪重绘。放大后再重绘,比先重绘再放大效果好很多,因为模型在更高像素空间里有更多信息来校准细节。
这三个部分组合起来,就是一套典型的“无提示词修复”工作流:加载图片 → 放大 → 图生图低降噪重绘 → 输出修复结果。
4. ComfyUI 本地部署环境准备
在开始搭工作流之前,先确保 ComfyUI 能正常启动。这里区分两种典型方式:一种是用整合包,一种是手动安装。
4.1 使用整合包快速启动
如果你之前没装过 ComfyUI,搜索“秋叶 ComfyUI 整合包”可以找到包含 Python、PyTorch、模型管理工具的打包版本。整合包的好处是依赖隔离、模型目录清晰,适合第一次接触的用户。启动时进入一键启动脚本,等待命令行出现本地地址,然后在浏览器打开即可。
http://127.0.0.1:81884.2 手动部署通用步骤
手动部署的思路是先装 Python 环境,再用 pip 安装依赖,最后从源码启动。
git clone https://github.com/comfyanonymous/ComfyUI cd ComfyUI建议创建独立的 Python 虚拟环境再安装依赖。安装完成后,调用 main.py 启动服务。
python main.py --listen 127.0.0.1 --port 8188如果使用 Windows 且需要调用本地显卡,先确认 PyTorch 版本和 CUDA 版本匹配。搜索“ComfyUI 本地部署加速器”可以找到一些针对国内下载 PyTorch 和模型文件的加速方法,这里不展开。
4.3 建议准备的文件
- 一个可用的 Stable Diffusion 模型,例如基于 SD1.5 或 SDXL 的二次元或写实模型。
- 对应的 ControlNet tile 模型文件,需要放到 ComfyUI/models/controlnet 目录。
- 一个放大模型,例如 4x-UltraSharp 或 4x_NMKD-Siax,放到 ComfyUI/models/upscale_models 目录。
- 如果需要面部修复,可以准备 FaceRestore 相关节点。
4.4 显存与显卡要求
这套工作流对显卡没有特别夸张的要求。SD1.5 级别的模型加上 ControlNet tile,8GB 显存就能跑得很舒服;如果使用 SDXL 模型,建议 12GB 以上显存,或者使用带 tiling 的低显存模式。实际占用需要根据本机测试确认,因为放大模型、采样分辨率、是否启用 FaceRestore 都会直接影响显存。启动时可以观察任务管理器或 ComfyUI 控制台的显存日志,不要只看启动时占了多少,要看 KSampler 开始执行那一段的峰值占用。
5. 工作流构建与一键导入
ComfyUI 的界面是节点式的,我们需要把“加载图片、放大、编码、ControlNet、采样、解码、保存”这些节点连成一条链路。下面给出一个完整的工作流描述,并且会拆成节点序列。
5.1 节点序列总览
这是从输入到输出的主干链路:
Load Image -> Image Scale / Upscale Model -> VAE Encode -> ControlNet Apply -> KSampler -> VAE Decode -> Save Image其中 ControlNet Apply 需要两条输入:一条来自 Load Image,另一条来自 ControlNet Loader。
5.2 分支链路细节
第一步,加载图片。使用 Load Image 节点,选择需要修复的图。
第二步,放大(可选)。如果原图分辨率偏低,可以先做一次放大。推荐使用 Ultimate SD Upscale 节点,或者先通过 UpscaleModelLoader 加载放大模型,再配合 ImageUpscaleWithModel 节点。
UpscaleModelLoader -> ImageUpscaleWithModel -> 放大后的图像第三步,潜空间编码。把图像用 VAE Encode 转换成潜空间数据,KSampler 没法直接处理像素图。
第四步,加载 ControlNet。使用 ControlNetLoader,model 选择 tile 相关的模型文件;ControlNetApplyAdvanced 或 ControlNetApply 节点把图像条件附加到采样过程。
第五步,KSampler 采样。正向提示词留空,使用 Claude 的最终版本进行编辑。确保保留所有章节标题、描述性内容、链接、图片引用的 Markdown 设置,不改变结构与格式。直接返回完整翻译结果。Claude 最终版,修改中文格式:
正向提示词留空,负向提示词可以给少量通用负面词,例如“worst quality, jpeg artifacts, blurry”,也可以直接留空。steps 从 20 到 30 之间选,cfg 从 4 到 7 之间选,denoise 从 0.3 到 0.5 之间选。采样器可以用 dpmpp_2m,调度器用 karras。
第六步,解码输出。KSampler 输出潜空间数据,经过 VAE Decode 转成图像,最后连接 Save Image 保存。
5.3 关键参数记忆表
| 参数 | 推荐值 | 作用 |
|---|---|---|
| steps | 20-30 | 采样步数,步数越高细节越稳定 |
| cfg | 4-7 | 提示词引导强度,空提示词下可偏低 |
| denoise | 0.3-0.5 | 重绘幅度,破碎严重时调高 |
| ControlNet strength | 0.6-0.9 | 结构锁定强度,越高越保构 |
| 放大倍数 | 1.5-2.0 | 放大过大容易产生额外伪影 |
| upscale model | 4x-UltraSharp 等 | 决定放大后的纹理质量 |
5.4 工作流 JSON 导入思路
ComfyUI 工作流可以通过“Load”按钮导入 JSON 文件,也可以用“Export API”导出后,用 API 方式调用。手动搭建时,只要保证节点之间的连线匹配,不需要强行套别人的 JSON。搜索“ComfyUI 工作流分享”时,你会发现很多修复类工作流都长这样:要么是 tile + upscale,要么是 face restore + upscale,套路基本一致。
5.5 需要的自定义节点
- 如果你用的整合包自带了 Custom Nodes 管理,安装 “ComfyUI-Impact-Pack” 或 “ComfyUI_UltimateSDUpscale” 可以降低工作流搭建成本。
- 如果只需要基础修复,原生的 ImageUpscaleWithModel 加 KSampler 就够用,不一定非要自定义节点。
6. 修复效果验证流程
搭建好工作流之后,不要直接批量跑图。先把一张典型的破碎图拿来做验证。
6.1 测试图选择
选一张同时具备以下特征的图效果最直观:人物手指附近有破碎、头发纹理噪声明显、放大后局部有涂抹感。Midjourney 生成图放大到两倍左右,很容易找到这类区域。
6.2 操作步骤
- 第一步,把测试图拖入 ComfyUI 的 Load Image 节点。
- 第二步,确认正负提示词都为空,或者只保留负向通用词。
- 第三步,把 denoise 设到 0.35,先跑一遍。
- 第四步,对比输出图和原图,重点看手指、头发、皮肤纹理是否变平滑。
- 第五步,如果整体变化不明显,把 denoise 提高到 0.45 再试。
- 第六步,如果构图被改了,把 ControlNet strength 提高,或者降低 denoise。
6.3 判断成功的标准
成功的修复应该满足三个条件:破碎区域趋于自然、整体构图和原图基本一致、没有新增明显的伪影和色块。如果你发现输出图虽然细节干净了,但人物五官变了、背景物体移位了,说明重绘幅度太高或 ControlNet 强度太低。
6.4 常见失败现象
| 失败现象 | 原因 | 调整方向 |
|---|---|---|
| 细节变干净但人物不像 | denoise 过高 | 降到 0.3-0.35 |
| 输出图几乎没变化 | denoise 过低或 ControlNet 过强 | 提高 denoise,降低 CN 强度 |
| 出现大面积色块 | 放大模型不匹配 | 换模型或降低放大倍数 |
| 显卡显存不足 | 分辨率太大或模型太大 | 先用小图测试,或开启低显存优化 |
| 节点报错 | 缺少自定义节点或 ControlNet 文件未放好 | 检查节点安装和模型目录 |
7. 接口 API 与批量修复调用
ComfyUI 本身开放了 HTTP 接口,可以理解为一个本地部署的图像生成服务。如果你想给一堆 Midjourney 图片做批量修复,不需要手动在界面里一张张拖图,直接写脚本调用接口就行。
7.1 启动 API 服务
启动时只需要保持 ComfyUI 在运行,默认接口就是可用的。
python main.py --listen 127.0.0.1 --port 81887.2 通过 WebSocket 或 /prompt 接口提交任务
ComfyUI 的 API 调用方式是先通过工作流的 API 格式 JSON,把客户端 id 设置好,再 POST 到 /prompt 接口。下面给出一段通用示例,你需要替换成自己的工作流 JSON 和图片路径。
import json import urllib.request def queue_prompt(prompt, client_id): data = json.dumps({ "prompt": prompt, "client_id": client_id }).encode("utf-8") req = urllib.request.Request( "http://127.0.0.1:8188/prompt", data=data, headers={"Content-Type": "application/json"} ) with urllib.request.urlopen(req) as resp: return json.loads(resp.read()) # 这里的 prompt 应该是你在 ComfyUI 中导出后的 API 格式工作流, # 并且把 LoadImage 的 image 参数改成你本机的输入文件名。 api_prompt = { "3": { "class_type": "LoadImage", "inputs": { "image": "mj_broken_001.png" } }, "5": { "class_type": "KSampler", "inputs": { "seed": 42, "steps": 25, "cfg": 5.0, "sampler_name": "dpmpp_2m", "scheduler": "karras", "denoise": 0.4, "model": ["10", 0], "positive": ["4", 0], "negative": ["4", 1], "latent_image": ["9", 0] } } } print(queue_prompt(api_prompt, "test-client"))注意:API 格式的 JSON 必须从 ComfyUI 工作流编辑器里导出,直接手写容易漏节点之间的引用关系。
7.3 批量目录处理思路
批量处理时,建议写一个目录遍历脚本,对输入目录里的每一张图都调用一次 /prompt 接口,然后把输出文件重命名保存。
import os import json import time import urllib.request input_dir = "./input_mj" output_dir = "./output_fixed" os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): if not filename.lower().endswith((".png", ".jpg", ".jpeg")): continue # 用该文件名替换工作流 JSON 中的 LoadImage 输入 # 并调用 /prompt 接口 print("submitting:", filename) time.sleep(1)实际使用中,你还需要监听 WebSocket 来判断任务是否完成,避免连续提交导致显存突发占用。更稳妥的工程做法是:用一个任务队列,一次只跑一个任务,完成后再提交下一个。
7.4 失败重试建议
- 网络请求超时:调大 urllib 的超时时间,或者使用 requests 库,timeout 设置到 120 秒。
- 显卡显存不足:批量队列里串行执行,不要同时提交多个任务。
- 输出图像没生成:检查工作流里是否连接了 Save Image 节点,并确认输出目录有写入权限。
8. 资源占用与性能观察
不少用户第一次跑这套工作流,最担心的是显存是否够用。与其给一个固定数字,不如先掌握观察方法。
8.1 如何观察显存占用
ComfyUI 控制台会在每个节点执行时输出一些日志信息,但显存占用通常要借助外部工具观察。Windows 下可以直接打开任务管理器,在“性能”栏里看 GPU 显存曲线。跑 KSampler 时显存会明显抬升,跑 VAE Decode 时同样会有一个峰值。如果你用的是 Linux 服务器,用nvidia-smi观察更直接。
8.2 影响性能的因素
- 分辨率:分辨率越高,潜空间张量越大,显存占用上升明显。
- denoise:对显存影响不大,但会影响采样耗时。
- ControlNet:会增加一次额外的模型推理,显存占用会小幅上升。
- 放大模型:放大倍数越大,后续 KSampler 处理的像素越多,耗时越长。
- 批量数:批量跑多张图时显存占用接近线性增加,建议逐张跑。
8.3 降低显存占用的通用方法
- 先用低分辨率测试工作流,确认效果后再上高分辨率。
- 调整 ComfyUI 的启动参数,例如
--lowvram或--novram,适合显存较低的环境。 - 使用支持 tile 的 ControlNet 时,系统会在局部块中处理,显存占用比整图处理更稳定。
- 放大倍数不要一下拉满,先用 1.5 倍测试。
- 避免同时打开多个 ComfyUI 页面重复生成任务。
9. 常见问题与排查方法
如果你运行这套工作流时遇到启动失败或节点报错,可以按下面这个表格快速定位。常见错误在 ComfyUI 社区里搜“节点在执行过程中发生错误”就能看到大量类似案例。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后页面打不开 | 端口被占用或服务未启动 | 检查控制台日志和端口状态 | 更换端口或重启服务 |
| 缺少 ControlNet 模型文件 | 模型没有放到 models/controlnet 目录 | 查看启动日志的模型列表 | 下载对应模型并放到正确目录 |
| tile 节点报错 | ControlNet 版本不兼容或节点未安装 | 查看具体报错堆栈 | 更新节点或换用 ControlNetApply 简单版 |
| 输出图模糊 | 放大倍数不够或 denoise 太低 | 对比原图放大区域 | 提高放大倍数或 denoise |
| 显存不足 | 分辨率过高或模型过大 | 观察显存峰值 | 开启低显存模式,降低分辨率 |
| API 调用返回 400 | 工作流 JSON 格式不对 | 检查 JSON 里节点 ID 引用 | 从 ComfyUI 导出 API 格式后再改参数 |
| 批量任务卡住 | 串行队列未做任务判断 | 查看脚本日志 | 增加 WebSocket 完成监听或超时重试 |
| 秋叶整合包启动失败 | Python 依赖被破坏或模型路径不对 | 检查整合包日志 | 重新初始化整合包环境,或手动安装依赖 |
9.1 秋叶整合包使用特别说明
如果你用的是秋叶一键整合包,启动前先确认整合包版本是否自带 ControlNet 自定义节点和放大模型。很多整合包默认只带了基础组件,你需要通过“自定义节点”菜单补装。安装自定义节点后,如果 ComfyUI 提示缺少依赖,可以进整合包目录手动执行一次 pip install,把控制台报错的包名装进去。
9.2 显卡驱动与 PyTorch 版本
如果 KSampler 执行时报 CUDA 相关错误,优先检查 PyTorch 版本和显卡驱动是否匹配。ComfyUI 官方对 PyTorch 版本有明确建议,升级驱动或者用 CPU 模式跑一遍,可以快速判断是不是显卡环境问题。CPU 模式速度很慢,但可以用来验证工作流逻辑是否正确。
10. 最佳实践与合规边界
这套修复工作流本质上是“用 AI 重绘原有 AI 生成图”,因此在真实项目里,有几条工程和合规建议值得记下来。
10.1 工程侧建议
- 第一次测试,用小图、低 denoise、低采样步数,先确认工作流能完整跑通。
- 保留一套最小可运行配置,例如固定用 SD1.5 模型,固定用 0.4 denoise,遇到项目再微调。
- 输入素材、输出结果、工作流 JSON 分目录存放,不要混在一起。批量任务建议输出文件名包含原文件名,方便回溯。
- 批量任务一定要有日志和失败重试机制。最简单的方式是记录每个文件名对应的提交时间和返回状态码。
- API 服务只监听 127.0.0.1,不要直接暴露到公网。ComfyUI 的接口可以执行任意工作流,暴露到公网有被滥用的风险。
- 定期清理输出目录,防止大量图片堆积导致磁盘写满。
10.2 合规与授权边界
- Midjourney 生成图、真人照片、他人插画,修复前必须确认你是否有使用和修改的权利。
- 如果图片包含真实人物、品牌元素、受版权保护的素材,需要获得相应授权。
- 修复肖像类图片时,注意不要被误用为生成欺骗性内容。建议在项目文档中标注“AI 修复/后期处理”的用途。
- 不要用这套工作流去处理涉及敏感内容的图片,也不要对他人作品进行未经许可的商业化修改。
10.3 什么时候停止修复
修复不是越重越好。当输出图已经开始偏离原构图,或者局部出现新的纹理错误时,说明重绘过猛。工程上建议固定一个“接受阈值”:与原图的结构相似度、局部纹理自然度、人物五官一致性。三者有两个达标,就可以停在这里,不必追求完美。
11. 总结与后续扩展
这次我们完整拆解了“免提示词修复 Midjourney 破碎细节”这套 ComfyUI 工作流。它的核心价值不是某个神秘模型,而是把空提示词、低降噪、ControlNet tile、放大重绘这几个成熟方法组合成一条可复用的流程。最值得先验证的功能就是 0.35 到 0.45 的 denoise 下,破碎区域有没有变自然,构图有没有保住。
最容易踩的坑有三个:一个是 denoise 太高导致人物五官被重画;一个是 ControlNet tile 文件没放对目录导致节点报错;还有一个是批量任务里连发太多请求直接爆显存。把这三个问题控制住,这套工作流就能稳定服务你的日常修图。
后续可以继续扩展的方向不少:把 FaceRestore 节点接进来,专门修复人脸细节;接入更高质量的放大模型,例如适合写实图片的 4x 模型;也可以把工作流导出为 API 格式,接入你现有的图片处理平台,做成自动化的批量修复服务。建议先把本文的节点链路手工搭一遍,确认效果后,再考虑接口化和工程化。
这套思路同样可以迁移到 Stable Diffusion 生成的图片、老照片放大、游戏截图纹理修复等场景。区别只在于输入图的分辨率和破碎程度,节点结构和参数逻辑基本一致。收藏备用,下次遇到 Midjourney 局部细节翻车,不需要重新抽卡了。