文生图模型基础知识&&原理
相关名词
-
Diffusion 扩散器技术
扩散模型的核心思想是通过一个逐步加噪和去噪的过程。训练时学习如何将被完全破坏的数据恢复为原始数据,推理时则从纯随机噪声开始,逐步"去噪"生成有意义的数据。
-
Sora OpenAI 的视觉大模型
-
DDPM Denoising Diffusion Probabilistic Models
-
U - Net 一种 DDPM 模型
U-Net在DDPM中的作用不仅是预测噪声,其特殊的"U"形结构(下采样然后上采样)允许它在不同尺度上捕获图像特征,并通过skip connections保留细节信息。
-
ViT Vision Transformer 为了图像识别
-
DiT Diffusion Transformer 为了图像生成
- ViT (Vision Transformer): 专注于从图像中提取特征用于分类等任务
- DiT (Diffusion Transformer): 将Transformer架构应用于扩散模型的去噪过程,替代了U-Net
-
VAE Variant Auto Encoder 一个升降维的概率模型
-
CLIP Contrastive Language-Image Pre-training
CLIP不仅仅是将文本和图像映射到同一空间,它通过对比学习(contrastive learning)训练,使得相关的文本-图像对在嵌入空间中更接近,不相关的对更远离。这就是为什么它能有效地指导图像生成朝着文本描述的方向发展。
-
Gaussian 高斯分布
-
LDM Latent Diffusion Models
Stable Diffusion(早期版):架构组成
CLIP model:典型的transformer语言模型(Contrastive Language-Image Pre-training)
CLIP是在大量“像素图片+文字标签”的数据集上训练的,故可将文字token合并在一个向量空间中计算近似度。
VAE encoder/VAE decoder:(Variational Auto Encoder)
编码器:将复杂的高维数据(如图像、音频)表示为低维的向量,其输出的是一个概率分布(高斯分布)的参数(均值和方差)
解码器:从低维向量空间中采样点并将其映射回高维数据空间
Latent Space:潜在子空间,或叫图像信息空间
Pixel Space:像素空间
文字编码
Text Encoder / Clip / OpenCLIP / transformer文字编码模型
输入:文字描述
输出:77个token embeddings 向量,每个向量有768维度
图片编码
VAE Encoder图片编码模型
输入:图片(3,512,512)【3原色,位置】
输出:Latents潜在空间(4,64,64)【多了个维度匹配如何降维】
图片信息处理
UNet+Scheduler 将图片信息逐步“扩散”到潜在空间。
输入:文字嵌入向量、加入噪声的图片嵌入向量
输出:经过处理的嵌入
图片渲染
VAE Decoder画图模型
输入:经过处理的嵌入向量(dimensions(4,64,64))
输出:最终图片【dimensions(3,512,512)表示为(red/green/blue,宽,高)】
加噪音—去噪—去噪—
DiT:Diffusion Transformer
图片信息处理模块替换成Transformer架构
大小不局限在512
——论文《 Scalable Diffusion Models with Transformers 》
视频生成与Sora的关联
Sora的核心技术与Stable Diffusion有共通之处,但其视频扩散模型更为复杂:
- 时空模型:Sora处理的是4D数据(时间、高度、宽度、通道),而不仅仅是2D图像
- 长序列建模:需要处理更长的序列并保持时间一致性
- 视频VAE:专门用于处理视频序列的VAE,适应时间维度
- 大规模预训练:在更大规模、更多维度的数据上进行训练
Stable Diffusion 3
Stable Diffusion 3的核心改进
架构升级
- 采用了DiT架构,完全替代U-Net
- 增加了模型参数量,提高了生成能力
- 改进了文本编码器,能更好理解复杂提示
多模态理解能力
- 更强的跨模态对齐能力
- 改进了条件控制,如布局指导、参考图引导等
训练策略改进
- 采用了更高质量、更大规模的数据集
- 引入了更先进的训练技术,如级联训练、动态权重平衡等
可灵
2D VAE:图像数据采集维度两个——【三原色,(宽度*高度)】
3D VAE:视频数据采集维度三个——【时间,三原色,(宽度*高度)】
3D时序建模:Multi-Head Attension机制——【时间,三原色,Patch】
总结:
一、文本图像联合建模模块
-
CLIP / OpenCLIP:语言-图像联合嵌入空间
-
输入:图片/文字
-
输出:统一向量空间的embedding
-
技术基础:Transformer + 对比学习(Contrastive Learning)
-
二、编码解码器模块
-
VAE Encoder/Decoder:从像素空间 ↔ 潜在空间(Latent Space)
-
输入:图像(像素空间)
-
输出:潜在向量(latent code)
-
decoder负责最终“画图”
-
-
Latent Space:
-
更高效的运算空间(低维)
-
加噪 & 去噪主要发生在这个空间中
-
三、扩散过程核心模块
-
UNet(Stable Diffusion) / DiT(Stable Diffusion 3):扩散模型的“神经骨干”
-
任务:逐步预测“去噪”后的图片
-
输入:加噪latent + timestep + 文本embedding
-
输出:更干净的latent
-
-
Scheduler:
-
控制每一步的“加噪/去噪”强度
-
常见有DDIM、DDPM等方案
-
-
DDPM:
- 最早的扩散模型框架,全名 Denoising Diffusion Probabilistic Models
四、变种与发展
-
DiT:将UNet换为Transformer结构,提升建模能力
-
更大尺度(不局限512x512)
-
模型在论文《Scalable Diffusion Models with Transformers》中提出
-
-
LDM(Latent Diffusion Models):Stable Diffusion背后的核心思想
- 在潜在空间而非像素空间做扩散,大幅节省计算成本
五、视频/时序扩展
-
2D VAE(图像):R、G、B + H、W
-
3D VAE(视频):T、R、G、B + H、W
-
3D Patch 处理 + Transformer:
-
类似ViT的 Patch 思维
-
多头注意力可处理时序建模
-
Learn from b站“LLM张老师”
API调用详解
下面详细介绍如何在系统中集成和实现这一功能:
1. 文生图API选择
考虑选择:
- Stable Diffusion XL (SDXL) - 目前最流行的开源文生图模型之一
- DeepFloyd IF - 高细节图像生成,适合精细的花艺作品
API服务提供商选择
-
Stability AI API
- 官方SDXL API,质量可靠但收费
- 基础URL:
https://api.stability.ai/v1/generation/stable-diffusion-xl-1024-v1-0/text-to-image
-
Replicate API
- 提供多种模型(SDXL、DeepFloyd IF等)的统一接口
- 按次计费,适合测试和开发
-
自托管API
- 使用ComfyUI或Automatic1111的API接口
- 需要GPU支持,但无使用次数限制
2. API集成代码实现
集成文生图API的实现方式:(先以Stability AI为例)
# 添加文生图处理类
class ImageGenerationHandler:
def __init__(self, api_key=None, api_url=None):
self.api_key = api_key or os.getenv("TEXT_TO_IMAGE_API_KEY")
self.api_url = api_url or "https://api.stability.ai/v1/generation/stable-diffusion-xl-1024-v1-0/text-to-image"
def generate_image_stability(self, prompt, style="realistic", width=1024, height=1024):
try:
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {self.api_key}"
}
# 增强提示词,加入花艺专业性
enhanced_prompt = self._enhance_floral_prompt(prompt, style)
payload = {
"text_prompts": [
{
"text": enhanced_prompt,
"weight": 1.0
}
],
"cfg_scale": 7, # 提示词遵循度
"samples": 1,
"steps": 50, # 采样步数
"style_preset": style,
"height": height,
"width": width
}
response = requests.post(
self.api_url,
headers=headers,
json=payload
)
if response.status_code == 200:
# 解析返回的base64图像数据
data = response.json()
image_base64 = data["artifacts"][0]["base64"]
# 保存图像到本地
image_path = f"generated_images/{int(time.time())}.png"
os.makedirs("generated_images", exist_ok=True)
with open(image_path, "wb") as f:
f.write(base64.b64decode(image_base64))
return {
"success": True,
"image_path": image_path,
"image_base64": image_base64,
"enhanced_prompt": enhanced_prompt
}
else:
logger.error(f"API request failed: {response.text}")
return {
"success": False,
"error": f"API request failed: {response.status_code}"
}
except Exception as e:
logger.error(f"Error generating image: {str(e)}")
return {
"success": False,
"error": str(e)
}
def _enhance_floral_prompt(self, prompt, style):
"""增强插花提示词,提高专业性和美感"""
3. 在FastAPI中集成文生图端点
更新文件,修改/generate-image
端点的实现:
# 在app.py中更新文生图API
from floral_rag import ImageGenerationHandler
# 初始化图像生成处理器
image_handler = ImageGenerationHandler()
@app.post("/generate-image")
async def generate_floral_image(request: ImageGenerationRequest):
try:
# 调用图像生成服务
result = image_handler.generate_image_stability(
prompt=request.prompt,
style=request.style
)
if result["success"]:
# 如果图像生成成功
# 可以选择将base64直接返回,或存储图像路径
if "image_path" in result:
image_url = f"/images/{os.path.basename(result['image_path'])}"
else:
image_url = None
return {
"success": True,
"image_base64": result.get("image_base64"),
"image_url": image_url,
"enhanced_prompt": result.get("enhanced_prompt")
}
else:
# 图像生成失败
raise HTTPException(status_code=500, detail=result.get("error", "Image generation failed"))
except Exception as e:
logger.error(f"Error generating image: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error generating image: {str(e)}")
4. 风格定制和专业化增强
为了达到高质量插花图像,考虑实现专业化功能:
4.1 风格模板系统
def get_style_templates():
"""获取预定义的插花风格模板"""
return {
"chinese": {
"name": "中式插花",
"description": "强调意境与象征,注重整体平衡与留白",
"keywords": "写意,留白,寓意,东方美学,素雅",
"common_flowers": "梅花,兰花,竹,菊花,牡丹",
"example_prompts": [
"优雅大气的中式牡丹插花,体现东方韵味",
"写意风格的梅兰竹菊四君子插花,黑色花器"
]
},
"european": {
"name": "欧式插花",
"description": "华丽丰满,强调层次感和丰富度",
"keywords": "奢华,丰满,多层次,对称,质感",
"common_flowers": "玫瑰,绣球,郁金香,满天星,康乃馨",
"example_prompts": [
"豪华欧式红玫瑰与绣球花混搭,金色花器",
"英式田园风格的混合插花,粉色与白色搭配"
]
},
}
4.2 专家提示词增强系统
使用RAG系统增强提示词的专业性:
def enhance_prompt_with_rag(self, prompt, style):
# 构建查询
query = f"为'{style}风格'的'{prompt}'插花设计提供专业描述"
# 调用RAG系统获取专业知识
response, _ = self.rag_system.process_query(query)
# 从响应中提取关键专业术语
enhanced = f"{prompt}, {response}"
# 限制长度
if len(enhanced) > 500:
enhanced = enhanced[:500]
return enhanced
6. 集成控制网络(ControlNet)进阶功能
下一步考虑尝试集成ControlNet来更精确地控制插花的布局、颜色和形态:
def generate_with_controlnet(self, prompt, style, control_image=None, control_mode="color"):
"""使用ControlNet增强图像生成,控制颜色、构图等"""