做视觉的同行大概都遇到过这种憋屈事:一张图生成得挺好看,可要把它抠出来换个背景、单独调个颜色,就得回 Photoshop 里一点点抠边缘,头发丝、纱裙、玻璃杯这种半透明材质,抠一次掉半条命。Layer Diffusion这套思路做的就是把这件事前置到生成阶段——模型直接吐出一张带 alpha 通道的透明图层,PNG 打开就是抠好的,前景、背景可以分开存、分开用。我这段时间在Ubuntu上把这套流程从零跑通,中间踩的坑不少,有些是版本号咬得太死,有些纯粹是权重文件放错目录。这篇就把整套跑通路径、参数取值的依据、以及那些文档里不会写的报错处理,一次讲透。不管你是刚接触扩散模型、只会照抄命令的新手,还是已经部署过几套生成环境的熟手,下面这套流程都能直接拿去用。
1. 先把概念理清:Layer Diffusion 到底解决了什么
动手之前得先明白这套东西和普通文生图的差别在哪,不然你会在参数面板前一脸茫然,不知道为什么明明跑出了图,背景却还是一整块白的。
1.1 透明图层与传统文生图的本质差别
常规的文生图模型输出的是一张 RGB 三通道图像,它把所有东西"压平"在一张画布上。模型内部对"前景"和"背景"没有任何区分,你让它画"一只杯子放在木桌上",它给你的是杯子和桌子混在一起的一坨像素。想分层,只能靠后期抠图。而 Layer Diffusion 的做法是在解码阶段增加一个透明度输出通路,让模型在生成过程中就学习"哪些像素属于主体、哪些属于背景、边缘的半透明程度是多少"。
落地形式通常是两个组件配合:一个基础生成模型负责画内容,一个专门的透明层解码器负责把潜空间特征翻译成 RGBA 四通道图像。你可以把前者理解成画师,后者理解成"自动抠图师",两个人在同一张画布上同时工作。
这个差别带来的实际收益很直接。第一,边缘质量远好于后期抠图,尤其是毛发、纱质、玻璃、烟雾这类半透明边缘,因为是模型在生成时就知道边界在哪,而不是事后再猜。第二,一次生成可以同时拿到前景图层和背景图层,做合成、做换背景、做 UI 素材都省事。第三,输出是标准 PNG 带 alpha,扔进任何支持透明通道的软件都能直接用,不用再转格式。
注意:透明图层不等于"抠得干净"。半透明材质(比如磨砂玻璃、水面倒影)在 alpha 通道上本来就是渐变的,看起来"糊"是正常物理表现,不要误判成模型坏了。
1.2 三类落地路径的横向对比
社区里跑这套东西,主流有三条路,各自适合的人群和场景完全不同。我把它们的关键差异列了个表,你可以直接对号入座。
| 路径 | 上手难度 | 灵活性 | 显存占用 | 适合人群 |
|---|---|---|---|---|
| 节点式图形界面(通用工作流平台) | 低 | 中高 | 中 | 想快速出图、做素材的人 |
| 命令行脚本直接调推理库 | 中 | 高 | 低 | 要批量跑、要接自己代码的人 |
| 传统网页界面扩展形式 | 低 | 中 | 中高 | 已有一套网页界面环境的人 |
节点式方案的好处是所见即所得,拖几个节点连上线就能跑,参数改了立刻看到结果;坏处是环境依赖被平台绑架,平台升级有时会把插件搞挂。命令行脚本最干净,依赖少、显存省、容易塞进自动化流水线,但改个参数得动代码。网页界面扩展胜在熟悉,缺点是这类扩展对主程序版本很敏感,版本对不上直接加载失败。
我个人的建议是:第一次跑通走节点式,先把"能出图"这件事确认下来;等流程熟了,再把推理逻辑抽成脚本,做批量处理。下面第 3 章我把两条路都给出来。
1.3 为什么这套东西在 Ubuntu 上跑更省心
同样的代码在 Windows 上跑,你要处理驱动版本、编译工具链、路径分隔符、还有各种依赖包的二进制兼容问题;在 Ubuntu 上,绝大多数 Python 包都有现成的预编译版本,pip install一把过,不用本地编译。GPU 驱动和 CUDA 运行时在 Linux 上的安装路径也更规范,nvidia-smi看到什么版本就是什么版本,不用猜。
另一个实际原因是我要跑批处理。Ubuntu 上写个 shell 循环、挂个定时任务,几百张图跑一晚上,第二天来收结果,这个体验在桌面系统上很难复刻。所以如果你打算把透明图层生成当生产力工具用,而不是偶尔玩两张,Linux 环境是更稳的底座。
2. Ubuntu 环境准备:从显卡驱动到 Python 隔离
环境这块是整个流程里最容易卡住的地方。我见过太多人卡在"torch.cuda.is_available()返回 False"这一步,然后就放弃了。其实绝大多数情况是驱动和运行时版本没对齐,排查起来有明确的路径。
2.1 硬件底线与系统版本选择
显存是硬指标,没有回旋余地。我实测下来的分档是:8 GB 显存能跑 512×512 分辨率、单张生成,勉强够用;12 GB 是比较舒服的档位,可以同时挂着节点式界面和其他工具;16 GB 以上可以尝试更高分辨率或批量。低于 8 GB 不是完全不能跑,但你会频繁遇到显存溢出,得靠一系列降级手段硬撑,体验很差。
系统版本建议用 LTS 版本,两年多一次大版本更替,中间不用操心系统升级把驱动搞乱。内核版本不要太新,太新的内核有时反而没有现成的驱动模块,装起来麻烦。我一般装完系统第一件事就是把软件源更新一遍,然后确认uname -r看到的内核版本和我预期一致。
磁盘空间要留意。基础模型权重通常几个 GB,透明层解码器权重几百 MB 到 1 GB 不等,再加上 Python 环境本身、缓存文件、生成结果,预留 30 GB 以上比较稳妥。如果你的主目录挂在小分区上,记得把模型目录指到空间大的盘上去。
提示:装系统时如果选择了全盘加密或者较小的根分区,后面模型下满了会很麻烦。提前规划好挂载点,比事后搬家省事得多。
2.2 驱动与 CUDA 版本的匹配逻辑
这一步是整个环境里最容易出错的地方,我把逻辑讲清楚。你的机器上有三个"版本"在互相牵制:显卡驱动版本、驱动自带支持的 CUDA 运行时上限、以及你安装的深度学习框架所编译针对的 CUDA 版本。三者关系是:驱动版本决定你能用的 CUDA 上限,框架的预编译包决定了它需要哪个 CUDA 运行时,实际运行时会用到驱动里的兼容层。
实操上不用装完整 CUDA 工具包,装好驱动就够了。用nvidia-smi右上角看到的那个版本号,是驱动支持的最高运行时版本,只要它不低于框架需要的版本,通常就能跑。我常用的组合是驱动版本较新、框架用 11.8 或 12.1 编译的预编译包,这两个组合的生态最成熟,遇到问题的概率最低。
| 框架版本 | 推荐 CUDA 运行时 | 特点 |
|---|---|---|
| 2.0.x | 11.8 | 老而稳,很多老插件还依赖 |
| 2.1.x | 11.8 / 12.1 | 兼容性最好的中间版本 |
| 2.2.x 及以上 | 12.1 | 新特性多,部分插件尚未适配 |
选版本的原则是"跟着你要用的插件走",而不是"越新越好"。我一开始贪新装了最新版框架,结果节点包里有个依赖硬编码了旧版接口,直接报属性不存在。退回 2.1.x 之后一切正常。这类问题在社区里非常常见,遇到莫名其妙的AttributeError或ImportError,第一反应就应该是回退框架版本。
2.3 Python 环境隔离:为什么我坚持用 conda
系统自带的 Python 千万别直接拿来装这些依赖。一是权限问题,装到系统目录里容易污染环境;二是版本问题,很多发行版自带的 Python 版本偏新或偏旧,和你需要的依赖对不上;三是回滚困难,装崩了只能重装系统。
我习惯用 conda 建独立环境,好处是环境之间完全隔离,删掉一个环境不留痕迹,而且可以精确指定 Python 版本。透明图层这套流程涉及好几个对版本敏感的包,隔离环境几乎是必须的。
# 创建独立环境,Python 版本建议 3.10 conda create -n layerdiff python=3.10 -y conda activate layerdiff python -V选 3.10 不是随便说的。3.8 太老,很多新包已经不再支持;3.11 及以上有些包的预编译轮子还没跟上,容易触发本地编译,而本地编译又会因为缺少编译工具链报一堆错。3.10 是当前兼容性最好的甜点版本。
如果你不想用 conda,python -m venv也能用,效果差不多,只是不能指定 Python 版本(取决于系统里有什么)。我两个都用过,conda 在管理多个项目时更省心,venv 更适合塞在项目目录里做便携环境。
2.4 系统级依赖清单与一次装齐的命令
有些库不是通过 pip 装的,而是系统包,比如图像处理需要的底层图形库、解压工具、版本控制工具。这些东西漏装的表现往往很怪,比如导入某个包时报libGL.so.1: cannot open shared object file,看起来像是 Python 的问题,实际上系统库缺失。
我一般在新环境里先跑这一条,把常用的都装齐:
sudo apt update sudo apt install -y git wget curl unzip \ build-essential libgl1 libglib2.0-0 \ libsm6 libxext6 libxrender1 ffmpeg解释几个容易忽略的:libgl1和libglib2.0-0是无界面环境下跑图像库的必备,缺了必报错;libsm6、libxext6、libxrender1这三个是图形界面相关的底层库,某些图像库在导入时会去探测它们;ffmpeg用于处理视频和某些图像格式的读写。build-essential则是给那些没有预编译轮子、需要现场编译的包准备的逃生通道。
注意:无界面服务器上没有显示器,不要去装带 GUI 的完整图形栈,装上面这几个最小的运行库就够。装全了反而会因为显示服务缺失产生新的警告。
装完之后用python -c "import cv2; print(cv2.__version__)"这类命令验证一下,能导入没报错就说明底层库齐了。这一步验证很关键,能省掉后面一半的排查时间。
3. 部署实操:从零把透明图层生成跑通
环境准备好就可以动手了。这一章我把两条路径都写清楚,你可以只挑一条走。
3.1 代码与权重文件的目录规范
目录结构混乱是新手最容易犯的错,也是后面各种"找不到模型"报错的根源。我的建议是一开始就定好规范,模型、代码、输出三个目录分开,互不干扰。
mkdir -p ~/work/layerdiff/{code,models,output} cd ~/work/layerdiff/code模型目录我会再细分成基础模型、透明层解码器、以及可选的风格微调权重三个子目录:
mkdir -p ~/work/layerdiff/models/{base,transparent,loras}为什么要分这么细?因为这类流程通常要切换不同的基础模型试效果,一个模型动辄几个 GB,全堆在一个目录里,找起来崩溃,也不好写脚本批量切换。分开之后,脚本里只要改一个路径变量就能换模型。
权重文件拿到之后,务必确认文件完整性。我遇到过下载中断导致文件只有一半大小的情况,加载时报的是"无法解析 safetensors 文件头"这类含糊的错误。养成习惯:下载完对着预期的文件大小看一眼,差距太大就重新拿。文件名也别乱改,有些加载逻辑是按文件名匹配的,改个名字就认不出来了。
提示:如果你的主目录空间紧张,用软链接把 models 目录指到大容量磁盘上,代码里完全不用改路径。
3.2 依赖安装的三方版本拉扯
这里有三个包在打架:深度学习框架、加速库、扩散模型推理库。它们互相之间有版本约束,装错一个就全盘报错。
先说优先顺序。先装框架,并且用官方源装,不要混用多个软件源,混用是版本冲突的高发原因:
pip install torch==2.1.2 torchvision==0.16.2 \ --index-url https://download.pytorch.org/whl/cu121装完立刻验证,这一步千万别跳过:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"输出应该是版本号加 True。如果是 False,先去看nvidia-smi有没有输出,再确认驱动版本,最后确认你装的是 CUDA 版而不是 CPU 版——很多人装成 CPU 版还不自知,痛苦一整天。
然后是推理库。这里有个坑:推理库更新很快,新版经常会改接口名,而透明层相关的节点包往往还没跟上。我的做法是装一个相对稳定的版本,而不是最新版:
pip install diffusers==0.25.0 transformers==4.36.2 \ accelerate safetensors pillow numpy最后是加速库。这个可选,装了能省显存提速度,但版本不匹配会直接导致生成出全黑图或 NaN。如果你只想先跑通,建议这一步先跳过:
# 可选,装之前务必确认和框架版本匹配 pip install xformers==0.0.23.post1我自己的经验是,第一次跑通不要装加速库,等确认能出图了,再装上去做对比。如果装了之后出图变黑、出现噪点、或者报形状不匹配,直接卸掉回退,不要在这上面死磕。省下的那点显存和时间,不值得搭进去半天排查。
3.3 最小可运行推理脚本
环境齐了,先写一个最小的脚本验证整条链路。这个脚本的目的不是出精品图,而是确认"模型能加载、能推理、能存出带 alpha 通道的 PNG"。
import torch from PIL import Image from diffusers import StableDiffusionPipeline base_path = "/home/yourname/work/layerdiff/models/base" pipe = StableDiffusionPipeline.from_pretrained( base_path, torch_dtype=torch.float16, safety_checker=None, ).to("cuda") prompt = "a glass bottle with water, centered, plain background" image = pipe(prompt, num_inference_steps=25, guidance_scale=6.0).images[0] image.save("/home/yourname/work/layerdiff/output/test_rgb.png") print("shape:", image.size, image.mode)这段跑通了,说明基础生成链路没问题。接下来才是接透明层解码器——把解码器权重加载进来,替换掉原来的图像解码环节,输出就会变成 RGBA。
关键点在于 dtype。基础模型用float16是为了省显存,但透明层解码器有些版本要求float32才能正确输出 alpha 通道。如果混用,常见报错是expected scalar type Half but found Float。解决办法是统一 dtype,或者只对解码器做float()转换。我试过统一用float16,显存省下来了但偶尔边缘会有异常像素;换成float32跑解码器,边缘干净很多,代价是显存多占一点。这个取舍看你显存余量。
还有个容易忽略的细节:透明层输出需要单独保存为 PNG,不能用 JPEG。JPEG 不支持 alpha 通道,存下来背景会变成纯白或纯黑,你会以为模型没生效,其实是格式问题。存图时用image.save(path, format="PNG"),并且确认image.mode是RGBA。
3.4 接入 ComfyUI 节点流:更推荐的日常用法
如果你打算长期用,节点式界面比写脚本舒服得多。整个接入过程分四步,我按实际操作顺序写。
第一步,把节点式平台本身装好并跑通一次普通文生图。这一步不通过就不要往下走,否则出了问题分不清是平台的问题还是插件的问题。
第二步,把透明层节点包放进自定义节点目录,重启程序。重启这一步很多人忘,放进去了没重启,然后在节点列表里找不到,白折腾。重启后看启动日志里有没有该节点包的加载信息,报红了就是依赖缺了。
第三步,把权重文件放到节点包指定的模型目录下。不同节点包的约定不一样,有的要求放主模型目录,有的要求放插件自己的目录。以节点包的文档为准,别凭感觉放。放错了的表现是节点能加载、能连线、一点运行就报"模型未找到"。
第四步,连工作流。典型连线是:提示词编码 → 基础模型采样 → 透明层解码 → 保存图像。保存节点务必选支持 RGBA 的那个,普通的保存节点可能会把 alpha 通道丢掉,你打开图发现背景是白的就是这个原因。
我实测下来,节点流跑 512×512、25 步,中端显卡大概十几秒一张,和脚本方式差距不大,但调参效率高太多。改个提示词、拖动一下权重滑块,立刻看到结果,这个反馈循环对找感觉非常重要。
注意:节点包对平台版本很敏感。平台升级后如果插件报错,优先查插件是否有对应更新;没有的话就把平台退回旧版本,别硬改代码。
3.5 关键参数怎么定:步数、CFG、LoRA 强度与透明阈值
参数不是玄学,每一项都有明确的物理含义,理解了就能自己推。
采样步数决定去噪迭代多少次。步数太少(低于 15)细节不足,边缘会很脏;步数太多(超过 40)收益递减,时间白花。我常用的区间是 22 到 30。经验规律是:简单主体 20 步够了,复杂结构或者半透明材质多给到 30 步。
CFG 引导强度控制生成结果多大程度服从提示词。数值低(3 到 5)时画面自由度高但容易跑偏;数值高(8 以上)时服从性好但饱和度过高、边缘发硬。透明图层场景下我一般取 5.5 到 7 之间,偏低一点,因为过高的引导会让模型倾向于生成"实心"主体,边缘的透明度信息反而容易丢失。
LoRA 强度(如果你加载了透明层微调权重)是个 0 到 1 的缩放系数。设 1.0 是全力应用,设 0.8 到 0.9 通常更自然,因为完全加载有时会把画面风格带偏。我的习惯是从 0.9 开始试,出图不满意再上下调 0.1。
透明阈值这类后处理参数控制 alpha 通道的二值化程度。设得低,保留更多半透明像素,适合纱、玻璃、烟雾;设得高,边缘更"干脆",适合硬边物体。这个参数没有通用最优值,完全看你的素材类型。做 UI 图标就设高一点,做人物素材就设低一点。
| 参数 | 常用区间 | 调大的效果 | 调小的效果 |
|---|---|---|---|
| 采样步数 | 22 到 30 | 细节多、耗时长 | 快但边缘脏 |
| CFG | 5.5 到 7 | 服从提示、易过饱和 | 自由但易跑偏 |
| LoRA 强度 | 0.85 到 1.0 | 透明效果强、风格易偏 | 自然但透明感弱 |
| 透明阈值 | 按素材类型 | 边缘干脆、细节丢失 | 保留半透明、可能发灰 |
4. 出图质量与显存的双向调优
跑通只是起点,真正花时间的是调优。显存不够和边缘发灰这两件事,几乎是每个人都会遇到的门槛。
4.1 显存不够的三档降级策略
显存溢出报错是CUDA out of memory或者RuntimeError: CUDA error: out of memory,一旦出现,进程基本挂掉。我按"影响从小到大"排了三档应对手段,建议从第一档开始试。
第一档,降低分辨率。这是最有效的手段,显存占用和分辨率大致呈平方关系,从 768 降到 512,显存占用能砍掉一半多。分辨率降了之后如果嫌细节不够,可以用放大模型二次处理,先出小图再放大,比直接出大图稳得多。
第二档,开启分块解码和注意力切片。这两个选项目前在主流推理库里都是一行代码:
pipe.enable_attention_slicing() pipe.enable_vae_slicing() pipe.enable_vae_tiling()切片是把注意力计算拆成更小的块依次算,用时间换显存。代价是生成慢个 20% 到 40%,但能让你在 8 GB 卡上跑起来。分块解码对透明图层尤其有用,因为透明层解码器的显存开销比普通解码器更大。
第三档,CPU 卸载。把部分模块暂时挪到内存里,用时再调回显存。这个手段能救命但很慢,我只在显存彻底不够的最后才用:
pipe.enable_sequential_cpu_offload()我踩过的一个坑是:以为开了卸载就万事大吉,结果发现速度慢到无法接受,一张图要几分钟。实际上更聪明的做法是折中——只把部分模块卸载,主体模型留在显存里。这个需要试,不同的显卡和模型组合结果不同。
提示:批处理时不要一次把几十张图塞进一个批次,批次大小设成 1,用循环跑。批次大小带来的显存占用增长是线性的,很容易爆。
4.2 透明边缘发灰、半透明杂点的成因与处理
这是我遇到过最迷惑的问题:图生成出来了,alpha 通道也有,但在深色背景上合成时,边缘一圈明显的灰边,像贴了层雾。一开始我以为是模型质量不行,换了几个权重都一样,后来才想明白根本原因。
扩散模型在生成时,透明区域的颜色信息其实是"填"出来的,模型并不知道透明像素的 RGB 值应该是多少,所以它会填一个接近背景色或灰度的值。这些"看不见的垃圾像素"在 alpha 接近 0 的地方本来无所谓,但在 alpha 处于中间值的边缘过渡带,就会和前景色混合,产生灰边。这在术语上叫颜色溢出,标准做法是做边界颜色传播——把前景边缘的颜色向透明区域外扩几个像素,覆盖掉垃圾值。
很多节点包里有对应的预处理选项叫"alpha 边缘收缩"或者"边缘颜色扩散"。如果没有,最土但有效的办法是:在合成软件里对图层做一两个像素的"去边"或"收缩"操作,灰边基本就消失了。我用图像处理库写过一个小脚本,思路是对 alpha 做两次腐蚀再去掉溢出,几十行代码,一次处理好几百张。
半透明区域出现零星噪点,通常是采样步数不足或者 CFG 过高导致。前者的特征是噪点分布均匀,后者是噪点集中在高对比度边缘。分别对应调高步数、调低 CFG。还有一种情况是float16精度不够导致的数值溢出,换成float32跑解码器那一小段就能解决,代价很小。
4.3 分层结果的后期合成与再编辑
拿到 RGBA 图只是素材准备完成,真正的价值在于后续的复用。我的常规流程是:前景图层单独存一份,不带任何背景信息的纯 alpha 图;背景如果需要,用纯色或渐变单独生成一份,尺寸对齐;合成时前景在上、背景在下,必要时给前景加个轻微投影,真实感立刻上来。
编辑上有个技巧:透明图层的边缘信息比普通图片更"软",做锐化或者调色时要注意别把边缘的过渡带一起处理了,容易出现锯齿。稳妥做法是在图层上先加蒙版锁定透明区域,只调内部,边缘单独处理。如果用脚本批量调色,记得做 alpha 预乘再处理,处理完再除回去,避免边缘出现彩色噪点。
再编辑方面,带 alpha 的前景图层意味着你可以随便换背景、换色调,甚至做简单的动画——把同一个前景放在不同背景上,用透明度做淡入淡出,剪个小片子完全够用。这也是我愿意花时间调这套流程的原因,一次投入,素材复用率极高。
5. 常见问题排查实录
这一章是我这段时间实际遇到并解决过的问题,按报错类型归类,遇到类似情况可以直接对照查。
5.1 环境类报错速查表
| 报错关键字 | 常见原因 | 处理方式 |
|---|---|---|
torch.cuda.is_available() False | 装成 CPU 版框架 | 用 CUDA 版软件源重装 |
libGL.so.1 not found | 系统图形库缺失 | apt 装 libgl1 和 libglib2.0-0 |
expected scalar type Half | 精度混用 | 统一 dtype 或单独转换解码器 |
No module named 'xxx' | 依赖没装进当前环境 | 确认环境已激活再装 |
safetensors header解析失败 | 权重文件不完整 | 重新获取权重并核对大小 |
CUDA out of memory | 显存不足 | 降分辨率、开切片、减批次 |
表格之外补充两点。第一,环境类问题有一个万能排查法:新开一个终端,激活环境,依次import你怀疑的每一个包,报错立刻现形,比在长脚本里大海捞针快得多。第二,报错信息要看完整,带着 traceback 往上翻,最顶上的那个文件路径往往就是问题所在,别看最底下一行就下结论。
5.2 生成质量类问题排查
生成的图背景是纯白,alpha 通道全不透明。先确认保存格式是不是 PNG,再用代码打印image.mode,如果是RGB说明解码器根本没输出 alpha,需要检查解码器权重是否加载成功、是不是被默认解码器顶替了。这个错误极其常见,八成是权重放错目录或者路径写错。
主体被切掉一半,边缘像被刀切。通常是提示词没有约束构图,加上输出分辨率不够。加个"全身""完整"之类的产物描述,同时确认分辨率能容下主体。也可能是因为透明阈值设太高,把半透明的边缘直接砍没了,把阈值调低试试。
主体和背景粘在一起,抠不出来。这是模型没理解你要"分离"。提示词里明确写主体是什么、背景是什么,比如"一个玻璃杯,纯净背景",比只写"玻璃杯"效果好很多。另外 CFG 可以适当提高一点,逼迫模型服从描述。
出图全黑或者全噪点。九成是加载的加速库版本不匹配。卸掉加速库重跑,如果能出正常图,就说明是它的问题,去找匹配版本或者干脆不用。
5.3 我实际踩过的几个坑
第一个坑:把模型下载到了错误的子目录,节点能加载但推理时报找不到模型。查了半天日志才发现节点包读取的是它自己目录下的模型文件夹,而不是主模型目录。教训是:放权重之前先看节点包的目录约定,别凭经验猜。
第二个坑:装完依赖之后没重启程序,一直在报模块找不到。重启之后一切正常,浪费了半个小时。教训是:装依赖、放权重、改配置之后,一律重启。
第三个坑:批处理脚本里没有释放显存,跑了七八张之后开始报显存不足。原因是每次推理都在生成新的中间张量,累积下来就爆了。加上显存回收和循环内清理就好了。教训是:批处理不是简单套个 for 循环,每轮结束要清理。
第四个坑:提示词里用了太多风格词,结果透明效果变差。因为风格词会把模型往"画一张完整的画"的方向带,反而弱化了分层意图。教训是:做素材时提示词要克制,描述清楚主体和背景就够了。
提示:遇到无法定位的问题时,退回最小可运行脚本。用一个最简单的提示词、最小分辨率跑一次,如果能出图,说明环境没问题,问题出在参数或工作流上;如果最小脚本也出不了图,就是环境问题。这个二分法能砍掉一半的排查范围。
我个人在实际操作中的体会是,这套流程的技术门槛其实不高,真正耗时间的是版本对齐和路径规范这两件"非技术"的事。一旦环境稳定下来,剩下的就是调参数和攒经验,出图速度会越来越快。另外一个小建议:把每次成功的参数组合记下来,写成配置文件,换素材的时候从最近的配置往上调,比每次从零开始试要高效得多。我现在维护了一份十来组的参数记录,做人物素材、做产品素材、做 UI 图标各有一套,基本改改提示词就能直接出可用结果。