VL开源模型实现文本生成图片

发布于:2025-03-25 ⋅ 阅读:(26) ⋅ 点赞:(0)

一、 基础知识

根据描述生成图片的视觉-语言模型(Vision-Language Models, VL 模型)是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像,广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。

1  根据描述生成图片的 VL 模型

1.1 DALL·E 系列

模型简介

  • DALL·E:由 OpenAI 提出,基于 GPT-3 架构,能够根据文本描述生成高质量的图像。

  • DALL·E 2:DALL·E 的升级版,生成图像的分辨率和质量更高,支持更复杂的文本描述。

特点

  • 支持零样本生成(Zero-Shot Generation)。

  • 能够生成高度符合文本描述的图像。

  • 支持图像编辑(如修改图像中的特定部分)。

应用场景

  • 艺术创作、广告设计、虚拟场景构建等。

 1.2 Stable Diffusion

模型简介

  • 由 Stability AI 提出,基于扩散模型(Diffusion Model),能够根据文本描述生成高质量的图像。

  • 开源且可定制,支持用户训练自己的模型。

特点

  • 生成图像的分辨率高,细节丰富。

  • 支持文本到图像生成、图像修复、图像编辑等多种任务。

  • 计算效率较高,适合在消费级硬件上运行。

应用场景

  • 艺术创作、游戏设计、个性化内容生成等。

3. Imagen

模型简介

  • 由 Google 提出,基于扩散模型和大型语言模型(如 T5),能够根据文本描述生成高质量的图像。

  • 强调文本理解的准确性和图像生成的真实性。

特点

  • 生成图像的质量极高,细节逼真。

  • 支持复杂的文本描述。

  • 在文本-图像对齐方面表现优异。

应用场景

  • 广告设计、虚拟场景构建、教育辅助等。

4. CogView

模型简介

  • 由清华大学提出,基于 Transformer 架构,专门用于文本到图像生成。

  • 支持中文和英文文本描述。

特点

  • 对中文文本的支持较好。

  • 生成图像的分辨率较高。

  • 支持多种风格的图像生成。

应用场景

  • 中文内容创作、广告设计、教育辅助等。

5. MidJourney

模型简介

  • 由 MidJourney 团队开发,专注于艺术风格的文本到图像生成。

  • 通过 Discord 平台提供服务,用户可以通过文本指令生成图像。

特点

  • 生成图像具有独特的艺术风格。

  • 支持多种艺术风格(如油画、水彩、科幻等)。

  • 用户交互友好,适合非技术用户使用。

应用场景

  • 艺术创作、个性化内容生成、社交媒体等。

6. Parti (Pathways Autoregressive Text-to-Image)

模型简介

  • 由 Google 提出,基于自回归模型(Autoregressive Model),能够根据文本描述生成高质量的图像。

  • 强调生成图像的多样性和文本-图像对齐能力。

特点

  • 支持长文本描述。

  • 生成图像的多样性高。

  • 在复杂场景生成方面表现优异。

应用场景

  • 广告设计、虚拟场景构建、教育辅助等。

7. Make-A-Scene

模型简介

  • 由 Meta (Facebook) 提出,结合文本描述和用户绘制的草图生成图像。

  • 强调用户控制和生成图像的细节。

特点

  • 支持用户通过草图控制生成图像的布局。

  • 生成图像的细节丰富。

  • 适合需要高精度控制的应用场景。

应用场景

  • 艺术创作、设计辅助、虚拟场景构建等。

示例

  • 输入:文本 "A forest with a river running through it." 和用户绘制的草图。

  • 输出:一张符合描述和草图的森林河流图片。

8. VQGAN+CLIP

模型简介

  • 结合 VQGAN(一种生成对抗网络)和 CLIP(一种视觉-语言模型),能够根据文本描述生成图像。

  • 开源且易于定制。

特点

  • 生成图像的风格多样。

  • 支持用户自定义生成过程。

  • 计算资源需求较低。

应用场景

  • 艺术创作、个性化内容生成、社交媒体等。

2. 各模型需要的计算资源 

模型名称 计算需求 备注
DALL·E 系列 需要大规模 GPU 集群,适合在云端运行。
Stable Diffusion 中等 可以在消费级 GPU 上运行,但高分辨率生成仍需较强算力。
Imagen 基于大规模语言模型和扩散模型,计算需求较高。
CogView 中等至高 基于 Transformer,生成高分辨率图像时需要较强算力。
MidJourney 中等 通过云端服务提供,用户无需本地计算,但对服务器算力需求较高。
Parti 基于自回归模型,生成高质量图像需要大量计算资源。
Make-A-Scene 中等至高 结合用户输入和生成模型,计算需求较高。
VQGAN+CLIP 可以在消费级 GPU 甚至 CPU 上运行,计算需求最低。

二、VQGAN+CLIP 的使用示例

1. 前期准备:

1. 安装依赖

