零基礎看懂免費開源的Stable Diffusion

文章目錄

  • 前言
  • Diffusion模型
    • 推理過程
    • 訓練過程
  • Stable Diffusion模型
  • 參考

前言

前面一篇文章主要講了擴散模型的理論基礎,還沒看過上篇的小伙伴可以點擊查看:DDPM理論基礎。這篇我們主要講一下一經推出,就火爆全網的Stable Diffusion模型。Stable Diffusion因其免費,開源,生成圖像質量高等優點,一經推出,就火爆全網,后面stable-diffusion-webui的推出,更是降低了使用Stable Diffusion模型作畫的門檻,一時刷爆了整個社區。今天筆者詳細的帶大家看一下Stable Diffusion背后的原理。

Diffusion模型

這里為了讓大家更好的理解Stable Diffusion模型,我們先來簡單介紹一下Diffusion模型。下圖展示了diffusion模型在訓練和推理的過程。從圖中可以看出,擴散過程主要包括幾個主要的模型,分別是text encoder(文本編碼器),unet,image decoder(圖像解碼器)。其中,text encoder的作用主要是將輸入的文本,即prompt,編碼為token embeddings,這個token embeddings就是代表文本的一個個向量。這一個個文本向量會通過某種方式注入到unet中,用來控制unet生成符合文本描述的圖像。

在這里插入圖片描述

推理過程

在推理階段,擴散過程是一個多步去噪的過程,主要就是一個unet網絡結構,其輸入和輸出具有相同的形狀,輸入為含噪聲的圖像和時間戳 t t t,輸出為圖像上添加的噪聲,進而得到去掉該噪聲的圖像。就這樣經過unet的一步步去噪,逐步生成一個不含噪聲的,符合文本描述的圖像。有很多人會問,為什么不直接一步預測出噪聲,然后直接將該噪聲去掉,生成不含噪聲的圖像呢?其實這樣的話,噪聲很大,網絡很難預測出準確的噪聲分布。上圖中的N即擴散過程執行的步數,該參數可以由我們自己指定,一般步數設置的越大,生成的圖像會越精細。經過擴散過程后會生成低分辨率的,不含噪聲的圖像,為了生成更高分辨率的圖像,這時就會在后面再接一個image decoder,用來擴大圖像的分辨率,image decoder輸出的圖像即為最后我們想要的高分辨率圖像。

文本特征主要是通過cross attention模塊加入的,我們來大致拆解一下unet內部的網絡結構。如下圖,unet內部主要是由多個resnet block和attention模塊組成的,兩者交替出現。每一個attention模塊接受resnet block輸出的圖像特征和文本特征向量作為輸入,將兩種特征進行融合,從而達到以文本為條件,控制圖像生成的目的。

在這里插入圖片描述

attention內部的計算過程如下圖。圖像特征和文本特征分別通過三個參數矩陣映射到Q,K,V,然后Q與K的轉置點乘除以scale因子后經過softmax計算,最后點乘V,得到最后的特征。當然現在都是基于multi-head的多頭attention操作,multi-head只是多次執行下面的操作,得到多個 Z i Z^i Zi,最后再將 Z i Z^i Zi拼接在一起,經過最后一個參數矩陣映射得到最終的 Z Z Z

在這里插入圖片描述

訓練過程

diffusion模型的訓練過程主要涉及unet網絡的學習,需要讓unet具備能力:
給它輸入一張含噪圖像,unet能夠預測出含噪圖像上的噪聲
這樣我們就可以去掉含噪圖像上的噪聲,得到一張干凈的、不含噪聲的圖像。訓練數據的構造如下圖:

在這里插入圖片描述

首先第一步,選擇一張圖片;第二步,隨機生成一個基礎噪聲;第三步從0到 T T T的時間范圍內,隨機選擇一個時間戳 t t t,通過 t t t和基礎噪聲計算出最終要添加的噪聲,時間戳 t t t越大,代表噪聲添加的次數越多,也即添加噪聲的強度越大。第四步就是將第三步生成的噪聲加到圖像上,得到一個含噪聲的圖像。此時,步驟四中得到的含噪圖像作為unet網絡的輸入,步驟三生成的噪聲作為unet學習的目標,用來訓練unet網絡。

通過上面的1,2,3,4步,我們可以生成很多訓練數據,訓練過程中就是不斷將訓練數據喂給unet,讓其自主學習如何預測出含噪圖像上的噪聲,以達到去噪的目的。

Stable Diffusion模型

