蒼時弦也
蒼時弦也
資深軟體工程師
發表於

用工程師的方式入門生成式 AI - Stable Diffusion

上週(2023/02/22)可能是看了不少 AI 應用的發展,覺得該趕緊補上進度,以免在未來來不及掌握這樣的工具。不過,如果只是串接 ChatGPT 的 API 或者拿 Stable Diffusion WebUI 來產生圖,似乎不是工程師也能做到,作為工程師能做些什麼嗎?

圖像生成

相比 ChatGPT 我對於圖像類型的生成更有興趣,在搜集資料時在 CivitAI 上注意到了 Pastel Mix 這個動漫風格化模型,他在 CivitAI 上的 Animate 分類中也是非常熱門的 Checkpoint(檢查點,Stable Diffusion 的模型格式)

直接使用 Stable Diffusion Web UI 搭配 better-vae 版本的效果,我們可以生成像這樣的效果,類似油畫的厚塗筆觸加上很不錯的光影表現。

Stable Diffusion WebUI Highres Fix

假設我們想要直接使用 Python 來產生這樣的圖片,我們該如何實現這件事情呢?

Diffusers

目前大部分的 Deep Learning 相關的教學,都會透過 HuggingFace 這個 AI 界的 GitHub 來抓取模型、資料集,其中針對 Diffusion 類型的處理,有推出一個叫做 Diffusers 的套件,讓我們可以用來實現相關的應用。

為了要實現跟 Stable Diffusion WebUI 類似的效果,我花了幾天的時間做了不同嘗試,最主要的就是去了解「基本原理」這也是我們身為軟體工程師必要的技能,在短時間內理解 Domin Knowledge 然後轉換成「應用(Application)」來幫助公司、客戶解決問題。

要實現類似的效果,我們不需要知道 Diffusion Model(擴散模型)跟 Stable Diffusion 所做的改良,只需要簡單地了解到過程中需要依靠 Sampler(取樣)來實現這件事情。

撰寫本文時我也找了幾篇文章補足一下知識,像是 Stable Diffusion 的原理這篇寫得非常容易懂,以及理解 Diffusion Model 等文章,簡單來說我們是嘗試利用 Prompt(提示)從模型資料中取樣,提取出構成圖像的資訊,然後逐漸的還原出一張「可能的圖片」

重現效果

在 Pastel Mix 這個模型中,是有提供 HuggingFace Space 的範例可以使用,然而跑出來的效果並不如預期,一方面是彩度非常低,另一方面則是細節非常少,跟上面的範例相比非常差,因此我們需要自己反推 Stable Diffusion WebUI 做了哪些處理來實現。

原始版本

想知道沒有調整過的狀態效果,可以利用 HuggingFace 上 Pastel Mix 頁面右方的「Hosted inference API」功能來直接運行看看。

在模型介紹中的生成資訊裡面,我們可以看到 Prompt、Steps 等不同參數以及啟用了 Stable Diffusion WebUI 的 Highres fix 功能,也就是說要得到相似的成果,我們需要以下條件。

  • Better VAE 版本
  • 使用 DPM++ 2M Karras 或相似的演算法取樣
  • 接近的參數(e.g. CFG Scale = 7
  • Highres fix 的處理

實際上最困難的是 Highres fix 的處理,因為我們不清楚是如如何實現的,還好我在 GitHub 上有找到一些線索 - New highres fix

先不論能不能完全實現相同的效果,我們要達到類似的效果基本上需要三個步驟:

  • 初始圖像(Text to Image)
  • 放大圖像(Latent Upscale)
  • 細化圖像(Image to Image)

剛好這三件事情在 Diffusers 都能找到替代方案,同時 Sampler 在模型的範例中也得知了對應的例子,因此可以繼續反推出類似這樣的程式碼。

 1def generative(prompt, ...): # 省略其他參數
 2  phase1 = t2i_pipe(
 3    prompt = prompt,
 4    # ...
 5  )
 6
 7  phase2 = upscale_pipe(
 8    prompt = prompt,
 9    image = phase1.images,
10    # ...
11  )
12
13  phase3 = i2i_pipe(
14    prompt = prompt,
15    image = phase2.images,
16    # ...
17  )
18
19  return phase3.images[0]

實際的原理跟「畫圖」的過程差不多,首先我們先做打草稿的處理產生第一個低解析度的圖片,然後將他放大後,再一次根據提示對放大後的圖片加入細節,這樣就能獲得很細緻的圖片。

成果

因為完整程式碼會佔用不少篇幅,有興趣的可以在 Replicate 上玩看看我的成果,以及到 GitHub 看我目前部署到上面的實作是怎樣的。

未來展望

以我個人的觀察來看,目前 ChatGPT 類型的語言模型已經慢慢進入到可以商業化的階段,在圖像生成類型目前的成本還是偏高,如果要搭配上可控的生成還需要一點時間,但可能是一兩年內的事情(Stable Diffusion 2 的 ControlNet 已經實現這件事情)

正因如此,未來在 AI 上我認為會有三種不同的角色存在:

  • 使用者 - 利用 AI 工具輔助工作
  • 開發者 - 應用 AI 模型開發工具
  • 訓練者 - 製作 AI 訓練資料訓練

軟體工程師的角色基本上應該是位於「開發者」跟「訓練者」之間的,未來我們的工作會慢慢的需要整合模型,或者協助製作一些小型資料集(如:Embedding)來符合特定的商業需求,而訓練者則是 AI 研究員以及一些創作者,像是未來插畫家可能更像是原畫,給予角色設定後由 AI 完成後續工作。

雖然使用 AI 工具是很重要的技能,除此之外我認為對工程師來說要開始具備整合 AI 技術進行開發的能力會變得很關鍵,因為會有越來越多的軟體需要有 AI 輔助來強化能力。