1.2 以文本為生成條件

? ? ? ?前面的章節展示了如何將額外信息輸入給UNet,以實現對生成圖像的控制,這種方法稱為條件生成。以文本為條件進行控制圖像的生成是在推理階段,我們可以輸入期望圖像的文本描述(Prompt),并把純噪聲數據作為起點,然后模型對噪聲數據進行“去噪”,從而生成能夠匹配文本描述的圖像。那么這個過程是如何實現的呢?

? ? ? 我們需要對文本進行編碼表示,然后輸入給UNet作為生成條件,文本嵌入表示如下圖ENCODER_HIDDEN_STATES

   Stable Diffusion使用CLIP對文本描述進行編碼,首先對輸入文本描述進行分詞,然后輸入給CLIP文本編碼器,從而為每個token產生一個768維(Stable Diffusion 1.x版本)或者1024維(Stable Diffusion 2.x版本)向量,為了使輸入格式一致,文本描述總是被補全或者截斷為77個token。

? ? ? ?那么,如何將這些條件信息輸入給UNet進行預測呢?答案是使用交叉注意力(cross-attention)機制。UNet網絡中的每個空間位置都可以與文本條件中的不同token建立注意力(在稍后的代碼中可以看到具體的實現),如下圖所示:

1.3 無分類器引導

       第2節我們提到可以使用CLIP編碼文本描述來控制圖像的生成,但是實際使用中,每個生成的圖像都是按照文本描述生成的嗎?當然不一定,其實是大模型的幻覺問題,原因可能是訓練數據中圖像與文本描述相關性弱,模型可能學著不過度依賴文本描述,而是從大量圖像中學習來生成圖像,最終達不到我們的期望,那如何解決呢?

? ? ? ?我們可以引入一個小技巧-無分類器引導(Classifier-Free Guidance,CFG)。在訓練時,我們時不時把文本條件置空,強制模型去學習如何在無文字信息的情況下對圖像“去噪”。在推理階段,我們分別進行了兩個預測:一個有文字條件,另一個則沒有文字條件。這樣我們就可以利用兩者的差異來建立一個最終的預測了,并使最終結果在文本條件預測所指明的方向上依據一個縮放系數(引導尺度)更好的生成文本描述匹配的結果。從下圖看到,更大的引導尺度能讓生成的圖像更接近文本描述。

1.4 其他類型的條件生成模型:Img2Img、Inpainting與Depth2Img模型

       其實除了使用文本描述作為條件生成圖像,還有其他不同類型的條件可以控制Stable Diffusion生成圖像,比如圖片到圖片、圖片的部分掩碼(mask)到圖片以及深度圖到圖片,這些模型分別使用圖片本身、圖片掩碼和圖片深度信息作為條件來生成最終的圖片。

? ? ? ?Img2Img是圖片到圖片的轉換,包括多種類型,如風格轉換(從照片風格轉換為動漫風格)和圖片超分辨率(給定一張低分辨率圖片作為條件,讓模型生成對應的高分辨率圖片,類似Stable Diffusion Upscaler)。Inpainting又稱圖片修復,模型會根據掩碼的區域信息和掩碼之外的全局結構信息生成連貫的圖片。Depth2Img采用圖片的深度新作為條件,模型生成與深度圖本身相似的具有全局結構的圖片,如下圖所示:

1.5 使用DreamBooth微調擴散模型

? ? ? DreamBooth可以微調文本到圖像的生成模型,最初是為Google的Imagen Model開發的,很快被應用到Stable Diffusion中。它可以根據用戶提供的一個主題3~5張圖片,就可以生成與該主題相關的圖像,但它對于各種設置比較敏感。

二、環境準備

安裝python庫

pip install -Uq diffusers ftfy accelerate
pip install -Uq git+https://github.com/huggingface/transformers

數據準備

import torch
import requests
from PIL import Image
from io import BytesIO
from matplotlib import pyplot as plt
 
# 這次要探索的管線比較多
from diffusers import (
StableDiffusionPipeline,
StableDiffusionImg2ImgPipeline,
StableDiffusionInpaintPipeline,
StableDiffusionDepth2ImgPipeline
)
 
# 因為要用到的展示圖片較多,所以我們寫了一個旨在下載圖片的函數
def download_image(url):
response = requests.get(url)
return Image.open(BytesIO(response.content)).convert("RGB")
 
# Inpainting需要用到的圖片
img_url = "https://raw.githubusercontent.com/CompVis/latent-
diffusion/main/data/inpainting_examples/overture-creations-
5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-
diffusion/main/data/ inpainting_examples/overture-creations-
5sI6fQgYIuo_mask.png"
 
init_image = download_image(img_url).resize((512, 512))
mask_image = download_image(mask_url).resize((512, 512))
 
device = (
"mps"
if torch.backends.mps.is_available()
else "cuda"
if torch.cuda.is_available()
else "cpu"
)

三、使用文本描述控制生成圖像

? ? ? ?加載Stable Diffusion Pipeline,當然可以通過model_id切換Stable Diffusion版本

# 載入管線
model_id = "stabilityai/stable-diffusion-2-1-base"
pipe = StableDiffusionPipeline.from_pretrained(model_id).to(device)

如果GPU顯存不足,可以嘗試以下方法來減少GPU顯存的使用

pipe = StableDiffusionPipeline.from_pretrained(model_id,
revision="fp16",torch_dtype=torch.float16).to(device)
pipe.enable_attention_slicing()
# 給生成器設置一個隨機種子,這樣可以保證結果的可復現性
generator = torch.Generator(device=device).manual_seed(42)
 
# 運行這個管線
pipe_output = pipe(
prompt="Palette knife painting of an autumn cityscape",
# 提示文字:哪些要生成
negative_prompt="Oversaturated, blurry, low quality",
# 提示文字:哪些不要生成
height=480, width=640, # 定義所生成圖片的尺寸
guidance_scale=8, # 提示文字的影響程度
num_inference_steps=35, # 定義一次生成需要多少個推理步驟
generator=generator # 設定隨機種子的生成器
)
 
# 查看生成結果,如圖6-7所示
pipe_output.images[0]

主要參數介紹:

width和height:用于指定生成圖片的尺寸,他們必須可以被8整除,否則VAE不能整除工作;

num_inference_steps:會影響生成圖片的質量,采用默認50即可,用戶也可以嘗試不同的值來對比一下效果;

negative_prompt:用于強調不希望生成的內容,該參數一般在無分類器引導的情況下使用。列出一些不想要的特征,以幫助模型生成更好的結果;

guidance_scale:決定了無分類器引導的影響強度。增大這個參數可以使生成的內容更接近給出的文本描述,但是參數值過大,則可能導致結果過于飽和,不美觀,如下圖所示:

cfg_scales = [1.1, 8, 12] 
prompt = "A collie with a pink hat"
fig, axs = plt.subplots(1, len(cfg_scales), figsize=(16, 5))
for i, ax in enumerate(axs):
im = pipe(prompt, height=480, width=480,
guidance_scale=cfg_scales[i], num_inference_steps=35,
generator=torch.Generator(device=device).manual_seed(42)).
images[0]
ax.imshow(im); ax.set_title(f'CFG Scale {cfg_scales[i]}')

文章轉自微信公眾號@ArronAI

上一篇:

擴散模型實戰(九):使用CLIP模型引導和控制擴散模型

下一篇:

擴散模型實戰(十二):使用調度器DDIM反轉來優化圖像編輯
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費