前言
前面一篇文章主要講了擴(kuò)散模型的理論基礎(chǔ),還沒看過上篇的小伙伴可以點(diǎn)擊查看:DDPM理論基礎(chǔ)。這篇我們主要講一下一經(jīng)推出,就火爆全網(wǎng)的Stable Diffusion模型。Stable Diffusion因其免費(fèi),開源,生成圖像質(zhì)量高等優(yōu)點(diǎn),一經(jīng)推出,就火爆全網(wǎng),后面stable-diffusion-webui的推出,更是降低了使用Stable Diffusion模型作畫的門檻,一時(shí)刷爆了整個(gè)社區(qū)。今天筆者詳細(xì)的帶大家看一下Stable Diffusion背后的原理。
Diffusion模型
這里為了讓大家更好的理解Stable Diffusion模型,我們先來(lái)簡(jiǎn)單介紹一下Diffusion模型。下圖展示了diffusion模型在訓(xùn)練和推理的過程。從圖中可以看出,擴(kuò)散過程主要包括幾個(gè)主要的模型,分別是text encoder(文本編碼器),unet,image decoder(圖像解碼器)。其中,text encoder的作用主要是將輸入的文本,即prompt,編碼為token embeddings,這個(gè)token embeddings就是代表文本的一個(gè)個(gè)向量。這一個(gè)個(gè)文本向量會(huì)通過某種方式注入到unet中,用來(lái)控制unet生成符合文本描述的圖像。
推理過程
在推理階段,擴(kuò)散過程是一個(gè)多步去噪的過程,主要就是一個(gè)unet網(wǎng)絡(luò)結(jié)構(gòu),其輸入和輸出具有相同的形狀,輸入為含噪聲的圖像和時(shí)間戳 t t t,輸出為圖像上添加的噪聲,進(jìn)而得到去掉該噪聲的圖像。就這樣經(jīng)過unet的一步步去噪,逐步生成一個(gè)不含噪聲的,符合文本描述的圖像。有很多人會(huì)問,為什么不直接一步預(yù)測(cè)出噪聲,然后直接將該噪聲去掉,生成不含噪聲的圖像呢?其實(shí)這樣的話,噪聲很大,網(wǎng)絡(luò)很難預(yù)測(cè)出準(zhǔn)確的噪聲分布。上圖中的N即擴(kuò)散過程執(zhí)行的步數(shù),該參數(shù)可以由我們自己指定,一般步數(shù)設(shè)置的越大,生成的圖像會(huì)越精細(xì)。經(jīng)過擴(kuò)散過程后會(huì)生成低分辨率的,不含噪聲的圖像,為了生成更高分辨率的圖像,這時(shí)就會(huì)在后面再接一個(gè)image decoder,用來(lái)擴(kuò)大圖像的分辨率,image decoder輸出的圖像即為最后我們想要的高分辨率圖像。
文本特征主要是通過cross attention模塊加入的,我們來(lái)大致拆解一下unet內(nèi)部的網(wǎng)絡(luò)結(jié)構(gòu)。如下圖,unet內(nèi)部主要是由多個(gè)resnet block和attention模塊組成的,兩者交替出現(xiàn)。每一個(gè)attention模塊接受resnet block輸出的圖像特征和文本特征向量作為輸入,將兩種特征進(jìn)行融合,從而達(dá)到以文本為條件,控制圖像生成的目的。
attention內(nèi)部的計(jì)算過程如下圖。圖像特征和文本特征分別通過三個(gè)參數(shù)矩陣映射到Q,K,V,然后Q與K的轉(zhuǎn)置點(diǎn)乘除以scale因子后經(jīng)過softmax計(jì)算,最后點(diǎn)乘V,得到最后的特征。當(dāng)然現(xiàn)在都是基于multi-head的多頭attention操作,multi-head只是多次執(zhí)行下面的操作,得到多個(gè) Z i Z^i Zi,最后再將 Z i Z^i Zi拼接在一起,經(jīng)過最后一個(gè)參數(shù)矩陣映射得到最終的 Z Z Z。
訓(xùn)練過程
diffusion模型的訓(xùn)練過程主要涉及unet網(wǎng)絡(luò)的學(xué)習(xí),需要讓unet具備能力:
給它輸入一張含噪圖像,unet能夠預(yù)測(cè)出含噪圖像上的噪聲。
這樣我們就可以去掉含噪圖像上的噪聲,得到一張干凈的、不含噪聲的圖像。訓(xùn)練數(shù)據(jù)的構(gòu)造如下圖:
首先第一步,選擇一張圖片;第二步,隨機(jī)生成一個(gè)基礎(chǔ)噪聲;第三步從0到 T T T的時(shí)間范圍內(nèi),隨機(jī)選擇一個(gè)時(shí)間戳 t t t,通過 t t t和基礎(chǔ)噪聲計(jì)算出最終要添加的噪聲,時(shí)間戳 t t t越大,代表噪聲添加的次數(shù)越多,也即添加噪聲的強(qiáng)度越大。第四步就是將第三步生成的噪聲加到圖像上,得到一個(gè)含噪聲的圖像。此時(shí),步驟四中得到的含噪圖像作為unet網(wǎng)絡(luò)的輸入,步驟三生成的噪聲作為unet學(xué)習(xí)的目標(biāo),用來(lái)訓(xùn)練unet網(wǎng)絡(luò)。
通過上面的1,2,3,4步,我們可以生成很多訓(xùn)練數(shù)據(jù),訓(xùn)練過程中就是不斷將訓(xùn)練數(shù)據(jù)喂給unet,讓其自主學(xué)習(xí)如何預(yù)測(cè)出含噪圖像上的噪聲,以達(dá)到去噪的目的。
Stable Diffusion模型
stable diffusion的最大貢獻(xiàn)就是沒有直接在像素空間進(jìn)行圖像的加噪和去噪,而是先將圖像進(jìn)行壓縮(下采樣),壓縮到一個(gè)圖像表征維度更低的隱空間(latent),然后在隱空間中進(jìn)行擴(kuò)散過程,這不僅加快了擴(kuò)散過程的速度,同時(shí)減少了計(jì)算資源的消耗,而且在隱空間中操作依然能夠保證生成圖像的質(zhì)量。舉個(gè)例子,如果原圖像的分辨率是256x256,現(xiàn)在將它下采樣8倍,到32x32,那么在32x32分辨率的圖像上操作肯定比直接在256x256分辨率的圖像上操作更快且節(jié)省資源。256x256分辨率的原圖即為像素空間特征,壓縮后的32x32分辨率的圖就是隱空間特征。
stable diffusion模型在推理和訓(xùn)練階段的流程圖如上圖所示。與diffusion模型相比,最大的變化就是在推理階段,擴(kuò)散過程的輸入由原來(lái)的隨機(jī)噪聲圖像image變成了隨機(jī)噪聲latent,其實(shí)兩者本質(zhì)上都是純?cè)肼?,只不過latent的分辨率比image的分辨率低,所以經(jīng)過擴(kuò)散過程生成的latent(Generated low resolution latent)也要比生成的image(Generated low resolution image)分辨率低,如果stable diffusion最終要生成與diffusion模型相同分辨率的圖像的話,這里image decoder的放大倍率就要更大。
那么在訓(xùn)練階段,主要進(jìn)行前向過程,也就是給圖像加噪聲。下圖就是stable diffusion生成訓(xùn)練數(shù)據(jù)的過程。可見,和diffusion相比,只是多了一步將原圖壓縮到latent的過程,后面的添加噪聲都是在latent上進(jìn)行的。
下面我們放一張stable diffusion論文中的原圖。
其中
E
\mathcal E
E為圖像編碼器,用來(lái)壓縮圖像尺寸,
D
\mathcal D
D為圖像解碼器用來(lái)恢復(fù)圖像尺寸。圖中的Diffusion Process即為前向過程,原圖像
x
x
x經(jīng)過編碼器
E
\mathcal E
E壓縮到隱空間
z
z
z后,在
z
z
z上進(jìn)行加噪,生成
z
T
z_T
zT?。生成過程為逆向過程,給定隱空間噪聲,經(jīng)過多步去噪,生成不含噪聲的壓縮后的
z
z
z,再經(jīng)過圖像解碼器恢復(fù)原始圖像的尺寸。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-642131.html
參考
https://www.cnblogs.com/gczr/p/14693829.html
https://jalammar.github.io/illustrated-stable-diffusion/
https://readpaper.com/pdf-annotate/note?pdfId=4665140328076951553¬eId=1834381375833065728文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-642131.html
到了這里,關(guān)于零基礎(chǔ)看懂免費(fèi)開源的Stable Diffusion的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!