作者:wuziheng
背景介紹
最近,基于生成式AI技術(shù)批量產(chǎn)出真/像/美的個人寫真應(yīng)用非常受歡迎。同時,隨著 Stable Diffusion 領(lǐng)域開源社區(qū)的快速發(fā)展,社區(qū)也涌現(xiàn)了類似 FaceChain 的開源項目,幫助開發(fā)者開發(fā)個性化的真人寫真生成應(yīng)用。越來越多開發(fā)者對這個方向投來關(guān)注,希望得到更多靈活的開發(fā)方式。
EasyPhoto項目介紹
作為FaceChain-Inpaint功能的開發(fā)團(tuán)隊,我們快速上線了一款基于 SD WebUI 插件生態(tài)的個性化寫真生成開源插件 EasyPhoto。這款插件允許用戶通過上傳幾張同一個人的照片,快速訓(xùn)練Lora模型,然后結(jié)合用戶自定義的模板圖片,生成 真/像/美的寫真圖片。
圖1
項目地址:https://github.com/aigc-apps/sd-webui-EasyPhoto
歡迎大家多多提ISSUE,一同優(yōu)化,讓每個AIGCer都擁有自己的AI寫真相機(jī)!
原理介紹AI真人寫真是一個基于 StableDiffusion和AI人臉相關(guān)技術(shù),實現(xiàn)的定制化人像Lora模型訓(xùn)練和指定圖像生成鏈路的集合,這里我們簡單介紹我們在EasyPhoto中實現(xiàn)的相關(guān)技術(shù),下圖是EasyPhoto的生成鏈路介紹,
圖2
EasyPhoto整體分為訓(xùn)練和推理兩個階段, 下文圖3詳細(xì)展示了訓(xùn)練階段,上圖2展示了生成階段。
EasyPhoto生成
EasyPhoto生成采用基于開源模型StableDiffusion + 人物定制Lora的方式 + ControlNet 的方式完成藝術(shù)照生成
使用人臉檢測模型對輸入的指定模板進(jìn)行人臉檢測(crop & warp)并結(jié)合數(shù)字分身進(jìn)行模板替換。采用FaceID模型挑選用戶輸入的最佳ID Photo和模板照片進(jìn)行人臉融合(face fusion)。使用融合后的圖片作為基底圖片,使用替換后的人臉作為control條件,加上數(shù)字分身對應(yīng)的Lora,進(jìn)行圖到圖局部重繪生成。采用基于StableDiffusion + 超分的方式進(jìn)一步在保持ID的前提下生成高清結(jié)果圖。
EasyPhoto訓(xùn)練
圖3
EasyPhoto訓(xùn)練采用了大量的人臉預(yù)處理技術(shù),用于把用戶上傳的圖片進(jìn)行篩選和預(yù)處理,并引入相關(guān)驗證和模型融合技術(shù),參考圖3.
采用FaceID和圖像質(zhì)量分?jǐn)?shù)對所有圖片進(jìn)行聚類和評分,篩選非同ID照片。采用人臉檢測和主體分割,摳出1篩選后的人臉圖片進(jìn)行人臉檢測摳圖,并分割去除背景。采用美膚模型優(yōu)化部分低質(zhì)量人臉,推升訓(xùn)練數(shù)據(jù)的圖片質(zhì)量。采用單一標(biāo)注的方案,對處理后的訓(xùn)練圖片進(jìn)行打標(biāo),并使用相關(guān)的Lora 訓(xùn)練。訓(xùn)練過程中采用基于FaceID的驗證步驟,間隔一定的step保存模型,并最后根據(jù)相似度融合模型。
我們將從在后續(xù)的章節(jié)簡單介紹涉及到的相關(guān)技術(shù)的原理,更多細(xì)節(jié)也歡迎大家參考Repo的代碼。(如果你已經(jīng)對這一技術(shù)路線非常熟悉,歡迎直接跳到第三章 EasyPhoto & SDWebUI)
文圖生成(SD/Control/Lora)
StableDiffusion
StableDiffusion作為Stability-AI開源圖像生成模型,通常分為SD1.5/SD2.1/SDXL等版本, 是通過對海量的圖像文本(LAION-5B)對進(jìn)行訓(xùn)練結(jié)合文本引導(dǎo)的擴(kuò)散模型(DiffusionModel),使用訓(xùn)練后的模型,通過對輸入的文字進(jìn)行特征提取,引導(dǎo)擴(kuò)散模型在多次的迭代中生成高質(zhì)量且符合輸入語義的圖像。感興趣的同學(xué)可以參考 《stable diffusion原理解讀通俗易懂,史詩級萬字爆肝長文,..》, 下面的圖像就是 stablediffusion 官網(wǎng) Repo 貼出來的他們的效果。
ControlNet/Lora
針對使用文本控制的StableDiffusion模型,如何對生成的圖像內(nèi)容進(jìn)行更好的控制,一直是學(xué)術(shù)界和工業(yè)界試圖解決的問題,本小節(jié)介紹的ControlNet和Lora就是常用的兩種技術(shù)。也是圖2中使用的部分技術(shù),用于控制邊緣連貫性和指定ID生成。
ControlNet :由《Adding Conditional Control to Text-to-Image Diffusion Models》提出的通過添加部分訓(xùn)練過的參數(shù),對StableDiffsion模型進(jìn)行擴(kuò)展,用于處理一些額外的輸入信號,例如骨架圖/邊緣圖/深度圖/人體姿態(tài)圖等等輸入,從而完成利用這些額外輸入的信號,引導(dǎo)擴(kuò)散模型生成與信號相關(guān)的圖像內(nèi)容。例如我們在官方 Repo 可以看到的,使用Canny邊緣作為信號,控制輸出的小狗。
圖4
我們在圖2中看到 StableDiffusion有2個輸入,其中一個部分就是用于控制邊緣連貫性和臉型提示的ControlNet,我們使用了部分的Canny邊緣和OpenPose人體姿態(tài)。
Lora :由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一種基于低秩矩陣的對大參數(shù)模型進(jìn)行少量參數(shù)微調(diào)訓(xùn)練的方法,廣泛引用在各種大模型的下游使用中。AI真人寫真需要保證最后生成的圖像和我們想要生成的人是相像的,這就需要我們使用Lora 技術(shù),對輸入的少量圖片,進(jìn)行一個簡單的訓(xùn)練,從而使得我們可以得到一個小的指定人臉(ID)的模型。當(dāng)然這一技術(shù)也可以廣泛用于,風(fēng)格,物品等其他指定形象的Lora模型訓(xùn)練,大家可以在civitai.com等相關(guān)網(wǎng)頁上尋找自己想要的Lora模型。
人臉相關(guān)AI模型
針對AI寫真這一特定領(lǐng)域,如何使用盡量少的圖片,快速的訓(xùn)練出又真實又相像的人臉Lora模型,是我們能夠產(chǎn)出高質(zhì)量AI寫真的關(guān)鍵,網(wǎng)絡(luò)上也有大量的文章和視頻資料為大家介紹如何訓(xùn)練。這里我們介紹一些在這個過程中,我們使用的開源AI模型,用于提升最后人臉Lora訓(xùn)練的效果。
在這個過程中我們大量的使用了 ModelScope 和其他Github的開源模型,用于完成如下的人臉功能
人臉模型 |
模型卡片 |
功能 |
使用 |
FaceID |
https://github.com/deepinsight/insightface |
對矯正后的人臉提取特征,同一個人的特征距離會更接近 |
EasyPhoto圖片預(yù)處理,過濾非同ID人臉EasyPhoto訓(xùn)練中途驗證模型效果EasyPhoto預(yù)測挑選基圖片 |
人臉檢測 |
cv_resnet50_face |
輸出一張圖片中人臉的檢測框和關(guān)鍵點 |
訓(xùn)練預(yù)處理,處理圖片并摳圖預(yù)測定位模板人臉和關(guān)鍵點 |
人臉分割 |
cv_u2net_salient |
顯著目標(biāo)分割 |
訓(xùn)練預(yù)處理,處理圖片并去除背景 |
人臉融合 |
cv_unet-image-face-fusion |
融合兩張輸入的人臉圖像 |
預(yù)測,用于融合挑選出的基圖片和生成圖片,使得圖片更像ID對應(yīng)的人 |
人臉美膚 |
cv_unet_skin_retouching_torch |
對輸入的人臉進(jìn)行美膚 |
訓(xùn)練預(yù)處理:處理訓(xùn)練圖片,提升圖片質(zhì)量預(yù)測:用于提升輸出圖片的質(zhì)量。 |
SDWebUI [Repo]是社區(qū)最常用的StableDiffusion開發(fā)工具,從年初開源至今,已在Github 擁有100k 的star,我們提到的文圖生成/ControlNet/Lora等功能,都被社區(qū)開發(fā)者貢獻(xiàn)到這一工具中,用于大家快速部署一個可以調(diào)試的文圖生成服務(wù),所以我們也在SDWebUI下實現(xiàn)了EasyPhoto插件,將上述原理提到的 人臉預(yù)處理/訓(xùn)練/藝術(shù)照生成全部集成到了這一插件中。
項目地址:https://github.com/aigc-apps/sd-webui-EasyPhoto
用戶可以參考SDWebUI的插件使用方式進(jìn)行安裝使用。
EasyPhoto插件簡介
EasyPhoto是一款Webui UI插件,用于生成AI肖像畫,該代碼可用于訓(xùn)練與用戶相關(guān)的數(shù)字分身。
建議使用 5 到 20 張肖像圖片進(jìn)行訓(xùn)練,最好是半身照片且不要佩戴眼鏡(少量可以接受)。訓(xùn)練完成后,EasyPhoto可以在推理部分生成圖像。EasyPhoto支持使用預(yù)設(shè)模板圖片與上傳自己的圖片進(jìn)行推理。
圖1, 圖5這些是插件的生成結(jié)果,從生成結(jié)果來看,插件的生成效果還是非常不錯的:
圖5
每個圖片背后都有一個模板,EasyPhoto會對模板進(jìn)行修改使其符合用戶的特征。在EasyPhoto插件中,Inference側(cè)已經(jīng)預(yù)置了一些模板,可以用插件預(yù)置的模板進(jìn)行體驗;另外,EasyPhoto同樣可以自定義模板,在Inference側(cè)有另外一個tab頁面,可以用于上傳自定義的模板。如下圖所示。
圖6
而在Inference預(yù)測前,我們需要進(jìn)行訓(xùn)練,訓(xùn)練需要上傳一定數(shù)量的用戶個人照片,訓(xùn)練的產(chǎn)出是一個Lora模型。該Lora模型會用于Inference預(yù)測。
總結(jié)而言,EasyPhoto的執(zhí)行流程非常簡單:1、上傳用戶圖片,訓(xùn)練一個與用戶相關(guān)的Lora模型;2、選擇模板進(jìn)行預(yù)測,獲得預(yù)測結(jié)果。
安裝方式一:SDWebUI界面安裝
網(wǎng)絡(luò)良好的情況下!。≡赟DWebUI中跳轉(zhuǎn)到Extentions,然后選擇install from URL。輸入https://github.com/aigc-apps/sd-webui-EasyPhoto,點擊下方的install即可安裝。
在安裝過程中,會自動安裝依賴包,這個需要耐心等待一下。安裝完需要重啟WebUI。
圖7
安裝方式二:源碼安裝
如果你想要使用項目源碼安裝,直接進(jìn)入到Webui的extensions文件夾,打開git工具,git clone即可。下載完成后,重新啟動webui,便會檢查需要的環(huán)境庫并且安裝。圖8
其他安裝項:ControlNet
EasyPhoto需要SDWebUI支持ControlNet,具體使用的相關(guān)插件是Mikubill/sd-webui-controlnet。在使用 EasyPhoto 之前,您需要安裝這個軟件源。
此外,我們至少需要三個 Controlnets 用于推理。因此,您需要設(shè)置Multi ControlNet: Max models amount (requires restart)。
圖9
EasyPhoto訓(xùn)練EasyPhoto訓(xùn)練包含如下2個步驟 1. 上傳個人圖片 2. 調(diào)整訓(xùn)練參數(shù) 3點擊訓(xùn)練并設(shè)置ID, 整體界面如下
圖10
上傳訓(xùn)練圖片
左邊是訓(xùn)練圖片,點擊Upload Photos即可上傳圖片,點擊Clear Photos可以刪除已經(jīng)上傳的圖片
調(diào)整訓(xùn)練參數(shù)
上傳完圖片后,右邊是訓(xùn)練參數(shù),初次訓(xùn)練可不做參數(shù)調(diào)整。圖11
這里我們也對參數(shù)進(jìn)行一個介紹
參數(shù)名 |
含義 |
resolution |
訓(xùn)練時喂入網(wǎng)絡(luò)的圖片大小,默認(rèn)值為512 |
validation & save steps |
驗證圖片與保存中間權(quán)重的steps數(shù),默認(rèn)值為100,代表每100步驗證一次圖片并保存權(quán)重 |
max train steps |
最大訓(xùn)練步數(shù),默認(rèn)值為800 |
max steps per photos |
每張圖片的最大訓(xùn)練數(shù),默認(rèn)為200,與max train steps結(jié)合取校 |
train batch size |
訓(xùn)練的批次大小,默認(rèn)值為1 |
gradient accumulationsteps |
進(jìn)行梯度累計,默認(rèn)值為4,train batch size=1的時候,每個step相當(dāng)于喂入四張圖片 |
dataloader num workers |
數(shù)據(jù)加載的works數(shù)量,windows下不生效,因為設(shè)置了會報錯,Linux正常設(shè)置 |
learning rate |
訓(xùn)練Lora的學(xué)習(xí)率,默認(rèn)為1e-4 |
rank Lora |
權(quán)重的特征長度,默認(rèn)為128 |
network alpha |
Lora訓(xùn)練的正則化參數(shù),一般為rank的二分之一,默認(rèn)為64 |
根據(jù)上述表格最終訓(xùn)練步數(shù)的計算公式也比較簡單。
簡單來理解就是:圖片數(shù)量少的時候,訓(xùn)練步數(shù)為photo_num*max_steps_per_photos。圖片數(shù)量多的時候,訓(xùn)練步數(shù)為max_train_steps。
訓(xùn)練&設(shè)置ID
完成設(shè)置后,點擊下方的開始訓(xùn)練,此時需要在上方填入一下User ID,比如 用戶的名字,然后就可以開始訓(xùn)練了。
圖12
觀察訓(xùn)練
!初次訓(xùn)練時會從我們預(yù)備的oss(公用)上下載一部分預(yù)訓(xùn)練模型的權(quán)重,我們耐心等待即可,下載進(jìn)度需要關(guān)注終端。
圖13
訓(xùn)練正常開始的相關(guān)log
圖14
終端顯示成這樣就已經(jīng)訓(xùn)練完了,最后這步是在計算驗證圖像與用戶圖像之間的人臉 ID 差距,從而實現(xiàn) Lora 融合,確保我們的 Lora 是用戶的完美數(shù)字分身。
圖15
EasyPhoto預(yù)測訓(xùn)練完后,我們需要將tab頁轉(zhuǎn)到Inference。由于Gradio的特性,剛訓(xùn)練好的模型不會自動刷新,可以點擊Used id旁的藍(lán)色旋轉(zhuǎn)按鈕進(jìn)行模型刷新。
圖16
刷新完后選擇剛剛訓(xùn)練的模型,然后選擇對應(yīng)的模板即可開始預(yù)測。初次預(yù)測需要下載一些modelscope的模型,耐心等待一下即可。
預(yù)置了部分模板,也可以切到upload image,直接自己上傳模板進(jìn)行預(yù)測。然后我們就可以獲得預(yù)測結(jié)果了。
圖17
預(yù)測參數(shù)說明
關(guān)于預(yù)測界面的部分參數(shù)說明
參數(shù)名 |
含義 |
After Face Fusion Ratio |
第二次人臉融合的比例,越大代表越像 |
First Diffusion steps |
第一次Stable Diffusion的步數(shù) |
First Diffusion denoising strength |
第一次Stable Diffusion重建的比例 |
Second Diffusion steps |
第二次Stable Diffusion的步數(shù) |
Second Diffusion denoising strength |
第二次Stable Diffusion重建的比例 |
Crop Face Preprocess |
是否先裁剪人臉后再進(jìn)行處理,適合大圖 |
Apply Face Fusion Before |
是否進(jìn)行第一次人臉融合 |
Apply Face Fusion After |
是否進(jìn)行第一次人臉融合 |
EasyPhoto全部使用來自開源社區(qū)的模型和相關(guān)技術(shù),旨在探討StableDiffusion在AIGC X 真人寫真領(lǐng)域的技術(shù)和相關(guān)應(yīng)用,文章所有涉及的圖片僅做演示使用,如有侵權(quán)請及時聯(lián)系我們,也請大家引用時表明轉(zhuǎn)載。。
非常歡迎大家下載試用,并參與開發(fā),共建真像美的AI寫真!