Datawhale AI夏令營-第四期(AIGC方向)-Task01-可圖Kolors-LoRA風格故事挑戰賽

零度的python武器库發表於2024-08-09

從零入門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
      image
      image
      發現“活動條件不滿足”,並且我已經完成個人認證了,應該是試用有效期已經過了。
    • 直接用魔搭的資源
      https://www.modelscope.cn/my/mynotebook/preset
      image
      image
      選好配置後,“啟動”。
      image
      點選進入Notebook。
      ps:因為直接使用了魔搭的資源,所以下面跳到Step3,直接來執行baseline。
  • Step3: 體驗一站式 baseline
    • 下載baseline檔案
      git lfs install
      git clone https://www.modelscope.cn/datasets/maochase/kolors.git
      
      開啟終端Terminal。
      image
      輸入指令。
      image
    • 進入資料夾,開啟baseline.ipynb檔案。
      image
    • 點選執行第一個程式碼塊,透過pip install安裝相關環境包。
      # 安裝 Data-Juicer 和 DiffSynth-Studio
      # Data-Juicer:資料處理和轉換工具,旨在簡化資料的提取、轉換和載入過程
      # DiffSynth-Studio:高效微調訓練大模型工具
      
      image
    • 顯示安裝完成後,點選“Restart Kernel”重啟核。
      image
      image
    • 首先保留原有prompt,點選一鍵執行,檢視效果。
      image
    • 其中最耗時的是模型微調部分,總耗時9分多。
      image
    • 初次執行(未修改prompts)的效果如下,與賽題給出的效果基本一致:
      image
  • Step4: 調整prompts,檢視效果:
    這裡首先對小女孩的外觀、環境做了一些調整,
    提示詞改為:
    prompt="二次元,一個綠色長髮小女孩,在海灘上坐著,雙手託著腮,很無聊,全身,白色連衣裙",
    negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    文生圖的生成效果如下:
    image
    再嘗試一下生成男生,提示詞為:
    prompt="二次元,一個棕色短髮帥氣男孩,在草地上站著,雙手叉著腰,全身是汗,全身,足球服",
    negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    文生圖的生成效果如下:
    image

四、部分程式碼解讀

  • 資料處理
    在下載資料、處理資料的過程中,我們會發現:
    執行到[2]程式碼塊後,下載並儲存的原始資料集路徑下(/mnt/workspace/kolors/data/lora_dataset/train/),包含1400+張的訓練圖片;
    image
    而執行到[4]程式碼塊後,處理後儲存的資料集路徑下(./data/lora_dataset_processed/train/),包含的訓練圖片只剩120+張;
    image
    這是因為在資料處理過程中,篩去了大部分圖片。這一篩選過程是透過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_filterimage_aspect_ratio_filter中:對於影像尺寸,篩選長或寬大於1024的影像;對於影像長寬比,篩選長寬比處於[0.5, 2.0]的影像
    ps:因為沒時間仔細查閱data-juicer工具的文件,所以只能大致解讀程式碼實現的功能。但這已經很能說明data-juicer這個工具在資料處理上的便捷性

五、8圖故事生成

  • prompt="二次元,動漫電影效果,一個棕色短髮小女孩魔法師,身穿黑紫色魔法師長袍,在家中的魔法實驗室裡,四周擺滿了藥瓶和魔法書,她正專心地翻閱一本古老的魔法書籍",
    negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    image
  •   prompt="二次元,動漫電影效果,人物側面,一個棕色短髮的魔法師小女孩,穿著黑紫色魔法師長袍,揹著揹包,戴著黑色魔法帽,走在通往森林的小徑上,背景是茂盛的樹木和飄動的蝴蝶,她臉上帶著期待的微笑表情",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    image
  •   prompt="二次元,動漫電影效果,一個棕色短髮的可愛小女孩魔法師,身著紫黑色的魔法長袍,手持木質魔杖,坐在森林中一個草地上,周圍是光彩照人的魔法植物,她正專心地向一隻坐在石頭上的老魔法狐狸學習如何施展光明魔法",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度,色情擦邊,手指尖銳",
    
    image
  •   prompt="二次元,動漫電影效果,人物側面,一個充滿神秘霧氣的森林湖泊邊,棕色短髮的小女孩魔法師站在岸邊,穿著紫黑色的魔法長袍,望向湖面,她正向一群水元素學習控水魔法,湖面波光粼粼,她嘴巴微張、表情略帶驚奇",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度,扭曲的手指,多餘的手指",
    
    image
  •   prompt="二次元,動漫電影效果,森林中的一個幽暗洞穴,棕色短髮的小女孩魔法師穿著紫色星星點綴的黑色長袍,正蹲下身來向一條巨大的紅龍學習火焰魔法,小女孩的眼中反射著火焰的光芒,小女孩張開手掌,她的手中升起一小團火焰",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    image
  •   prompt="二次元,動漫電影效果,棕色短髮小女孩魔法師,她身穿黑紫色魔法師長袍,揮手與森林中的魔法小動物們告別,在森林中的一群魔法小動物圍在小女孩身邊,抬頭望向小女孩",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    image
  •   prompt="二次元,動漫電影效果,棕色短髮的魔法師小女孩在一片熱鬧的市集中,身穿黑紫色長袍,準備參加魔法師大會,她四周是各路魔法師和炫目的魔法商品",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度",
    
    image
  •   prompt="二次元,動漫電影效果,棕色短髮的小女孩魔法師在魔法師大會的舞臺上展示她的最強魔法,她面帶微笑,正用木質魔杖引導著一場壯觀的魔法元素風暴,她的黑紫色長袍在魔法光芒中閃耀,觀眾席上的其他魔法師們露出讚歎的表情",
      negative_prompt="醜陋、變形、嘈雜、模糊、低對比度、手指模糊",
    
    image

六、改進方向

  1. Prompt工程:透過更細粒度的prompts,進一步提升模型生成效果;
  2. 高質量訓練資料:透過質量更高、數量更多、風格種類更多的訓練資料對模型進行微調,使得模型生成效果更為豐富多樣;
  3. 模型微調:透過微調技巧,提高模型微調效果(目前暫不明確,需要進一步研讀Lora論文)。

相關文章