Slide 1

Slide 1 text

Stable Diffusionで
 自分だけの
 お絵描きAIを作ろう
 
 
 
 早野康太


Slide 2

Slide 2 text

自己紹介
 ● 名前
 ○ 早野 康太
 ● お仕事
 ○ 自然言語モデルの改善
 ● 春アニメおすすめ
 ○ 僕ヤバ
 ○ 水星の魔女 第2期
 ● 映画
 ○ BLUE GIANT
 → 神でした
 (原作一気買い)


Slide 3

Slide 3 text

Stable Diffusionとは
 ● 文章を与えると画像を生成してくれるモデル
 ● 2022年にStability AIが公開
 ○ Google Colaboratoryを使えばサクッと試せる
 ■ https://huggingface.co/stabilityai/stable-diffusion-2
 
 
 


Slide 4

Slide 4 text

Stable Diffusionとは
 ● モデルを誰でも利用できるため
 Stable Diffusionを使ったサービスや派生モデルの公開など
 さかんに行われている
 ○ 画像生成bot
 ■ Line, Discordなど
 ○ 派生モデル
 ■ NovelAI Diffusion
 ■ Waifu Diffusion
 ■ ほか、Huggingfaceで検索したら無限に出てくる
 ● Models - Hugging Face 
 


Slide 5

Slide 5 text

Stable Diffusionとは
 ● Stable Diffusion
 ○ 誰でも利用できる
 → 自分だけのオリジナルモデルを作成可能
 ○ lambdalabs/sd-pokemon-diffusers · Hugging Face
 
 
 


Slide 6

Slide 6 text

今回の発表では
 ● Stable Diffusionをfine-tuneして
 オリジナルモデルを作成するデモを
 Google Colaboratoryで実践します
 ○ データセットの作成→学習→モデル保存&ロードまでを
 ノートブックで完結させます
 ■ 学習用notebook
 


Slide 7

Slide 7 text

前提とする知識
 ● PyTorch
 ○ 今日お見せする学習コードはPyTorchで書かれています
 ○ 最低限PyTorchで簡単なNN学習を実装できる程度の知識は必要です
 ● 機械学習
 ○ 深層学習の基本的な用語の意味については知っている前提で
 進めます
 


Slide 8

Slide 8 text

アジェンダ
 ● データセットの作成
 ○ 画像の収集
 ○ キャプション付け
 ■ BLIPを利用して自動でキャプションをつけよう
 ● 学習
 ○ Stable Diffusionの学習のやり方
 ○ 学習コードの解説
 ● 推論
 ○ 作ったモデルで画像を生成してみる


Slide 9

Slide 9 text

データセットの作成
 ● データセットの構成
 ○ 画像とキャプションが1対1に対応したもの
 出典:ぼっち・ざ・ろっく! CloverWorks、アニプレックス、芳文社、 ©はまじあき/芳文社・アニプレックス キュビズムみたいな作画になった
 後藤ひとり
 画像
 キャプション
 ×N


Slide 10

Slide 10 text

データセットの作成
 ● 画像収集
 ○ Safebooru (画像投稿サイト) のAPIを利用して収集
 ■ “umamusume”タグで絞り込んで15,000枚
 ● キャプション付け
 ○ BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
 ■ 2022年1月に論文で発表されたモデル
 ■ 画像を入力として
 その画像に即したキャプションを出力できる


Slide 11

Slide 11 text

データセットの作成
 image file
 caption
 path/to/image1.png 
 a group of cartoon animals sitting next to ...
 path/to/image2.png 
 an anime girl with long hair and a bow in her ...
 path/to/image3.png 
 a couple of anime girls laying on top of a bed
 csv
 画像ファイル


Slide 12

Slide 12 text

Stable Diffusionの学習
 VAE
 VAE
 Denoising Autoencoder (UNET) Text Encoder input text 出典:ぼっち・ざ・ろっく! CloverWorks、アニプレックス、芳文社、 ©はまじあき/芳文社・アニプレックス

Slide 13

Slide 13 text

Stable Diffusionの学習
 VAE
 VAE
 Denoising Autoencoder (UNET) Text Encoder input text 今回はここだけ
 学習する
 出典:ぼっち・ざ・ろっく! CloverWorks、アニプレックス、芳文社、 ©はまじあき/芳文社・アニプレックス

Slide 14

Slide 14 text

Stable Diffusionの学習
 
 
 x 0 x 1 = x 0 + ε 1 x 2 = x 1 + ε 2 x 3 = x 2 + ε 3 z 1 = x 0 - ε θ (z 0 , 0) z 2 = z 1 - ε θ (z 1 , 1) z 3 = z 2 - ε θ (z 2 , 2) 出典:ぼっち・ざ・ろっく! CloverWorks、アニプレックス、芳文社、 ©はまじあき/芳文社・アニプレックス z 0

Slide 15

Slide 15 text

