一、引言
ComfyUI 是一款功能强大的工具,在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题,并深入剖析图生图过程及相关参数,帮助读者快速入门并深入理解其原理。
二、ComfyUI 的安装与配置中遇到的问题
(一)安装过程中的常见问题及解决方法
- Python 与 PyTorch 版本兼容性
ComfyUI 官网推荐使用 Python 3.12,而 Python 3.12 仅支持 PyTorch 2.X 版本。因此,在安装时务必确保所安装的 PyTorch 版本与 Python 版本相互兼容。 - PyTorch CUDA 与服务器 CUDA 版本兼容性
若服务器的 CUDA 版本较低(如 CUDA 11.2),鉴于 PyTorch 的底层算力逻辑通常具有兼容性,可尝试安装 CUDA 11.8 的 PyTorch 版本。 - numpy 版本兼容性
通常建议安装 numpy<2.0,以避免潜在的兼容性问题。
(二)解决运行时的 CUDA 错误
若在运行python main.py
时遭遇 CUDA 错误,可通过以下命令解决:
python
python main.py --listen 0.0.0.0 --disable-cuda-malloc
(三)ComfyUI 工作流与模型管理
- 安装插件
在 ComfyUI 管理器中,插件安装类似于下载 GitHub 项目。一般情况下,插件会自动通过pip install requirement.txt
来安装所需依赖。 - 解决连接问题
- 网络检查(Linux 系统):若遇到无法连接到 GitHub 项目的问题,首先检查是否能通过正常网络访问 GitHub。若网络连接问题影响插件下载,可尝试使用国内镜像或通过 VPN 解决。
- 手动下载插件 :若仍无法连接 GitHub,可手动下载插件的压缩包,解压后将其放置到
custom_nodes/
目录下,然后手动执行pip install requirement.txt
来安装依赖。
三、图生图原理剖析
(一)图生图基础概念
在图生图过程中,checkpoints 由以下几部分组成:
- model:扩散模型(作用于潜在空间)
- CLIP:文本编码器
- VAE:编码器和解码器
![](https://i-blog.csdnimg.cn/direct/b7aaea665adf4d48853f9f99afd6af21.png)
在潜在空间中,会进行扩散操作(对应 K 采样器)。其基本流程为:encode 将输入的文本、图像编码转化为计算机可识别的向量数据,借助 clip 找到与文本对应图像相似的向量,得到文本和图像组合的潜在空间向量。在此基础上进行扩散,在 latent 里得到扩散后的潜在空间向量,最后通过 Decoder(即 vae)解码,转化为人眼可见的图像。
![](https://i-blog.csdnimg.cn/direct/8f6bf164bbc640919d25873b32d82d0b.png)
(二)图生图(Image - to - Image)过程及相关参数解析
-
CLIP 文本编码的正向和负向条件
CLIP 的文本编码CLIP(Contrastive Language - Image Pretraining)模型旨在将文本和图像映射到同一潜在空间,以便相互检索,主要采用对比学习方法进行训练。
假设文本输入为 T = { t 1 , t 2 , . . . , t n } T = \{ t_1, t_2,..., t_n \} T={t1,t2,...,tn},其中 t i t_i ti 是文本中的第 i i i 个词汇。CLIP 使用 Transformer 模型对文本进行编码,得到文本的嵌入向量 z T z_T zT,即:
z T = f T ( T ) z_T = f_T(T) zT=fT(T)其中, f T f_T fT 是文本编码器,负责将文本映射到潜在的嵌入空间。
正向条件 (Positive Condition)
正向条件用于衡量生成图像与文本描述的相似性,目标是使生成图像符合输入文本描述。在图生图任务中,正向条件通常由文本来引导生成图像的内容。 正向条件公式为:
L contrastive = − log exp ( z T T z I / τ ) ∑ i = 1 N exp ( z T T z i / τ ) L_{\text{contrastive}} = -\log \frac{\exp(z_T^T z_I / \tau)}{\sum_{i=1}^N \exp(z_T^T z_i / \tau)} Lcontrastive=−log∑i=1Nexp(zTTzi/τ)exp(zTTzI/τ)其中, τ \tau τ 是温度参数,用于控制对比学习的难度。生成过程的目标是通过生成的图像 I ′ I' I′ 和输入文本描述的语义嵌入 z T z_T zT 来最小化对比损失。
负向条件 (Negative Condition)
在图像生成过程中,CLIP 模型通过对比学习最大化正向条件和负向条件之间的相似度差异。负向条件通过增加对比损失中的 "负样本" 来实现,这些负样本通常是与目标图像无关或对立的文本描述。 对比损失公式(包含负向条件)为:
L contrastive = − log exp ( z T T z I / τ ) ∑ i = 1 N exp ( z T T z i / τ ) − log exp ( z T T z I / τ ) ∑ j = 1 M exp ( z T T z j neg / τ ) L_{\text{contrastive}} = -\log \frac{\exp(z_T^T z_I / \tau)}{\sum_{i=1}^N \exp(z_T^T z_i / \tau)} - \log \frac{\exp(z_T^T z_I / \tau)}{\sum_{j=1}^M \exp(z_T^T z_j^{\text{neg}} / \tau)} Lcontrastive=−log∑i=1Nexp(zTTzi/τ)exp(zTTzI/τ)−log∑j=1Mexp(zTTzjneg/τ)exp(zTTzI/τ)其中:
- z T z_T zT 是文本的嵌入向量, z I z_I zI 是图像的嵌入向量。
- z j neg z_j^{\text{neg}} zjneg 是与文本 T T T 语义不相关的负样本图像的嵌入。
- τ \tau τ 是温度参数,用于调整正负样本之间的相似度,控制对比学习的难度。
- M M M是负样本的数量。
负向条件的作用在于,通过 ∑ j = 1 M exp ( z T T z j neg / τ ) \sum_{j=1}^M \exp(z_T^T z_j^{\text{neg}} / \tau) ∑j=1Mexp(zTTzjneg/τ) 这部分,增加与目标图像不相关的文本条件,以对比正样本和负样本的相似度。从而使模型在生成图像时,避免生成与负向条件相关的图像表示,确保生成图像与负向文本描述的图像不同。
例如,若输入文本是 "a dog with a hat"(一只戴着帽子的狗),而负向文本是 "a dog without a hat"(一只没有帽子的狗),模型会倾向于生成戴帽子的狗,避免生成没戴帽子的狗,负向条件在此过程中对生成无帽子的狗进行惩罚。
2. K - 采样器与潜在空间的生成
-
K - 采样的过程
K - 采样器是生成过程的关键部分,负责在潜在空间中从随机噪声开始,逐步调整生成的潜在表示,引导其趋近于目标图像。
在扩散模型中,K - 采样器控制从潜在空间随机噪声逐步过渡到目标图像的过程,具体包括:
- 从随机噪声开始 :初始时,潜在空间的表示 z z z 接近随机噪声。
- 逐步去噪:K - 采样器通过控制采样过程中的步数和噪声水平,逐步去除噪声,生成图像。
-
参数解释
在 K - 采样器的过程中,以下几个关键参数需要关注:
- 步数(Steps):步数决定了从噪声到最终图像过渡过程的迭代次数。步数越多,去噪过程越精细,生成图像的细节越丰富。但增加步数也会增加计算开销。
- 采样器(Sampler):采样器是负责实际去噪过程的算法,常见的有 Euler、Laplacian 等。不同的采样器采用不同的数学策略从噪声中提取图像信息,选择不同的采样器会影响图像生成的速度和质量。
- 温度参数(Temperature, τ \tau τ):温度参数通常用于控制正向条件与负向条件之间的平衡。增大温度会使模型输出更随机、多样化;减小温度则使输出更稳定,偏向高置信度的内容。
- 随机种子(Random Seed):随机种子控制生成过程的随机性,确保在相同输入下能够复现生成结果。改变随机种子会导致在相同文本条件下生成不同的图像。
-
K - 采样器公式
K - 采样器的公式通常涉及生成模型的去噪过程。假设从噪声表示 x T x_T xT 开始,经过 t t t 步去噪生成 x 0 x_0 x0:
p ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , σ t 2 ) p(x_{t - 1} | x_t) = N(x_{t - 1}; \mu_{\theta}(x_t, t), \sigma_t^2) p(xt−1∣xt)=N(xt−1;μθ(xt,t),σt2) 其中:- μ θ \mu_{\theta} μθ 是神经网络模型,用于预测去噪过程的均值。
- σ t \sigma_t σt 是时间步长 t t t 对应的标准差,表示噪声的强度。
3. VAE 解码器:从潜在空间生成图像
VAE 解码器公式
VAE 解码器负责将潜在空间中的表示 z z z 映射回图像空间,将潜在空间中的抽象向量转化为可视化图像。
假设潜在空间中的向量为 z z z,VAE 解码器的目标是将 z z z 转换为最终的图像 x x x,公式为:
x = g θ ( z ) x = g_{\theta}(z) x=gθ(z)
其中, g θ g_{\theta} gθ 是解码器网络,将潜在向量 z z z 映射回图像空间。
VAE 损失函数
VAE 的损失函数由两部分组成:
- 重构误差:用于衡量生成的图像与真实图像之间的差异。
- KL 散度:用于衡量潜在变量的分布与标准正态分布之间的差异。
VAE 损失函数如下:
L VAE = E q [ log p θ ( x ∣ z ) ] − D KL ( q ϕ ( z ∣ x ) ∥ p ( z ) ) L_{\text{VAE}} = \mathbb{E}q[\log p{\theta}(x|z)] - D_{\text{KL}}(q_{\phi}(z|x) \| p(z)) LVAE=Eq[logpθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))
其中:
- 第一项是重构误差,反映生成图像与真实图像的相似度。
- 第二项是 KL 散度,衡量编码器输出的潜在分布与标准正态分布之间的差异。
(三)变分自编码器(VAE)模型的编码与解码过程
-
编码过程
- 神经网络处理 :将输入图像 x ( i ) x^{(i)} x(i) 送入作为概率编码器的神经网络(多层感知器 MLP),该网络学习将高维图像数据映射到低维空间,以提取图像的关键特征。
- 计算分布参数 :该神经网络输出近似后验 q ϕ ( z ∣ x ( i ) ) q_{\phi}(z | x^{(i)}) qϕ(z∣x(i)) 服从的多元高斯分布的均值 μ ( i ) \mu^{(i)} μ(i) 和标准差 σ ( i ) \sigma^{(i)} σ(i),它们是关于数据点 x ( i ) x^{(i)} x(i) 和变分参数 ϕ \phi ϕ 的非线性函数,即: log q ϕ ( z ∣ x ( i ) ) = log N ( z ; μ ( i ) , σ 2 ( i ) I ) \log q_{\phi}(z | x^{(i)}) = \log \mathcal{N}(z ; \mu^{(i)}, \sigma^{2(i)} I) logqϕ(z∣x(i))=logN(z;μ(i),σ2(i)I)
- 重参数化采样 :为对采样过程进行梯度计算,采用重参数化技巧。从后验分布中采样 z ( i , l ) z^{(i, l)} z(i,l),公式为: z ( i , l ) = μ ( i ) + σ ( i ) ⊙ ϵ ( l ) z^{(i, l)} = \mu^{(i)} + \sigma^{(i)} \odot \epsilon^{(l)} z(i,l)=μ(i)+σ(i)⊙ϵ(l)
其中 ϵ ( l ) ∼ N ( 0 , I ) \epsilon^{(l)} \sim \mathcal{N}(0, I) ϵ(l)∼N(0,I), ⊙ \odot ⊙ 表示元素 - wise 乘积。通过均值、标准差与随机噪声的运算,将图像 x ( i ) x^{(i)} x(i) 编码为低维的隐变量 z ( i , l ) z^{(i, l)} z(i,l)。
-
解码过程
- 确定解码器输出类型 :根据数据类型,若为实值数据, p θ ( x ∣ z ) p_{\theta}(x | z) pθ(x∣z) 假设为多元高斯分布。
- 解码神经网络运算 :解码器同样使用 MLP。其均值 μ \mu μ 和标准差 σ \sigma σ 由 MLP 计算得出,相关公式为:
log p ( x ∣ z ) = log N ( x ; μ , σ 2 I ) \log p(x | z)=\log \mathcal{N}(x ; \mu, \sigma^{2} I) logp(x∣z)=logN(x;μ,σ2I)
其中:
μ = W 4 h + b 4 \mu = W_{4} h + b_{4} μ=W4h+b4,
log σ 2 = W 5 h + b 5 \log \sigma^{2} = W_{5} h + b_{5} logσ2=W5h+b5,
h = tanh ( W 3 z + b 3 ) h = \tanh(W_{3} z + b_{3}) h=tanh(W3z+b3),
θ = { W 3 , W 4 , W 5 , b 3 , b 4 , b 5 } \theta = \{W_{3}, W_{4}, W_{5}, b_{3}, b_{4}, b_{5}\} θ={W3,W4,W5,b3,b4,b5} 是 MLP 的权重和偏置。将编码得到的隐变量 z ( i , l ) z^{(i, l)} z(i,l) 输入到解码器中,经过一系列运算,最终输出重构图像 x ^ ( i ) \hat{x}^{(i)} x^(i)。
![](https://i-blog.csdnimg.cn/direct/1d8b3857de4f4480887b050761d19d98.png)
- 图像展示
通过以下流程图直观展示 VAE 模型的编码和解码过程:
在该流程图中:
- 编码过程 :输入图像 x x x 进入编码神经网络(MLP),该网络输出均值 μ \mu μ 和标准差 σ \sigma σ。借助从标准正态分布采样得到的噪声 ε \varepsilon ε( ε ∼ N ( 0 , I ) \varepsilon \sim \mathcal{N}(0, I) ε∼N(0,I)),通过重参数化技巧计算得到隐变量 z z z,实现将高维图像数据压缩为低维隐变量表示,完成特征提取。
- 解码过程 :得到的隐变量 z z z 被输入到解码神经网络(MLP)。解码过程是编码的逆过程,尝试从低维隐变量中恢复出原始图像的特征,输出尽可能与输入图像相似的重构图像 x ′ x' x′。