一、?基礎知識
根據描述生成圖片的視覺-語言模型(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-transformerspip 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 模型權重?
- vqgan_imagenet_f16_16384.ckpt
- vqgan_imagenet_f16_1024.ckpt
2.2 VQGAN 配置文件: vqgan_imagenet_f16_16384.yaml?
- vqgan_imagenet_f16_16384.yaml
- vqgan_imagenet_f16_1024.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 維度并移動到 CPUreturn transforms.ToPILImage()(generated_image)# 生成圖像
generated_image = generate_from_text_features(vqgan_model, text_features)# 保存生成的圖像
generated_image.save("generated_cityscape.png")