AIGC 熱潮正猛烈地席卷開來,可以說 Stable Diffusion 開源發(fā)布把 AI 圖像生成提高了全新高度,特別是 ControlNet 和 T2I-Adapter 控制模塊的提出進一步提高生成可控性,也在逐漸改變一部分行業(yè)的生產(chǎn)模式。驚艷其出色表現(xiàn),也不禁好奇其背后技術(shù)。
之前寫過一篇實戰(zhàn)類的文章一文教會你學(xué)會 AI 繪畫利器 Stable Diffusion
本文整理了一些學(xué)習(xí)過程中記錄的技術(shù)內(nèi)容,主要包括 Stable Diffusion 技術(shù)運行機制,希望幫助大家知其所以然。
喜歡記得收藏、關(guān)注、點贊,想進行技術(shù)交流,也可以加入我們
用通俗易懂的方式講解系列
- 用通俗易懂的方式講解:不用再找了,這是大模型最全的面試題庫
- 用通俗易懂的方式講解:這是我見過的最適合大模型小白的 PyTorch 中文課程
- 用通俗易懂的方式講解:一文講透最熱的大模型開發(fā)框架 LangChain
- 用通俗易懂的方式講解:基于 LangChain + ChatGLM搭建知識本地庫
- 用通俗易懂的方式講解:基于大模型的知識問答系統(tǒng)全面總結(jié)
- 用通俗易懂的方式講解:ChatGLM3 基礎(chǔ)模型多輪對話微調(diào))
- 用通俗易懂的方式講解:最火的大模型訓(xùn)練框架 DeepSpeed 詳解來了
- 用通俗易懂的方式講解:這應(yīng)該是最全的大模型訓(xùn)練與微調(diào)關(guān)鍵技術(shù)梳理
- 用通俗易懂的方式講解:Stable Diffusion 微調(diào)及推理優(yōu)化實踐指南
- 用通俗易懂的方式講解:大模型訓(xùn)練過程概述
- 用通俗易懂的方式講解:專補大模型短板的RAG
- 用通俗易懂的方式講解:大模型LLM Agent在 Text2SQL 應(yīng)用上的實踐
- 用通俗易懂的方式講解:大模型 LLM RAG在 Text2SQL 上的應(yīng)用實踐
技術(shù)交流
技術(shù)要學(xué)會分享、交流,不建議閉門造車。一個人走的很快、一堆人可以走的更遠。
建立了大模型技術(shù)交流群,大模型學(xué)習(xí)資料、數(shù)據(jù)代碼、技術(shù)交流提升, 均可加知識星球交流群獲取,群友已超過2000人,添加時切記的備注方式為:來源+興趣方向,方便找到志同道合的朋友。
方式①、微信搜索公眾號:機器學(xué)習(xí)社區(qū),后臺回復(fù):技術(shù)交流
方式②、添加微信號:mlc2060,備注:技術(shù)交流
一 背景介紹
AI 繪畫作為 AIGC(人工智能創(chuàng)作內(nèi)容)的一個應(yīng)用方向,它絕對是 2022 年以來 AI 領(lǐng)域最熱門的話題之一。AI 繪畫憑借著其獨特創(chuàng)意和便捷創(chuàng)作工具迅速走紅,廣受關(guān)注。舉兩個簡單例子,左邊是利用 controlnet 新魔法把一張四個閨蜜在沙灘邊上的普通合影照改成唯美動漫風(fēng),右邊是 midjourney v5 最新版本解鎖的逆天神技, 只需輸入文字“舊廠街風(fēng)格,帶著濃濃 90 年代氛圍感”即可由 AI 一鍵生成超逼真圖片!
圖1 兩個stable diffusion例子
Stable Diffusion,是一個 2022 年發(fā)布的文本到圖像潛在擴散模型,由 CompVis、Stability AI 和 LAION 的研究人員創(chuàng)建的。要提到的是,Stable Diffusion 技術(shù)提出者 StabilityAI 公司在 2022 年 10 月完成了 1.01 億美元的融資,估值目前已經(jīng)超過 10 億美元。本文會在第二部分著重介紹 Stable Diffusion 的技術(shù)思路,第三部分深入分析各個重要模塊的運行機制,最后總結(jié)下 AI 繪畫。
二 原理簡介
Stable Diffusion 技術(shù),作為 Diffusion 改進版本,通過引入隱向量空間來解決 Diffusion 速度瓶頸,除了可專門用于文生圖任務(wù),還可以用于圖生圖、特定角色刻畫,甚至是超分或者上色任務(wù)。作為一篇基礎(chǔ)原理介紹,這里著重解析最常用的“文生圖(text to image)”為主線,介紹 stable diffusion 計算思路以及分析各個重要的組成模塊。
下圖是一個基本的文生圖流程,把中間的 Stable Diffusion 結(jié)構(gòu)看成一個黑盒,那黑盒輸入是一個文本串“paradise(天堂)、cosmic(廣闊的)、beach(海灘)”,利用這項技術(shù),輸出了最右邊符合輸入要求的生成圖片,圖中產(chǎn)生了藍天白云和一望無際的廣闊海灘。
圖2 Stable Diffusion組成
Stable Diffusion 的核心思想是,由于每張圖片滿足一定規(guī)律分布,利用文本中包含的這些分布信息作為指導(dǎo),把一張純噪聲的圖片逐步去噪,生成一張跟文本信息匹配的圖片。它其實是一個比較組合的系統(tǒng),里面包含了多個模型子模塊,接下來把黑盒進行一步步拆解。stable diffusion 最直接的問題是,如何把人類輸入的文字串轉(zhuǎn)換成機器能理解的數(shù)字信息。這里就用到了文本編碼器 text encoder(藍色模塊),可以把文字轉(zhuǎn)換成計算機能理解的某種數(shù)學(xué)表示,它的輸入是文字串,輸出是一系列具有輸入文字信息的語義向量。有了這個語義向量,就可以作為后續(xù)圖片生成器 image generator(粉黃組合框)的一個控制輸入,這也是 stable diffusion 技術(shù)的核心模塊。圖片生成器,可以分成兩個子模塊(粉色模塊+黃色模塊)來介紹。下面介紹下 stable diffusion 運行時用的主要模塊:
(1) 文本編碼器(藍色模塊),功能是把文字轉(zhuǎn)換成計算機能理解的某種數(shù)學(xué)表示,在第三部分會介紹文本編碼器是怎么訓(xùn)練和如何理解文字,暫時只需要了解文本編碼器用的是 CLIP 模型,它的輸入是文字串,輸出是一系列包含文字信息的語義向量。
(2) 圖片信息生成器(粉色模塊),是 stable diffusion 和 diffusion 模型的區(qū)別所在,也是性能提升的關(guān)鍵,有兩點區(qū)別:
① 圖片信息生成器的輸入輸出均為低維圖片向量(不是原始圖片),對應(yīng)上圖里的粉色 4_4 方格。同時文本編碼器的語義向量作為圖片信息生成器的控制條件,把圖片信息生成器輸出的低維圖片向量進一步輸入到后續(xù)的圖片解碼器(黃色)生成圖片。(注:原始圖片的分辨率為 512_512,有RGB 三通道,可以理解有 RGB 三個元素組成,分別對應(yīng)紅綠藍;低維圖片向量會降低到 64*64 維度)
② Diffusion 模型一般都是直接生成圖片,不會有中間生成低維向量的過程,需要更大計算量,在計算速度和資源利用上都比不過 stable diffusion;
那低維空間向量是如何生成的?是在圖片信息生成器里由一個 Unet 網(wǎng)絡(luò)和一個采樣器算法共同完成,在 Unet 網(wǎng)絡(luò)中一步步執(zhí)行生成過程,采樣器算法控制圖片生成速度,下面會在第三部分詳細介紹這兩個模塊。Stable Diffusion 采樣推理時,生成迭代大約要重復(fù) 30~50 次,低維空間變量在迭代過程中從純噪聲不斷變成包含豐富語義信息的向量,圖片信息生成器里的循環(huán)標志也代表著多次迭代過程。
(3) 圖片解碼器(黃色模塊),輸入為圖片信息生成器的低維空間向量(粉色 4*4 方格),通過升維放大可得到一張完整圖片。由于輸入到圖片信息生成器時做了降維,因此需要增加升維模塊。這個模塊只在最后階段進行一次推理,也是獲得一張生成圖片的最終步驟。
那擴散過程發(fā)生了什么?
-
擴散過程發(fā)生在圖片信息生成器中,把初始純噪聲隱變量輸入到 Unet 網(wǎng)絡(luò)后結(jié)合語義控制向量,重復(fù) 30~50 次來不斷去除純噪聲隱變量中的噪聲,并持續(xù)向隱向量中注入語義信息,就可以得到一個具有豐富語義信息的隱空間向量(右下圖深粉方格)。采樣器負責(zé)統(tǒng)籌整個去噪過程,按照設(shè)計模式在去噪不同階段中動態(tài)調(diào)整 Unet 去噪強度。
-
更直觀看一下,如圖 3 所示,通過把初始純噪聲向量和最終去噪后的隱向量都輸?shù)胶竺娴膱D片解碼器,觀察輸出圖片區(qū)別。從下圖可以看出,純噪聲向量由于本身沒有任何有效信息,解碼出來的圖片也是純噪聲;而迭代 50 次去噪后的隱向量已經(jīng)耦合了語義信息,解碼出來也是一張包含語義信息的有效圖片。
圖3 可視化輸出圖片變化
到這里,我們大致介紹了 Stable Diffusion 是什么以及各個模塊思路,并且簡單介紹了 stable diffusion 的擴散過程。第三部分我們繼續(xù)分析各個重要組成模塊的運行機制,更深入理解 Stable Diffusion 工作原理。
三 模塊分析
第二部分以零基礎(chǔ)角度介紹了 Stable Diffusion 技術(shù)思路,這部分會更細致地介紹下 Stable Diffusion 文生圖技術(shù),訓(xùn)練階段和采樣階段的總體框架如圖 4 所示,可以劃分成 3 個大模塊:PART1-CLIP 模型,PART2-Unet 訓(xùn)練,PART3-采樣器迭代。
圖4 Stable Diffusion文生圖框架
訓(xùn)練階段, 包含了圖里 PART1 CLIP 模型和 PART2 Unet 訓(xùn)練,分成三步:
1、用 AutoEncoderKL 自編碼器把輸入圖片從像素空間映射到隱向量空間,把 RGB 圖片轉(zhuǎn)換到隱式向量表達。其中,在訓(xùn)練 Unet 時自編碼器參數(shù)已經(jīng)訓(xùn)練好和固定的,自編碼器把輸入圖片張量進行降維得到隱向量。
2、用 FrozenCLIPEmbedder 文本編碼器來編碼輸入提示詞 Prompt,生成向量表示 context,這里需要規(guī)定文本最大編碼長度和向量嵌入大小。
3、對輸入圖像的隱式向量施加不同強度噪聲,再把加噪后隱向量輸入到 UNetModel 來輸出預(yù)估噪聲,和真實噪聲信息標簽作比較來計算 KL 散度 loss,并通過反向傳播算法更新 UNetModel 模型參數(shù);引入文本向量 context 后,UNetModel 在訓(xùn)練時把其作為 condition,利用注意力機制來更好地引導(dǎo)圖像往文本向量方向生成;
采樣階段,包含了圖里 PART1 CLIP 模型和 PART3 采樣器迭代,分成三步:
1、用 FrozenCLIPEmbedder 文本編碼器把輸入提示詞 Prompt 進行編碼,生成維度為[B, K, E]的向量表示 context,與訓(xùn)練階段的第 2 步一致;
2、利用隨機種子隨機產(chǎn)出固定維度的噪聲隱空間向量,利用訓(xùn)練好的 UNetModel 模型,結(jié)合不同采樣器(如 DDPM/DDIM/PLMS)迭代 T 次不斷去除噪聲,得到具有文本信息的隱向量表征;
3、用 AutoEncoderKL 自編碼器把上面得到的圖像隱向量進行解碼,得到被映射到像素空間的生成圖像。
上面對 stable diffusion 總體架構(gòu)進行了介紹,那接下來進一步分析介紹下每個重要組成模塊,分別是 Unet 網(wǎng)絡(luò)、采樣器和 CLIP 模型三個主要模塊。
1 Unet 網(wǎng)絡(luò)
Stable Diffusion 里采用的 UNetModel 模型,采用 Encoder-Decoder 結(jié)構(gòu)來預(yù)估噪聲,網(wǎng)絡(luò)結(jié)構(gòu)如圖 5:
圖5 Unet網(wǎng)絡(luò)結(jié)構(gòu)示意圖
模型輸入包括 3 個部分,(1) 圖像表示,用隱空間向量輸入的維度為[B, Z, H/8, W/8];(2) timesteps 值,維度為[B, ];(3) 文本向量表示 context,維度為[B, K, E]。其中[B, Z, H, W]分別表示[batch_size 圖片數(shù),C 隱空間通道數(shù),height 長度,weight 寬度],K 和 E 分別表示文本最大編碼長度 max length 和向量嵌入大小。
模型使用 DownSample 和 UpSample 進行樣本的下上采樣,在采樣模塊之間還有黑色虛線框的 ResBlock 和 SpatialTransformer,分別接收 timesteps 信息和提示詞信息(這里只畫出一次作為參考)。ResBlock 模塊的輸入有 ① 來自上一個模塊的輸入和 ②timesteps 對應(yīng)的嵌入向量 timestep_emb(維度為[B, 4*M],M 為可配置參數(shù));SpatialTransformer 模塊的輸入有 ① 來自上一個模塊的輸入和 ② 提示詞 Prompt 文本的嵌入表示 context,以 context 為注意力機制里的 condition,學(xué)習(xí)提示詞 Prompt 和圖像的匹配程度。最后,UNetModel 不改變輸入和輸出大小,隱空間向量的輸入輸出維度均為[B, Z, H/8, W/8]。
ResBlock 網(wǎng)絡(luò)
ResBlock 網(wǎng)絡(luò),有兩個輸入分別是 ① 來自上一個模塊的輸入和 ②timesteps 對應(yīng)的嵌入向量 timestep_emb(維度為[B, 4*M],M 為可配置參數(shù)),網(wǎng)絡(luò)結(jié)構(gòu)圖如下所示。
timestep_embedding 的生成方式,用的是“Attention is All you Need”論文的 Transformer 方法,通過 sin 和 cos 函數(shù)再經(jīng)過兩個 Linear 進行變換。
圖6 ResBlock模塊和Timestep生成流程
SpatialTransformer 結(jié)構(gòu)
SpatialTransformer 這里,包含模塊比較多,有兩個輸入分別是 ① 來自上一個模塊的輸入和 ② 提示詞 Prompt 文本的嵌入表示 context 作為 condition,兩者使用 cross attention 進行建模。其中,SpatialTransformer 里面的注意力模塊 CrossAttention 結(jié)構(gòu),把圖像向量作為 Query,文本表示 context 作為 Key&Value,利用 Cross Attention 模塊來學(xué)習(xí)圖像和文本對應(yīng)內(nèi)容的相關(guān)性。
注意力模塊的作用是,當輸入提示詞來生成圖片時,比如輸入 “一匹馬在吃草”,由于模型已經(jīng)能捕捉圖文相關(guān)性以及文本中的重點信息,當看到 “馬”時,注意力機制會重點突出圖像“馬”的生成;當看到“草”時,注意力機制會重點突出圖像 “草” 的生成,進而實現(xiàn)和文本匹配的圖片生成。
圖7 SpatialTransformer結(jié)構(gòu)示意圖
Unet 如何訓(xùn)練?
Stable Diffusion 里面 Unet 的學(xué)習(xí)目標是什么?簡單來說就是去噪。那在為去噪任務(wù)設(shè)計訓(xùn)練集時,就可以通過向普通照片添加噪聲來得到訓(xùn)練樣本。具體來說,對于下面這張照片,用 random 函數(shù)生成從強到弱的多個強度噪聲,比如圖 8 里 0~3 有 4 個強度的噪聲。訓(xùn)練時把噪聲強度和加噪后圖片輸入到 Unet,計算預(yù)測噪聲圖和真正噪聲圖之間的誤差損失,通過反向傳播更新 unet 參數(shù)。
圖8 去噪訓(xùn)練樣本說明
訓(xùn)練好 Unet 后,如圖 9 所示,從加噪圖片中推斷出噪聲后,就可以用加噪圖減掉噪聲來恢復(fù)原圖;重復(fù)這個過程,第一步預(yù)測噪聲圖后再減去噪聲圖,用更新后的加噪圖進行第二步去噪,最終就能得到一張很清晰的生成圖片。由于使用了高斯分布的 KL 散度損失,Unet 生成圖片實際上是接近訓(xùn)練集分布的,和訓(xùn)練集有著相同像素規(guī)律。也就是說,使用真實場景的寫實訓(xùn)練集去訓(xùn)練模型,它的結(jié)果就會具有寫實風(fēng)格,盡量符合真實世界規(guī)律。
圖9 Unet網(wǎng)絡(luò)采樣階段迭代
2 采樣器迭代
這部分介紹下采樣階段中擴散模型如何多次迭代去除噪聲,進而得到生成圖片的潛在空間表示。提到采樣器,要從最基礎(chǔ)的采樣器 DDPM(Denoising Diffusion Probabilistic Models)進行介紹[4]。DDPM 推導(dǎo)有點復(fù)雜,這里就用樸素一點的大白話結(jié)合幾個關(guān)鍵公式來理清推導(dǎo)思路。
1 擴散模型的思路是,訓(xùn)練時先在圖片上不斷加噪來破壞圖片,推理時對加噪后的圖片去噪來恢復(fù)出原始圖片。訓(xùn)練過程的 T 次迭代中,可推導(dǎo)出一個重要特性:任意時刻的 Xt 可以由 X0 和 β 表示,任意時刻的 X0 也可以由 Xt 和噪聲 z 求得。
其中,第一行里 a 和 β 可以描述噪聲強度;第二行,X0 為初始的干凈圖片,增加噪聲 z 后生成加噪圖片 Xt,后個公式由前個公式變換而來,表示加噪圖片減去一定強度噪聲,得到圖片 X0。
2 問題變成,如何求逆向階段的分布,即給定了一張加噪后圖片,如何才能求得前一時刻沒有被破壞得那么嚴重的略清晰圖片。經(jīng)過論文里的一頓推導(dǎo),又得出兩個重要結(jié)論:
① 逆向過程也服從高斯分布;② 在知道原始清晰圖片時,能通過貝葉斯公式把逆向過程轉(zhuǎn)換成前向過程,進而算出逆向過程分布。在公式上體現(xiàn)如下:
其中,第一行指的是給定 X0 情況下,逆向過程也服從高斯分布,并且利用貝葉斯公式把逆向過程轉(zhuǎn)換成前向過程,前向過程是不斷加噪的過程,可以被計算;第二行指的是,Xt 和 X0 由于可以相互轉(zhuǎn)換,從公式上看,均值也可以從 Xt 減去不同噪聲得到。
3 算出逆向過程分布后,就可以訓(xùn)練一個模型盡量擬合這個分布,而且模型預(yù)估結(jié)果也應(yīng)該服從高斯分布:
其中,求均值公式里只包含 Xt 和噪聲,由于 Xt 在訓(xùn)練時已知,那只需要得到模型輸出的預(yù)估噪聲,該值可由模型用 Xt 和 t 預(yù)估得到。
4 把逆向過程分布(也就是 Label 值)和模型的預(yù)估分布做比較,由于 ①KL 散度可以用來描述兩個分布之間的差異和 ② 多元高斯分布的 KL 散度有閉式解,經(jīng)過一番推導(dǎo)發(fā)現(xiàn)損失函數(shù)變成計算兩個高斯分布的 KL 散度。
其中,q 分布是逆向過程分布,p 是模型預(yù)估分布,訓(xùn)練損失是求兩個高斯分布的 KL 散度,即兩個分布之間的差距。
5 DDPM 訓(xùn)練過程和采樣過程的偽代碼如下圖所示。由于 DDPM 的高質(zhì)量生成依賴于較大的 T(一般為 1000 以上),導(dǎo)致 Diffusion 前向過程特別緩慢,因此后續(xù)進一步有了 DDIM、PLMS 和 Euler A 等一些優(yōu)化版采樣器。
其中,訓(xùn)練階段實際上是求真實噪聲和模型預(yù)估噪聲的 MSE 誤差,再對 Loss 求導(dǎo)反向傳播來訓(xùn)練模型;采樣階段,求得均值和方差后,采用重參數(shù)技巧來生成樣本。
總結(jié)下,擴散模型采樣階段是對加噪后圖片去噪來恢復(fù)出原始圖片,基于 ① 任意時刻的圖片均可以由原始圖片和噪聲表示;② 逆向過程的圖片參數(shù)符合高斯分布,優(yōu)化目標轉(zhuǎn)化為計算逆向分布和預(yù)估分布的 KL 散度差異,并在采樣階段使用重參數(shù)技巧來生成圖片。
3 CLIP 模型
在前面有提到,提示詞 Prompt 文本利用文本模型轉(zhuǎn)換成嵌入表示 context,作為 Unet 網(wǎng)絡(luò)的 condition 條件。那問題來了,語義信息和圖片信息屬于兩種模態(tài),怎么用 attention 耦合到一起呢?這里介紹下用于提取語義信息的 CLIP 模型。
語義信息的好壞直接影響到了最終生成圖片的多樣性和可控性,那像 CLIP 這樣的語言模型是如何訓(xùn)練出來的?是如何結(jié)合文本串和計算機視覺的呢?首先,要有一個具有文本串和計算機視覺配對的數(shù)據(jù)集。CLIP 模型所使用的訓(xùn)練集達到了 4 億張,通過從網(wǎng)絡(luò)上爬取圖片及相應(yīng)的標簽或者注釋。
圖9 CLIP模型訓(xùn)練用到的圖片和標簽示例
CLIP 模型結(jié)構(gòu)包含一個圖片 encoder 和一個文字 encoder,類似于推薦場景常用到的經(jīng)典雙塔模型。
-
訓(xùn)練時,從訓(xùn)練集隨機取出一些樣本(圖片和標簽配對的話就是正樣本,不匹配的話就是負樣本),CLIP 模型的訓(xùn)練目標是預(yù)測圖文是否匹配;
-
取出文字和圖片后,用圖片 encoder 和文字 encoder 分別轉(zhuǎn)換成兩個 embedding 向量,稱作圖片 embedding 和文字 embedding;
-
用余弦相似度來比較兩個 embedding 向量相似性,并根據(jù)標簽和預(yù)測結(jié)果的匹配程度計算損失函數(shù),用來反向更新兩個 encoder 參數(shù)。
-
在 CLIP 模型完成訓(xùn)練后,輸入配對的圖片和文字,這兩個 encoder 就可以輸出相似的 embedding 向量,輸入不匹配的圖片和文字,兩個 encoder 輸出向量的余弦相似度就會接近于 0。
推理時,輸入文字可以通過一個 text encoder 轉(zhuǎn)換成 text embedding,也可以把圖片用 image encoder 轉(zhuǎn)換成 image embedding,兩者就可以相互作用。在生成圖片的采樣階段,把文字輸入利用 text encoder 轉(zhuǎn)換成嵌入表示 text embedding,作為 Unet 網(wǎng)絡(luò)的 condition 條件。
圖10 CLIP模型結(jié)構(gòu)示意圖
四 本文小結(jié)
AI 繪畫各種應(yīng)用不斷涌現(xiàn),目前有關(guān) Stable Diffusion 的文章主要偏向應(yīng)用介紹,對于 Stable Diffusion 技術(shù)邏輯的介紹還是比較少。這篇文章主要介紹了 Stable Diffusion 技術(shù)結(jié)構(gòu)和各個重要組成模塊的基本原理,希望能夠讓大家了解 Stable Diffusion 是如何運行的,才能更好地控制 AI 繪畫生成。AI 繪畫雖然還面臨一些技術(shù)挑戰(zhàn),但隨著技術(shù)不斷迭代和發(fā)展,相信 AI 能夠在更多領(lǐng)域發(fā)揮出驚喜生產(chǎn)力。
(本文參考了 stable diffusion 官方倉庫以及一些解讀 Blog,結(jié)合個人在其他 ML 領(lǐng)域經(jīng)驗的一些解讀。如有不合理的地方,歡迎在評論區(qū)指出。)
參考鏈接
1 GitHub - CompVis/stable-diffusion: A latent text-to-image diffusion model
2 The Illustrated Stable Diffusion:The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time.
3 由淺入深了解 Diffusion Model文章來源:http://www.zghlxwxcb.cn/news/detail-812326.html
4 Denoising Diffusion Probabilistic Models文章來源地址http://www.zghlxwxcb.cn/news/detail-812326.html
到了這里,關(guān)于用通俗易懂的方式講解:十分鐘讀懂 Stable Diffusion 運行原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!