AI制图以及FLUX模型的API调用与本地部署方法

AI制图思路以及FLUX模型的API调用与本地部署方法

随着AI Computer vision的发展已经诞生了多种类型的ai制图模型:Depth Estimation、Image Classification、Object Detection等等。本章博客主要写FLUX模型的Text-to-Image。

AI制图流程

我们知道一张图片其实是由很多个像素点构成的,从一句话到一张图片无非就是提取话中的意思,并转换成向量,通过大模型的计算,构成一个一个像素点,从而变成可以给人看的图片。

Model

FLUX.1-dev为官方满配模型,最低显存要求24G,生成图片质量高,但是会占用大量电脑算力。与之诞生的有FLUX.1-dev fp8,FLUX.1 schnell(蒸馏模型),FLUX.1 schnell fp8,Flux1-dev-bnb-nf4等优化版本供一般用户使用。不同的版本拥有不同的量化精度,我们可以对照以下表格来选择合适的模型。

格式 位数 说明 用途
FP32 32 位浮点 默认的高精度格式 模型训练、推理
FP16 16 位浮点 更低的精度,性能更高 推理加速、混合精度训练
BF16 16 位浮点 宽指数范围,适合训练 深度学习训练优化
FP8 8 位浮点 超低精度,节省显存 新一代硬件推理优化
INT8 8 位整数 极低精度,硬件优化好 推理优化、TensorRT 支持
INT4 4 位整数 更小精度,存储效率高 极端模型压缩、边缘部署
NF4 4 位浮点 归一化的 4 位浮点格式 大模型权重量化
GPTQ 多位数支持 高效的权重量化方法 LLaMA 等大模型优化
AWQ 低位权重量化 激活感知的权重量化方法 保证模型精度的量化

VAE

VAE全称Variational Autoencoder(变分自编码器),是一种常用于生成模型的深度学习结构。这种概率生成模型,能够学习数据的潜在分布并生成类似的数据。它由两部分组成:

  1. Encoder(编码器)

    • 将输入数据 xxx 映射到一个潜在空间,输出的是一个概率分布的参数(通常是均值 μ\muμ 和标准差 σ\sigmaσ)。

    • 这个潜在空间的向量 zzz 是从这个概率分布中随机采样得到的。

  2. Decoder(解码器)

    • 将潜在向量 zzz 解码,尽可能地还原出原始数据 x′x’x′。

VAE 的总损失由两部分组成:

1
L = 重构损失 + KL散度
  1. 重构损失(Reconstruction Loss):衡量生成的 x′x’x′ 与原始输入 xxx 之间的差异,通常使用 均方误差(MSE)交叉熵
  2. KL 散度(Kullback-Leibler Divergence):衡量编码器输出的分布 q(z∣x)q(z|x)q(z∣x) 与标准正态分布 p(z)p(z)p(z) 之间的差异,确保潜在空间分布合理,避免模型过拟合。

简单粗俗的说,VAE就是一个压缩包,它尽量提取这个图像的特征(也就是编码),那么我们的主模型FLUX就可以通过这些特征来进行计算,不需要每一个向量都要都要由FLUX计算,这样就提高了效率,也节省了算力。最后也可以由VAE来进行解压(解码),将图片预测扩散,从而变成我们想要的图片。

CLIP

全称为Contrastive Language–Image Pre-training,主要有以下四个特点:

  • 文本引导:在ComfyUI这种模型中,CLIP 负责把 Prompt 翻译成“潜在空间向量”,引导模型朝着正确的方向生成。

  • 图像识别:在反向提示词时,CLIP 也能识别哪些东西不该出现在图里。

  • 风格对齐:如果你加了艺术风格的描述,CLIP 也能识别出来,并让图像风格尽量贴合。

  • Prompt Embedding:通过精细化的 Prompt 设计,CLIP 可以捕捉更微妙的图像特征,提升生成效果。

CLIP会将模型编码成嵌入组,用于引导扩散模型生成图像。

Sampler

Sampler(采样器)可以说是一个指挥官,它负责控制扩散模型在去噪过程中的步骤和方式。在AI生成图片时,会先在潜在空间里生成一张纯噪声图(这个纯噪声图是纯随机的,没有任何规律)。然后采样器通过集成噪波、引导器、k采样器、西格玛、Latent图像等参数进行除噪。

噪波:随机噪声,会随机生成种子,是生成过程的起始点。

