通过本篇文章,你可以了解并实践通过【ComfyUI】构建自己的【文生图】和【文生动图】工作流。
通过本篇文章,你可以了解并实践通过【ComfyUI】构建自己的【文生图】和【文生动图】工作流,本文所有操作环境和硬件都基于公司所发工作电脑,模型都基于网络开源,无需自己训练调参。(不过如果你有更强悍的电脑,自己有自己的模型就更好了)。同时我也会给出我自己简单搭建的【workflow】给大家,方便大家快速使用。
本文所使用电脑配置如下:
1. 前置工具安装(仅以公司Mac电脑M系列芯片为例)
需要:
1.1. PyTorch安装
PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。使用 Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。PyTorch 的独特之处在于,它完全支持 GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。这使其成为快速实验和原型设计的常用选择。
我是使用conda来进行安装的,没有conda的可以先进行安装:
curl -O https:
sh Miniconda3-latest-MacOSX-arm64.sh
然后通过conda工具来安装pytorch:
conda install pytorch torchvision torchaudio -c pytorch-nightly
最后运行一个python脚本来判断:
import torch
if torch.backends.mps.is_available():
mps_device = torch.device("mps")
x = torch.ones(1, device=mps_device)
print (x)
else:
print ("MPS device not found.")
如果安装正确,会有如下输出:
2. ComfyUI安装
使用 git 命令下载代码库到本地:
然后cd到仓库主目录,安装依赖:
pip install -r requirements.txt
然后运行程序,检测下载安装是否正常:
可以看到如果安装正常,会提示你服务已经部署在了本地地址:http://127.0.0.1:8188
请求本地地址,即可访问ComfyUI:
但是现在,你还没有配套部署任何的模型,所以此时是跑不起来的。
3. 模型下载&导入
我自己在用两个模型下载的网站,两个都被墙了,需要大家自行科学上网:
HuggingFace:https://huggingface.co/
civitai:https://civitai.com/models
个人体验下来,HuggingFace更权威更偏学术一些,civital下载更快更偏娱乐一些(civital上有很多有趣的模型,玩起来还是很不错)。
模型的话,一般会存在两种后缀格式:
在下载完模型后,我们需要将模型导入到 ComfyUI 的 models 目录下,这样 ComfyUI 才能够加载到对应的模型。
1.1. 节点Node
ComfyUI是通过一个个Node,加上Node与Node之间的链接,完成输入输出,并最终串联起整个AI生成的工作流(workflow)。
以【Clip Text Encode(Prompt)】节点为例:
其左侧端点是 Input(输入)端,右侧是 Output(输出)端,节点里还会有一些配置项,这些配置项我会称其为 Parameter(参数),参数是可编辑和调整的。通过将连线输入或输出到不同Node,可以串起不同的工作流。
1.2. 基础节点简介
1.2.1. Load Checkpoint
【Load Checkpoint】,顾名思义,就是加载模型用的。从节点的右边输出端点可以看出,Checkpoint 包含了三个部分:MODEL、CLIP 还有 VAE,这三部分其实就是Stable Diffusion 的模型运行的三大步骤,可以说这个节点是所有 Workflow 的起点。
三大步骤:
-
首先,用户输入的 Prompt 会被一个叫 Text Encoder(文本编译器)的东西编译成一个个的词特征向量。
此步骤下会输出多个等长的向量,每个向量包含 N 个维度,各位可以简单将其理解为「将文本转化为机器能识别的多组数字」。
-
接着,这些特征向量会和一张随机图(可以简单理解这是一张布满电子雪花的图,或充满信息噪声的图),一起放到 Image Information Creator 里。
在这一步,机器会将这些特征向量和随机图先转化到一个 Latent Space(潜空间)里,然后根据这些特征向量,将随机图「降噪」为一个「中间产物」。
你可以简单理解,此时的「中间产物」是人类看不懂的「图」,是一堆数字,但此时这个中间产物所呈现的信息已经是机器算法可以理解语意的了。
-
最后,这个中间产物会被 Image Decoder(图片解码器)解码成一张真正的图片。
类似于降噪然后蚀刻的过程,可以参考 Midjourney 图片生成的过程:由暗变清晰:
1.2.2. CLIP Text Encode(Prompt) Node
CLIP Text Enocde 节点,CLIP 全称是 Contrastive Language-Image Pre-training,即对比文本图像预训练。这个节点主要是输入 Prompt。一般会有两个这样的节点,一个是正向的 Prompt,列你希望在图片中看到的内容;另一个是负向的 Prompt,列你不希望在图片中出现的内容。
一般说来,写 Stable Diffusion 的 prompt 有几个原则:
另外,还有个小技巧,你可以输入 (keyword:weight) 方式来控制关键词的权重,比如 (hight building: 1.2 ) 就意味着 hight building 的权重变高,如果填写的权重数小于 1,则意味着这个词的权重会变低,生成的图与这个词更不相关。
1.2.3. Empty Latent Image Node
这是【潜空间】图像节点。如果你需要调整最终生成的图片的大小,就需要调整 width(宽)、height(高)这两个值。而 batch_size 则是设置每次运行时生成的图片数量,比如你将这个设置成了 4,就意味着每次会生成 4 张图。
1.2.4. Save Image Node
完成图片生成后,对着图片点击右键,会看到「Save Image」的选项,点击此按钮就可以下载生成好的图片。节点里的输入框,则是设置图片名称的前缀。比如默认是 ComfyUI,那就意味着你保存的图片的文件名是 ComfyUI 开头,后面跟着一串数字。
1.2.5. KSampler Node
KSampler 包含以下参数:
-
seed:
这个是随机种子,它主要用于控制潜空间的初始噪声。
如果你想重复生成一模一样的图片。
就需要用到这个随机种子。
需要注意种子和 Prompt 都要相同,才能生成一模一样的图。
-
control_after_generate:
每次生成完图片后,上面的 seed 数字都会变化,而这个配置项,则是设置这个变化规则:
randomize(随机)、increment(递增 1)、decrement(递减 1)、fixed(固定)。
-
step:
采样的步数。
一般步数越大,效果越好,但也跟使用的模型和采样器有关。
-
cfg:
全称 Classifier Free Guidance,可以参考这篇介绍:
[论文理解] Classifier-Free Diffusion Guidance:https://sunlin-ai.github.io/2022/06/01/Classifier-Free-Diffusion.html
-
sampler_name:
采样器名称。
你可以通过这个来设置采样器算法。
-
scheduler:
调度器主要是控制每个步骤中去噪的过程。
你可以通过它选择不同的调度算法,有些算法是选择每一步减去相同数量的噪声,有些则是每一步都尽可能去掉多的噪声。
-
denoise:
表示要增加多少初始噪声,1 表示全部。
一般文生图你都可以默认将其设置成 1。
1.3. 连线
连线是具有规则的:
-
同类相连:
只有同类才能相互连接起来,比如 KSampler 左侧的 model 端点,就只能跟另一个 MODEL 输出点相连。
或者跟具象点说,只有同颜色的端点能相连,如果你将 CLIP Text Encode 右边橙色的点,连到 KSampler 的紫色点 model 上是不可能的。
因为他们类型不一样。
橙色点只能跟橙色点连。
另外,还有一个技巧,当你点击端点并拉出一条线的时候,只有那些能连接的线会高亮出来,不能连的会变暗。
-
左进右出:
比如 KSampler 左边的 model、positive、negative、latent_image 都是是输入端,输出端是右边的 LATENT。
你可以将其理解为一个函数,左边输入数字,右边是输出。
那也就意味着你不能将一个节点右边的输出端,连到另一节点右边的输出端。
-
一进多出:
一个输入端只能和另一个节点的输出端相连,没法和多个输出端相连。
比如上图中的 KSampler 的 positive 端点,只能和一个 CLIP Text Encode 相连,没法同时连多个。
但一个输出端,能和多个输入端相连。
还是上面那个例子,一个 CLIP Text Encode 可以和多个 KSampler 相连,比如可以和 KSampler A 的 positive 端连,也可以和 KSampler B 的 negative 点连,最后出两张图。
其实更好的做法是实操起来,报错提示还是蛮清晰的,根据错误去改进自己的工作流。
1.4. 工作流WorkFlow的保存和加载
2.1. 引入LoRA
总结基于Stable Diffusion进行图片生成的过程,就是【降噪】,在降噪的过程中,还有一个重要的环节就是【Noise Predictor】。
Noise Predictor 是如何工作的呢?简单理解就是进行了一系列的运算,运算所使用到的算法被称为 UNet 算法。UNet 的算法大概是这样的:
左侧是输入,右侧是输出,数据输入后会经过一些列的运算,图中的长条的柱子就是一步运算。我们可以通过改变柱子里的参数权重,从而改变输出结果,最终改变生成图片的效果。但改变每根柱子里的结果相对比较复杂。
于是研究人员就开始寻找一种更简单的方法,最终他们发现,如果将参数注入到每一层函数中,也能达到改变图片的效果,这个方法就是 LoRA(Low-Rank Adaptation)。
LoRA 是在不破坏任何一层函数,而是将参数注入到原有的每一层中。这样的好处是不破坏原有的模型,即插即用,并且模型的大小也比较小。可视化的效果如下:
用类比来理解,可以将 LoRA 视为类似相机「滤镜」。
LoRA模型下载好后,放置在如下的目录里:
2.2. 插件的安装和Custom Node的使用。
强大的ComfyUI不仅能支持文生图、图生图,还可以通过插件和Custom Node的引入,实现文生视频等复杂工作流。
2.2.1. 安装插件
我自己的使用过程中,安装了一些比较实用的插件,也推荐给大家。
首先cd到 custom_nodes 目录下,然后执行以下命令:
git clone https:
git clone https:
git clone https:
然后重新加载 ComfyUI的Web界面,会发现右侧的模块多了几个功能,此时就代表插件生效了:
这个时候直接点击【Manager】,即可对ComfyUI进行可视化操作管理:
在这个界面下,可以进行Custom Node的安装升级,以及模型的下载等。
2.3. 文生动图
文生动图推荐一个插件:
也可以自己手动下载安装:
ComfyUI-AnimateDiff-Evolved:https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved