Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01

kiroyi發表於2024-08-11

從零入門AI生圖原理&實踐是 Datawhale 2024 年 AI 夏令營第四期的學習活動(AIGC”方向),基於魔搭社群“可圖Kolors-LoRA風格故事挑戰賽”開展的實踐學習——

  • 適合想 入門並實踐 AIGC文生圖、工作流搭建、LoRA微調 的學習者參與

學習內容提要:從透過程式碼實現AI文生圖逐漸進階,教程偏重影像工作流、微調、影像最佳化等思路,最後會簡單介紹AIGC應用方向、數字人技術(選學)


Datawhale學習手冊置頂=>從零入門AI生圖原理&實踐

1. 賽題任務概述

參賽連結:可圖Kolors-LoRA風格故事挑戰賽
賽事目標:

  1. 參賽者需在可圖Kolors 模型的基礎上訓練LoRA 模型,生成無限風格,如水墨畫風格、水彩風格、賽博朋克風格、日漫風格......
  2. 基於LoRA 模型生成 8 張圖片組成連貫故事,故事內容可自定義;基於8圖故事,評估LoRA風格的美感度及連貫性 樣例:偶像少女養成日記

賽事流程:

  • 初賽:報名後-2024年8月31日23:59
  • 決賽:2024年9月5日答辯展示,線上決出一二三等獎(評委主觀評分)

2. task01-跑通baseline

2.1 比賽報名

點選參賽連結,同意協議後即可報名成功。
報名樣例

2.2 建立阿里雲PAI-DSW例項

每個新使用者都有一個免費試用的機會=>阿里雲免費試用連結
例項建立1
例項建立2
注意事項:

  1. 第③步務必選擇第二個, 第一個的GPU的視訊記憶體不夠
  2. 如果建立後未找到例項,可能是現有的例項和新建立的例項不在同一地區,請點選新建例項上方的地區(圖中為華東1(杭州))進行切換

2.3 baseline下載

  git lfs install
  git clone https://www.modelscope.cn/datasets/maochase/kolors.git

建立終端
從git下載baseline

2.4 baseline部分程式碼解讀

儲存資料集中的圖片及後設資料

os.makedirs("./data/lora_dataset/train", exist_ok=True)
os.makedirs("./data/data-juicer/input", exist_ok=True)
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
    for data_id, data in enumerate(tqdm(ds)):
        image = data["image"].convert("RGB")
        image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
        metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
        f.write(json.dumps(metadata))
        f.write("\n")

我們將資料集儲存為(text, image)的資料對並儲存在jsonl檔案中
JSONL檔案(JSON Lines)是一種每行包含一個獨立的 JSON 物件的文字檔案格式。每行都是一個有效的 JSON 物件,使用換行符分隔
jsonl
其中text的中文"二次元"是用Unicode編碼儲存的

模型載入

# Load models
model_manager = ModelManager(
                   torch_dtype=torch.float16, 
                   device="cuda",
                   file_path_list=[
                   "models/kolors/Kolors/text_encoder",
                   "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
                   "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
                ])
pipe = SDXLImagePipeline.from_model_manager(model_manager)

模型使用半精度浮點數(torch.float16),並指定了文字編碼器、UNet 模型和 VAE 模型的權重檔案

load_lora 函式

def load_lora(model, lora_rank, lora_alpha, lora_path):
    lora_config = LoraConfig(
        r=lora_rank,
        lora_alpha=lora_alpha,
        init_lora_weights="gaussian",
        target_modules=["to_q", "to_k", "to_v", "to_out"],
    )
    model = inject_adapter_in_model(lora_config, model)
    state_dict = torch.load(lora_path, map_location="cpu")
    model.load_state_dict(state_dict, strict=False)
    return model
  • lora_rank: LoRA 中低秩矩陣的秩,決定了介面卡的容量
  • lora_alpha: LoRA 的縮放因子,控制介面卡的影響力
  • init_lora_weights:LoRA 介面卡權重的初始化方法
  • target_modules:指定模型中的子模組注入 LoRA 介面卡。通常是與注意力機制相關的層,如這裡的to_q、to_k、to_v 和 to_out
  • inject_adapter_in_model:將 LoRA 介面卡注入到模型中

2.5 prompt修改技巧

首先列出最希望影像中包含的核心元素(如風格,主要人物),把次要的細節或補充描述放在句子的後面,這樣模型會先生成主元素,再填充細節。
以baseline中圖二的prompt為例:
prompt例子

如果我們把主次交換後會出現什麼情況?

Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01 圖二 原始prompt
Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01 圖二 修改prompt

修改prompt:二次元,日系動漫,演唱會的舞臺上衣著華麗的歌星們在唱歌,演唱會的觀眾席,人山人海,一個紫色短髮小女孩穿著粉色吊帶漏肩連衣裙坐在演唱會的觀眾席

由於主體資訊的後移,主體資訊將次體資訊當作了背景資訊,最終產生了主次融合後的結果

2.6 生成的一些結果

Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01 Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01 Datawhale X 魔搭 2024年AI夏令營第四期AIGC方向 Task01

對於單個人物,由於有詳細的描述可以達到較好的結果。但是對於群像圖來說,因為我提供的prompt有限,生成的較為粗糙。

3.相關知識學習推薦

關於文生圖技術研究的發展

對於文生圖的發展,我們不必從頭開始瞭解所有技術的詳細過程,但是大致知道技術是如何發展的有助於我們更高的理解模型。
DALL·E 2(內含擴散模型介紹)【論文精讀】中,會介紹從GAN,到VAE,VQVAE,再到現在普遍使用的擴散模型(Diffusion)的技術改進思想(影片從28:00開始),十分推薦觀看!

相關文章