從零入門AI生圖原理&實踐 是 Datawhale 2024 年 AI 夏令營第四期的學習活動(“AIGC”方向),基於魔搭社群“可圖Kolors-LoRA風格故事挑戰賽”開展的實踐學習。
下面將分六部分介紹我的學習&實踐情況。
一、文生圖的歷程與基石
首先,透過社群提供的學習資料和PPT,對文生圖的歷程與基石進行了快速的瞭解,以下為梗概:
- 引言與定義
- 擬合資料分佈、生成模型、傳輸方程
- 發展歷程
- VAE、GAN、Flow-based Models、Diffusion Models
- 擴散模型
- 正向過程
- 逆向過程
- 最終學習目標
- SDE形式表示方式
- 條件擴散模型
- Classifier-guidance
- Classifier-free-guidance
- Stable Diffusion: 在使用VAE壓縮後的latent空間進行建模
- 模型加速
- DPM-Solver
- Consistency Model
- Vision-Language Model(VLM)+文生圖
- 利用VLM進行更詳細的標註,以提升生成準確性
- 標註資訊更細粒度
- 包含位置佈局資訊
ps:這其實是一個非常概括的框架,其實每個知識點都有相應的論文,值得深入學習。
二、文生圖基礎知識
- prompts (提示詞)
提示詞為模型生成影像提供引導,通常包含主體描述、細節描述、修飾詞、藝術風格、藝術家等,在給出prompts的同時也可給出負向prompts。 - LoRA
Low-Rank Adaptation (LoRA),即低秩適應。在Stable Diffusion這一文字到影像合成模型的框架下,Lora被用於對預訓練好的大模型進行針對性微調,以實現對特定主題、風格或任務的精細化控制。
論文連結:https://arxiv.org/abs/2106.09685 - ComfyUI
一個工作流工具。透過直觀的介面和整合的功能,使用者可以輕鬆地進行模型微調、資料預處理、影像生成等任務,從而提高工作效率和生成效果。
連結:https://github.com/comfyanonymous/ComfyUI - ControlNet
一種可附加到預訓練的擴散模型(如Stable Diffusion模型)上的可訓練神經網路模組,透過引入額外的空間條件控制(例如邊緣圖、人體骨架、分割圖、深度圖等),來實現更細粒度的空間控制。
論文連結:https://arxiv.org/abs/2302.05543
三、零基礎實踐
- Step0:開通阿里雲PAI-DSW試用
- “阿里雲”開通免費試用
https://free.aliyun.com/?productCode=learn
發現“活動條件不滿足”,並且我已經完成個人認證了,應該是試用有效期已經過了。 - 直接用魔搭的資源
https://www.modelscope.cn/my/mynotebook/preset
選好配置後,“啟動”。
點選進入Notebook。
ps:因為直接使用了魔搭的資源,所以下面跳到Step3,直接來執行baseline。
- “阿里雲”開通免費試用
- Step3: 體驗一站式 baseline
- 下載baseline檔案
開啟終端Terminal。git lfs install git clone https://www.modelscope.cn/datasets/maochase/kolors.git
輸入指令。
- 進入資料夾,開啟baseline.ipynb檔案。
- 點選執行第一個程式碼塊,透過
pip install
安裝相關環境包。# 安裝 Data-Juicer 和 DiffSynth-Studio # Data-Juicer:資料處理和轉換工具,旨在簡化資料的提取、轉換和載入過程 # DiffSynth-Studio:高效微調訓練大模型工具
- 顯示安裝完成後,點選“Restart Kernel”重啟核。
- 首先保留原有prompt,點選一鍵執行,檢視效果。
- 其中最耗時的是模型微調部分,總耗時9分多。
- 初次執行(未修改prompts)的效果如下,與賽題給出的效果基本一致:
- 下載baseline檔案
- Step4: 調整prompts,檢視效果:
這裡首先對小女孩的外觀、環境做了一些調整,
提示詞改為:
文生圖的生成效果如下:prompt="二次元,一個綠色長髮小女孩,在海灘上坐著,雙手託著腮,很無聊,全身,白色連衣裙", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
再嘗試一下生成男生,提示詞為:
文生圖的生成效果如下:prompt="二次元,一個棕色短髮帥氣男孩,在草地上站著,雙手叉著腰,全身是汗,全身,足球服", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
四、部分程式碼解讀
- 資料處理
在下載資料、處理資料的過程中,我們會發現:
執行到[2]程式碼塊後,下載並儲存的原始資料集路徑下(/mnt/workspace/kolors/data/lora_dataset/train/
),包含1400+張的訓練圖片;
而執行到[4]程式碼塊後,處理後儲存的資料集路徑下(./data/lora_dataset_processed/train/
),包含的訓練圖片只剩120+張;
這是因為在資料處理過程中,篩去了大部分圖片。這一篩選過程是透過data-juicer
工具實現的。具體見[3]程式碼塊中的程式碼。
可以看到,篩選過濾的條件寫在data_juicer_config = """ # global parameters project_name: 'data-process' dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file np: 4 # number of subprocess to process your dataset text_keys: 'text' image_key: 'image' image_special_token: '<__dj__image>' export_path: './data/data-juicer/output/result.jsonl' # process schedule # a list of several process operators with their arguments process: - image_shape_filter: min_width: 1024 min_height: 1024 any_or_all: any - image_aspect_ratio_filter: min_ratio: 0.5 max_ratio: 2.0 any_or_all: any """ with open("data/data-juicer/data_juicer_config.yaml", "w") as file: file.write(data_juicer_config.strip()) !dj-process --config data/data-juicer/data_juicer_config.yaml
image_shape_filter
和image_aspect_ratio_filter
中:對於影像尺寸,篩選長或寬大於1024的影像;對於影像長寬比,篩選長寬比處於[0.5, 2.0]的影像。
ps:因為沒時間仔細查閱data-juicer
工具的文件,所以只能大致解讀程式碼實現的功能。但這已經很能說明data-juicer
這個工具在資料處理上的便捷性。
五、8圖故事生成
-
一
prompt="二次元,動漫電影效果,一個棕色短髮小女孩魔法師,身穿黑紫色魔法師長袍,在家中的魔法實驗室裡,四周擺滿了藥瓶和魔法書,她正專心地翻閱一本古老的魔法書籍", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
-
二
prompt="二次元,動漫電影效果,人物側面,一個棕色短髮的魔法師小女孩,穿著黑紫色魔法師長袍,揹著揹包,戴著黑色魔法帽,走在通往森林的小徑上,背景是茂盛的樹木和飄動的蝴蝶,她臉上帶著期待的微笑表情", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
-
三
prompt="二次元,動漫電影效果,一個棕色短髮的可愛小女孩魔法師,身著紫黑色的魔法長袍,手持木質魔杖,坐在森林中一個草地上,周圍是光彩照人的魔法植物,她正專心地向一隻坐在石頭上的老魔法狐狸學習如何施展光明魔法", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度,色情擦邊,手指尖銳",
-
四
prompt="二次元,動漫電影效果,人物側面,一個充滿神秘霧氣的森林湖泊邊,棕色短髮的小女孩魔法師站在岸邊,穿著紫黑色的魔法長袍,望向湖面,她正向一群水元素學習控水魔法,湖面波光粼粼,她嘴巴微張、表情略帶驚奇", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度,扭曲的手指,多餘的手指",
-
五
prompt="二次元,動漫電影效果,森林中的一個幽暗洞穴,棕色短髮的小女孩魔法師穿著紫色星星點綴的黑色長袍,正蹲下身來向一條巨大的紅龍學習火焰魔法,小女孩的眼中反射著火焰的光芒,小女孩張開手掌,她的手中升起一小團火焰", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
-
六
prompt="二次元,動漫電影效果,棕色短髮小女孩魔法師,她身穿黑紫色魔法師長袍,揮手與森林中的魔法小動物們告別,在森林中的一群魔法小動物圍在小女孩身邊,抬頭望向小女孩", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
-
七
prompt="二次元,動漫電影效果,棕色短髮的魔法師小女孩在一片熱鬧的市集中,身穿黑紫色長袍,準備參加魔法師大會,她四周是各路魔法師和炫目的魔法商品", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
-
八
prompt="二次元,動漫電影效果,棕色短髮的小女孩魔法師在魔法師大會的舞臺上展示她的最強魔法,她面帶微笑,正用木質魔杖引導著一場壯觀的魔法元素風暴,她的黑紫色長袍在魔法光芒中閃耀,觀眾席上的其他魔法師們露出讚歎的表情", negative_prompt="醜陋、變形、嘈雜、模糊、低對比度、手指模糊",
六、改進方向
- Prompt工程:透過更細粒度的prompts,進一步提升模型生成效果;
- 高質量訓練資料:透過質量更高、數量更多、風格種類更多的訓練資料對模型進行微調,使得模型生成效果更為豐富多樣;
- 模型微調:透過微調技巧,提高模型微調效果(目前暫不明確,需要進一步研讀Lora論文)。