Stable Diffusionの学習
 
 
 x 0 x 1 = x 0 + ε 1 x 2 = x 1 + ε 2 x 3 = x 2 + ε 3 z 1 = x 0 - ε θ (z 0 , 0) z 2 = z 1 - ε θ (z 1 , 1) z 3 = z 2 - ε θ (z 2 , 2) 出典:ぼっち・ざ・ろっく! CloverWorks、アニプレックス、芳文社、 ©はまじあき/芳文社・アニプレックス z 0 各タイムステップにおいて 
 付加したノイズをターゲットとして 
 ロスを計算する


Slide 16

Slide 16 text

Stable Diffusionの学習
 
 
 raw pixel value
 VAE
 latent
 noisy latent
 + noise
 input text
 Text
 Encoder
 embedding 
 UNET
 prediction
 loss
 velocity


Slide 17

Slide 17 text

Stable Diffusionの学習
 
 
 raw pixel value
 VAE
 latent
 noisy latent
 + noise
 input text
 Text
 Encoder
 embedding 
 UNET
 prediction
 loss
 velocity
 前処理


Slide 18

Slide 18 text

余談: velocityってなんぞ?
 
 x : 画像の値 
 ε : ノイズの値 
 z = αx + σε ● Stable Diffusion 1.0
 ○ εがターゲット
 ● Stable Diffusion 2.0
 ○ vがターゲット
 
 ※理屈がわかっていないため深入りしません 
 
 α, σ : ノイズ付与のハイパラ
 (タイムステップごとに変動) 
 v = dz / dφ Progressive Distillation for Fast Sampling of Diffusion Models

Slide 19

Slide 19 text

学習してみた結果
 
 ● 作りたかったモデル
 ○ ウマ娘風の絵柄でイラストを生成するAI
 (3期も始まるので備えたい)
 
 ● データセット
 ○ 画像
 ■ Safebooru APIを使い”umamusume”タグで
 収集した画像(10,000 - 15,000枚)
 ○ キャプション
 ■ 収集した画像をもとにBLIPで生成
 ● モデル
 ○ backbone
 ■ stabilityai/stable-diffusion-2


Slide 20

Slide 20 text

素のStable Diffusion
 
 ● プロンプト
 ○ “a girl in a maid outfit holding a teapot”


Slide 21

Slide 21 text

UMA Diffusion
 
 ● プロンプト
 ○ “a girl in a maid outfit holding a teapot”
 ● 画像数: 10,000
 ● ハイパラ
 ○ epochs: 30
 ○ batch_size: 4
 ○ lr: 5e-6
 ○ lr_scheduler: cosine
 ○ warmup_ratio: 0.06
 ○ resolution: 512x512
 ○ transforms
 ■ RandomCrop
 


Slide 22

Slide 22 text

UMA Diffusion
 
 ● プロンプト
 ○ “a girl in a maid outfit holding a teapot”
 ● 画像数: 15,000
 ● ハイパラ
 ○ epochs: 30
 ○ batch_size: 4
 ○ lr: 5e-6
 ○ lr_scheduler: cosine
 ○ warmup_ratio: 0.06
 ○ resolution: 512x512
 ○ transforms
 ■ RandomCrop
 


Slide 23

Slide 23 text

UMA Diffusion
 
 ● プロンプト
 ○ “a girl in a maid outfit holding a teapot”
 ● 画像数: 10,000
 ● ハイパラ
 ○ epochs: 30
 ○ batch_size: 4
 ○ lr: 5e-6
 ○ lr_scheduler: cosine
 ○ warmup_ratio: 0.06
 ○ resolution: 512x384
 ○ transforms
 ■ RandomCrop
 


Slide 24

Slide 24 text

UMA Diffusion
 
 ● プロンプト
 ○ “a girl in a maid outfit holding a teapot”
 ● 画像数: 15,000
 ● ハイパラ
 ○ epochs: 30
 ○ batch_size: 4
 ○ lr: 5e-6
 ○ lr_scheduler: cosine
 ○ warmup_ratio: 0.06
 ○ resolution: 512x384
 ○ transforms
 ■ RandomCrop
 


Slide 25

Slide 25 text

finetune方法発展
 ● 今回はシンプルなfinetuneを紹介したが
 さまざまなfinetune手法が提案されている 
 ○ Text Inversion
 ■ An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion
 ○ DreamBooth
 ■ DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 
 ○ Hypernetworks
 ■ NovelAI Improvements on Stable Diffusion
 ○ LoRA
 ■ GitHub - cloneofsimo/lora: Using Low-rank adaptation to quickly fine-tune diffusion models.


Slide 26

Slide 26 text

やってみた所感
 ● DNNの学習を触ったことがあるなら
 学習コードを回すこと自体は全然難しくない
 ○ 計算資源の確保が大変 (GPUメモリ16GB以上推奨)
 
 ● 10,000枚程度の画像でもある程度のクオリティの
 モデルを学習できた
 ○ とはいえ安定したクオリティの出力は難しい
 ○ 特に手の作画は崩れてしまう
 
 
 ● よりクオリティを追求しようとするなら
 発展的な手法を使ったfinetuneを試したいところ (いずれ挑戦したい)