引导器:提供附加条件信息,引导生成过程朝向特定目标。

k采样器:控制采样方式的策略,影响生成过程的质量和多样性。

西格玛:控制噪声强度的参数,影响图像中的噪声程度。

  • UNet:是一个神经网络结构,专门用于逐步去噪,在生成过程中接收潜在空间的数据,然后逐步去除噪声,直到最终生成图像。

  • Sampler:负责如何对 UNet 执行去噪操作,以及去噪的具体策略,比如去噪的步数、随机性、细节处理等。

噪点与向量的关系

  1. 噪点与潜在空间中的向量
    • 在生成图像的过程中,模型通常从一个噪声向量开始,而这个噪声向量会通过扩散模型的反向扩散过程(去噪)逐步转化为一个真实的图像。
    • 向量代表了图像的潜在特征空间,而噪点则是这种潜在空间的一种随机扰动,表示一个完全无意义、随机的初始状态。
  2. 生成过程中的向量
    • 在前向扩散过程中,模型会将图像逐步添加噪声,最终得到一个完全的噪声图。这时图像的每个像素值是随机的,不能称为“向量”——它只是一个高维的随机噪声。
    • 然后,在反向扩散过程中,这个噪声逐步被转化为一个更有意义的向量(图像的潜在空间表示),每一步的去噪都在让这个潜在向量向目标图像的特征空间靠近。
  3. 潜在向量的编码与解码
    • 在很多扩散模型(如Stable Diffusion)中,图像会被首先编码为潜在空间中的向量(通过类似 VAE的结构),然后才开始添加噪声或去噪。
    • 这个潜在向量可以看作是图像的高维“表示”,而噪点则是它的随机扰动。在反向扩散过程中,模型会将噪点从这些潜在向量中去除,最终还原出一个清晰的图像。

ControlNet

ControlNet 是一种基于深度学习的 图像生成控制机制,特别是在扩散模型中,用来为图像生成过程提供更多的结构化控制。ControlNet 通过 额外的控制信号,使得生成的图像可以更好地遵循特定的约束条件或结构信息,从而更精确地生成用户所期望的图像。也就是说我们可以通过上传更多的图片来标准所要生成的图像。

LoRA

LoRA(Low-Rank Adaptation)是一种用于轻量级微调技术,旨在通过增加少量的参数来调整和微调模型,从而实现更高效的任务定制。

低秩矩阵分解

  • LoRA 的核心思想是低秩矩阵分解,它通过在神经网络的权重矩阵上引入一个低秩的适应层,来对模型进行微调。
  • 通过这种方式,LoRA 只需要学习很少的额外参数,而不是直接修改原有的庞大模型权重。这样可以极大地降低微调大规模模型所需的计算资源和存储开销。

适应层的引入

  • 在 LoRA 中,通常会在模型的某些层(如 Transformer 层)中添加一个低秩矩阵,并通过这个矩阵来调节模型的行为。
  • 这些低秩适应层是可训练的,并且它们的规模相对于原始模型的权重矩阵要小得多,这使得微调过程更加高效。

微调和预训练模型

  • LoRA 允许你在预训练的大型模型上进行微调,而不需要重新训练整个模型。你只需要调整少量的 LoRA 参数,这使得微调过程更加轻量且资源高效。
  • 这对于资源有限的用户(如在 GPU 内存受限的情况下)尤其重要,因为 LoRA 允许你通过较少的计算和存储消耗,获得具有较好性能的定制化模型。

通过Lora我们可以将其他人训练的专一模型参数(比如皮肤光滑,二次元,朋克风等),让我们训练的图像更加偏向我们想要的部分。并且Lora不需要重建整个模型,因此我们只需要加入一个主模型,再加入几个副模型(Lora)我们就可以完成图片的生成。

Embedding

Embedding(嵌入)是一种将高维数据(如文本、图像、语音等)映射到低维向量空间的技术。这种向量表示可以保留原始数据的某些重要特征,并且便于在机器学习和深度学习模型中进行处理。目的是将复杂的数据(例如单词、句子或图像)转换为一个低维度的向量,使得模型能够理解并处理这些数据。在这个向量空间中,相似的输入会被映射到相似的向量,从而可以用数学方法计算它们之间的关系。比如词嵌入(Word Embedding):是将单词转换成一个固定长度的向量。例如,使用Word2Vec或GloVe这类算法,可以将每个单词映射为一个向量,这些向量在某种程度上反映了单词之间的语义关系。相似意思的词语(如 “king” 和 “queen”)的向量会在空间中非常接近。在图像中,可以用于图像检索或分类任务。