stable diffusion的最大貢獻就是沒有直接在像素空間進行圖像的加噪和去噪,而是先將圖像進行壓縮(下采樣),壓縮到一個圖像表征維度更低的隱空間(latent),然后在隱空間中進行擴散過程,這不僅加快了擴散過程的速度,同時減少了計算資源的消耗,而且在隱空間中操作依然能夠保證生成圖像的質量。舉個例子,如果原圖像的分辨率是256x256,現在將它下采樣8倍,到32x32,那么在32x32分辨率的圖像上操作肯定比直接在256x256分辨率的圖像上操作更快且節省資源。256x256分辨率的原圖即為像素空間特征,壓縮后的32x32分辨率的圖就是隱空間特征。

在這里插入圖片描述

stable diffusion模型在推理和訓練階段的流程圖如上圖所示。與diffusion模型相比,最大的變化就是在推理階段,擴散過程的輸入由原來的隨機噪聲圖像image變成了隨機噪聲latent,其實兩者本質上都是純噪聲,只不過latent的分辨率比image的分辨率低,所以經過擴散過程生成的latent(Generated low resolution latent)也要比生成的image(Generated low resolution image)分辨率低,如果stable diffusion最終要生成與diffusion模型相同分辨率的圖像的話,這里image decoder的放大倍率就要更大。
那么在訓練階段,主要進行前向過程,也就是給圖像加噪聲。下圖就是stable diffusion生成訓練數據的過程。可見,和diffusion相比,只是多了一步將原圖壓縮到latent的過程,后面的添加噪聲都是在latent上進行的。

在這里插入圖片描述

下面我們放一張stable diffusion論文中的原圖。
在這里插入圖片描述
其中 E \mathcal E E為圖像編碼器,用來壓縮圖像尺寸, D \mathcal D D為圖像解碼器用來恢復圖像尺寸。圖中的Diffusion Process即為前向過程,原圖像 x x x經過編碼器 E \mathcal E E壓縮到隱空間 z z z后,在 z z z上進行加噪,生成 z T z_T zT?。生成過程為逆向過程,給定隱空間噪聲,經過多步去噪,生成不含噪聲的壓縮后的 z z z,再經過圖像解碼器恢復原始圖像的尺寸。

參考

https://www.cnblogs.com/gczr/p/14693829.html
https://jalammar.github.io/illustrated-stable-diffusion/
https://readpaper.com/pdf-annotate/note?pdfId=4665140328076951553&noteId=1834381375833065728

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38140.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django中使用ajax發送請求

