---
title: "用工程師的方式入門生成式 AI - Stable Diffusion"
date: 2023-03-01T00:00:00+08:00
publishDate: 2023-03-01T00:00:00+08:00
lastmod: 2025-10-19T16:56:21+08:00
tags: ["心得","經驗","人工智慧","AI","Stable Diffusion","Python"]
toc: true
permalink: "https://blog.aotoki.me/posts/2023/03/01/learn-generative-ai-stable-diffusion-in-programmer-way/"
language: "zh-tw"
---


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

<!--more-->

## 圖像生成{#generative-image}

相比 ChatGPT 我對於圖像類型的生成更有興趣，在搜集資料時在 CivitAI 上注意到了 [Pastel Mix](https://civitai.com/models/5414/pastel-mix-stylized-anime-model) 這個動漫風格化模型，他在 CivitAI 上的 Animate 分類中也是非常熱門的 Checkpoint（檢查點，Stable Diffusion 的模型格式）

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

![Stable Diffusion WebUI Hi-Res Fix](images/01.png)

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

## Diffusers

目前大部分的 Deep Learning 相關的教學，都會透過 [HuggingFace](https://huggingface.co/) 這個 AI 界的 GitHub 來抓取模型、資料集，其中針對 Diffusion 類型的處理，有推出一個叫做 [Diffusers](https://github.com/huggingface/diffusers) 的套件，讓我們可以用來實現相關的應用。

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

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

> 撰寫本文時我也找了幾篇文章補足一下知識，像是 [Stable Diffusion 的原理](https://www.nolibox.com/creator_articles/principle_of_stablediffusion.html)這篇寫得非常容易懂，以及[理解 Diffusion Model](https://medium.com/ai-blog-tw/%E9%82%8A%E5%AF%A6%E4%BD%9C%E9%82%8A%E5%AD%B8%E7%BF%92diffusion-model-%E5%BE%9Eddpm%E7%9A%84%E7%B0%A1%E5%8C%96%E6%A6%82%E5%BF%B5%E7%90%86%E8%A7%A3-4c565a1c09c) 等文章，簡單來說我們是嘗試利用 Prompt（提示）從模型資料中取樣，提取出構成圖像的資訊，然後逐漸的還原出一張「可能的圖片」

## 重現效果{#reproduce}

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

![原始版本](images/02.jpeg)

> 想知道沒有調整過的狀態效果，可以利用 HuggingFace 上 Pastel Mix [頁面右方](https://huggingface.co/andite/pastel-mix)的「Hosted inference API」功能來直接運行看看。

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

 * Better VAE 版本
 * 使用 DPM++ 2M Karras 或相似的演算法取樣
 * 接近的參數（e.g. `CFG Scale = 7`）
 * Hi-Res Fix 的處理

實際上最困難的是 Hi-Res Fix 的處理，因為我們不清楚是如如何實現的，還好我在 GitHub 上有找到一些線索 - [New Hi-Res Fix](https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/6509#discussioncomment-4627341)

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

* 初始圖像（Text to Image）
* 放大圖像（Latent Upscale）
* 細化圖像（Image to Image）

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

```python
def generative(prompt, ...): # 省略其他參數
  phase1 = t2i_pipe(
    prompt = prompt,
    # ...
  )

  phase2 = upscale_pipe(
    prompt = prompt,
    image = phase1.images,
    # ...
  )

  phase3 = i2i_pipe(
    prompt = prompt,
    image = phase2.images,
    # ...
  )

  return phase3.images[0]
```

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

![成果](images/03.png)

因為完整程式碼會佔用不少篇幅，有興趣的可以在 [Replicate](https://replicate.com/elct9620/pastel-mix) 上玩看看我的成果，以及到 [GitHub](https://github.com/elct9620/replicate-pastel-mix) 看我目前部署到上面的實作是怎樣的。

## 未來展望{#future}

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

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

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

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

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