但是我们可以看到CLIP和Embedding都与向量生成有关,他们之间有什么区别呢?

特性 Embedding CLIP
输入类型 单一类型的数据(如文本、图像等) 同时处理文本和图像两种输入
输出 每个输入被映射为一个固定维度的向量 文本和图像被映射到相同的向量空间
用途 用于文本、图像等数据的向量表示、特征提取 用于跨模态(文本和图像)匹配、生成
模型架构 独立于单一模态的嵌入学习 通过对比学习同时训练文本和图像的嵌入
目标 提供单一数据类型的低维向量表示 实现图像和文本之间的相互理解和转换

我们可以看到Embedding作为一种通用的技术,它将单一类型的数据(如文本或图像)映射到低维向量空间,用于各种任务,如分类、检索等。

而CLIP则是一个多模态的模型,旨在将文本和图像映射到同一个向量空间,使得它能够处理跨模态任务,如图像描述生成、图像搜索、文本生成图像等。CLIP 的一个重要特性是,它能够理解并计算文本与图像之间的相似性,从而使得图像和文本在相同的向量空间中具有可比性。

API调用并使用Gradio可视化界面

api调用可以让庞大的计算任务在云端服务器进行,可以减少耗时,也可以使用更大数据量的模型。

进入huggingface我们可以看到官方api调用demo:

1
2
3
4
5
6
7
8
9
10
11
12
from huggingface_hub import InferenceClient

client = InferenceClient(
provider="replicate",
api_key="hf_xxxxxxxxxxxxxxxxxxxxxxxx",
)

# output is a PIL.Image object
image = client.text_to_image(
"Astronaut riding a horse",
model="black-forest-labs/FLUX.1-dev",
)

provider是供应商;apikey需要自己注册,里面有关收费。

有了本地部署的demo,我们可以再加入ai生成中比较火的可视化库gradio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import gradio as gr
from huggingface_hub import InferenceClient
from datetime import datetime
from PIL import Image

client = InferenceClient(
provider="replicate",
api_key="hf_114514"
)

def generate_image(prompt):
try:
image = client.text_to_image(
prompt,
model="black-forest-labs/FLUX.1-dev"
)
return image
except Exception as e:
return f"错误: {str(e)}"

def save_image(image_array):
image = Image.fromarray(image_array)

filename = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".png"

image.save(filename)
print(f"图片已保存: {filename}")

with gr.Blocks() as demo:
gr.Markdown("## Flux.1 AI 图像生成")
gr.Markdown("**输入提示词(Prompt**")

prompt_input = gr.Textbox(label="输入描述(Prompt)")
generate_button = gr.Button("生成图像")
output_image = gr.Image(label="生成的图像")
image_save_button = gr.Button("保存图像")

generate_button.click(fn=generate_image, inputs=[prompt_input], outputs=[output_image])
image_save_button.click(fn=save_image, inputs=[output_image], outputs=[])

if __name__ == "__main__":
demo.launch(share=True)

效果如下:

正常有图片的,但是我这里Inference Usage用完了-.-

本地部署ComfyUI

ComfyUI是一个非常使用的ai制图工具,里面的工作流清楚明了。可以在github上的官方库地址下载。

使用模型的方法有很多种,我这里讲一种。下载模型均可在huggingface上找到开源的(FLUX.1dev需要24G,可以下载fp8模型(12G)或者schnell蒸馏模型,这个蒸馏模型预计8G显存可跑)。

然后下载CLIP模型( t5xxl_fp16.safetensors 或 t5xxl_fp8_e4m3fn.safetensors 还有 clip_l.safetensors)与VAE模型。

按照以下地址存放:

1
2
3
ComfyUI/models/unet/FLUX模型
ComfyUI/models/vae/VAE模型
ComfyUI/models/clip/t5xxl_fp16.safetensors和clip_l.safetensors

然后点击run_nvidia_gpu.bat批处理文件就可以打开UI界面:

ComfyUI

可以看到整个界面是十分明了的。


AI制图以及FLUX模型的API调用与本地部署方法
https://bayeeaa.github.io/2025/03/17/AI制图以及FLUX模型的API调用与本地部署方法/
Author
Ye
Posted on
March 17, 2025
Licensed under