1、ajax簡單介紹 瀏覽器向網站發送請求時 是以URL和表單的形式提交的post 或get 請求,特點是:頁面刷新 除此之外,也可以基于ajax向后臺發送請求(異步) 依賴jQuery 編寫ajax代碼 $.ajax({url: "發送的地址"…

filebeat多實例運行,kibana組件的基本使用

filebeat多實例運行: 1)需求 一臺服務器上&#xff0c;需要運行多個filebeat實例 2)啟動filebeat實例1 cat > config/11-log_tcp-to-console.yaml <<EOF filebeat.inputs: - type: log paths: - /tmp/oldboyedu-linux82/*.log # 監聽TCP的參數 - type:…

centos 安裝docker

1.更新你的系統: sudo yum update -y2.安裝必需的軟件包: Docker 需要 yum-utils, device-mapper-persistent-data 和 lvm2 軟件包來運行。安裝它們&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm23.設置 Docker 的倉庫: 使用以下命令添加 D…

關于Redis,你需要學習了解的知識

關于 Redis &#xff0c;涵蓋多個方面&#xff0c;從基礎概念到高級應用&#xff0c;以及最佳實踐等。比如以下內容&#xff1a; 認識 Redis&#xff1a; Redis 是什么&#xff1f;它的特點和優勢是什么&#xff1f;Redis 的數據結構&#xff1a;字符串、哈希、列表、集合、有序…

Kafka的下載安裝以及使用

一、Kafka下載 下載地址&#xff1a;https://kafka.apache.org/downloads 二、Kafka安裝 因為選擇下載的是 .zip 文件&#xff0c;直接跳過安裝&#xff0c;一步到位。 選擇在任一磁盤創建空文件夾&#xff08;不要使用中文路徑&#xff09;&#xff0c;解壓之后把文件夾內容…

Redis 持久化

一、RDB 1.1 RDB持久化流程 fork子進程是阻塞的&#xff0c;如果同時開啟RDB和AOF&#xff0c;默認使用AOF。 1、Redis父進程首先判斷: 當前是否在執行save&#xff0c;或bgsave/bgrewriteaof (aof文件重寫命令)的子進程&#xff0c;如果在執行則bgsave命令直接返回。 2、父進…

劍指offer專題2:隊列和棧

用兩個棧模擬隊列 class CQueue {stack<int> stack1;stack<int> stack2; public:CQueue() {}void appendTail(int value) {stack1.push(value);}int deleteHead() {int val-1;if(!stack2.empty()){val stack2.top();stack2.pop();}else if(!stack1.empty()){while…

【左神算法刷題班】第18節:漢諾塔問題、島嶼問題、最大路徑和問題

第18節 題目1&#xff1a;漢諾塔問題&#xff08;變體&#xff09; 體系學習班18節有講暴力遞歸的漢諾塔原題。 給定一個數組arr&#xff0c;長度為N&#xff0c;arr中的值只有1&#xff0c;2&#xff0c;3三種 arr[i] 1&#xff0c;代表漢諾塔問題中&#xff0c;從上往下第…

Terraform 系列-批量創建資源時如何根據某個字段判斷是否創建

系列文章 Terraform 系列文章Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基礎 介紹了使用 Grafana Terraform Provider 創建 Datasource. 這幾天碰到這么一個現實需求&#xff1a; 使用 Terraform 批量創建日志數據源時, 有的數據源類型是 El…

MongoDB 數據庫詳細介紹

MongoDB 數據庫詳細介紹 MongoDB&#xff08;來自“Humongous”&#xff0c;意為巨大的&#xff09;是一個開源、高性能、無模式&#xff08;NoSQL&#xff09;、文檔導向的分布式數據庫。它以其靈活性、可擴展性和強大的查詢功能而聞名于世。MongoDB 使用 JSON 格式的文檔來存…

主從同步介紹、主從同步原理、主從同步結構、構建思路、配置一主一從、配置一主多從、讀寫分離介紹、工作原理、配置mycat服務、添加數據源、創建集群、指定主機角

Top NSD DBA DAY07 案例1&#xff1a;MySQL一主一從案例2&#xff1a;配置一主多從結構案例3&#xff1a;數據讀寫分離 1 案例1&#xff1a;MySQL一主一從 1.1 問題 數據庫服務器192.168.88.53配置為主數據庫服務器數據庫服務器192.168.88.54配置為從數據庫服務器客戶端192…

網絡編程(8.14)TCP并發服務器模型

作業&#xff1a; 1. 多線程中的newfd&#xff0c;能否修改成全局&#xff0c;不行&#xff0c;為什么&#xff1f; 2. 多線程中分支線程的newfd能否不另存&#xff0c;直接用指針間接訪問主線程中的newfd,不行&#xff0c;為什么&#xff1f; 多線程并發服務器模型原代碼&…

排查docker無法啟動問題

查看Linux系統操作日志(最后200行就可以排查)&#xff1a; tail -200f /var/log/messages

數據分析--帆軟報表--大數據大屏

進入國企公司學習有一段時間了&#xff0c;崗位是數據分析方向------ 母前使用的是帆軟工具進行的開發。 可以進行大數據大屏 也可使嵌入到手機端。 下面是例子

Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取

Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 Python-OpenCV中的圖像處理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

數據庫連接池

什么是數據庫連接池 使用數據庫連接池的好處是減少了連接的創建和關閉的開銷&#xff0c;提高了數據庫訪問的性能和效率。 為什么我們要使用數據庫連接池 我們使用數據庫連接池的主要原因是為了提高應用程序訪問數據庫的性能和效率。使用數據庫連接池的好處: 連接重用&…

【Apple】Logic Pro導入7.1.4.wav并自動分析多聲道

Step1: 創建空項目 Step2: 選中下圖“使用麥克風或...”這一項&#xff0c;底下要創建的軌道數填1就行。 點擊創建之后&#xff1a; Step3: 拖動文件、拖動文件、拖動文件到項目中&#xff0c;并選中復選框“所有所選文件都源自一個項目&#xff08;將創建一個智能速度多軌道集…

[NLP]LLM 訓練時GPU顯存耗用量估計

以LLM中最常見的Adam fp16混合精度訓練為例&#xff0c;分析其顯存占用有以下四個部分&#xff1a; GPT-2含有1.5B個參數&#xff0c;如果用fp16格式&#xff0c;只需要1.5G*2Byte3GB顯存, 但是模型狀態實際上需要耗費1.5B*1624GB. 比如說有一個模型參數量是1M&#xff0c;在…

什么是前端框架?怎么學習? - 易智編譯EaseEditing

前端框架是一種用于開發Web應用程序界面的工具集合&#xff0c;它提供了一系列預定義的代碼和結構&#xff0c;以簡化開發過程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的庫和工具&#xff0c;用于構建交互式、動態和響應式的用戶界面。 學習前端框架可以讓您更高效…

nginx的負載均衡

nginx的負載均衡 文章目錄 nginx的負載均衡1.以多臺虛擬機作服務器1.1 在不同的虛擬機上安裝httpd服務1.2 在不同虛擬機所構建的服務端的默認路徑下創建不同標識的文件1.3 使用windows本機的瀏覽器分別訪問3臺服務器的地址 2.在新的一臺虛擬機上配置nginx實現反向代理以及負載均…