pip install torch torchvision ftfy regex tqdm clip
pip install torch torchvision
pip install taming-transformers

pip install pytorch_lightning==1.9.4  (taming-transformers 依赖于 pytorch_lightning

pip install git+https://github.com/openai/CLIP.git

2. 模型仅支持英文,若需要其他语言,需要安装多语言库(用于把其他语言转化成英文):

pip install multilingual-clip

2. 下载模型参数和配置:

2.1 模型权重 

2.2 VQGAN 配置文件: vqgan_imagenet_f16_16384.yaml 

3. 代码

import torch
import clip
from omegaconf import OmegaConf
from pytorch_lightning.callbacks import ModelCheckpoint
from taming.models.vqgan import VQModel
from torchvision import transforms
from torchvision.transforms.functional import to_pil_image


# 加载 VQGAN 模型
def load_vqgan_model(config_path, model_path, device="cuda"):
    """
    加载 VQGAN 模型
    :param config_path: VQGAN 配置文件的路径
    :param model_path: VQGAN 模型权重的路径
    :param device: 模型运行的设备(如 "cuda" 或 "cpu")
    :return: 加载好的 VQGAN 模型
    """
    # 加载配置文件
    config = OmegaConf.load(config_path)

    # 初始化 VQGAN 模型
    model = VQModel(**config.model.params)

    # 将 ModelCheckpoint 添加到允许的全局变量列表中
    torch.serialization.add_safe_globals([ModelCheckpoint])

    # 加载模型权重,资源有限可以使用参数量小的模型
    state_dict = torch.load(model_path, map_location="cpu")["state_dict"]
    model.load_state_dict(state_dict, strict=True)

    # 将模型移动到指定设备
    model = model.to(device)
    model.eval()  # 设置为评估模式

    return model


# 加载 CLIP 模型
device = "cuda" if torch.cuda.is_available() else "cpu"
clip_model, preprocess = clip.load("ViT-B/32", device=device)

# 加载 VQGAN 模型
config_path = "vqgan_imagenet_f16_16384.yaml"  # 配置文件路径
model_path = "vqgan_imagenet_f16_16384.ckpt"  # 模型权重路径
vqgan_model = load_vqgan_model(config_path, model_path, device=device)

# 定义文本描述
text_description = "A futuristic cityscape at night with neon lights"

# 使用 CLIP 生成文本特征
text = clip.tokenize([text_description]).to(device)
with torch.no_grad():
    text_features = clip_model.encode_text(text)


# 使用 VQGAN 生成图像
# 注意:VQGAN 本身不支持直接根据文本特征生成图像,需要结合其他方法(如优化过程)
# 计算资源有限的情况可以把num_steps调小一点50,image_size调小128
def generate_from_text_features(model, text_features, num_steps=50, image_size=128):
    """
    根据文本特征生成图像(示例代码,需要结合优化过程)
    :param model: VQGAN 模型
    :param text_features: 文本特征
    :param num_steps: 优化步数
    :param image_size: 生成图像的大小
    :return: 生成的图像(PIL 图像)
    """
    # 初始化随机噪声图像
    noise = torch.randn(1, 3, image_size, image_size).to(device)
    noise.requires_grad_(True)

    # 优化器
    optimizer = torch.optim.Adam([noise], lr=0.01)

    # 优化过程
    for step in range(num_steps):
        optimizer.zero_grad()

        # 使用 VQGAN 编码和解码噪声图像
        quantized, _, _ = model.encode(noise)
        reconstructed_image = model.decode(quantized)

        # 将张量转换为 PIL 图像
        reconstructed_image_pil = to_pil_image(reconstructed_image.squeeze(0).cpu())  # 移除 batch 维度并转换为 PIL 图像

        # 使用 CLIP 的预处理函数
        preprocessed_image = preprocess(reconstructed_image_pil).unsqueeze(0).to(device)  # 添加 batch 维度并移动到设备

        # 使用 CLIP 提取图像特征
        image_features = clip_model.encode_image(preprocessed_image)

        # 计算损失(假设使用 CLIP 的相似度作为损失)
        loss = -torch.cosine_similarity(text_features, image_features).mean()

        # 反向传播和优化
        loss.backward()
        optimizer.step()

        print(f"Step {step + 1}/{num_steps}, Loss: {loss.item()}")

    # 将生成的图像转换为 PIL 图像
    generated_image = torch.clamp(reconstructed_image, -1, 1)  # 限制值范围
    generated_image = (generated_image + 1) / 2  # 反归一化到 [0, 1]
    generated_image = generated_image.squeeze(0).cpu()  # 移除 batch 维度并移动到 CPU
    return transforms.ToPILImage()(generated_image)


# 生成图像
generated_image = generate_from_text_features(vqgan_model, text_features)

# 保存生成的图像
generated_image.save("generated_cityscape.png")

网站公告

今日签到

点亮在社区的每一天
去签到