お久しぶりの Stable Diffusion 周辺を、技術視点で楽しむ
最近、 Stable Diffusion を stable-diffusion-webui で経由で改めて使ってみたら、技術的にも知らなかったことがいくつもあったのでメモ書き。
ControlNet
超絶強力な、生成画像を特定の条件に沿うように制御するニューラルネットワーク。元の基盤モデルはどれでも良く、きちんと動作する。
v1.1 時点で、Depth, Semantic Segmentation, Human Pose, Fake Scribbles, HED Boundary, M-LSD Lines, Canny Edge といった条件に対応し、対象画像から構図だったりポーズだったりセグメントだったりにエッジ抽出だったりマスクされた領域補完だったり、様々な条件付き画像生成が可能。既存のデータセットやアーキテクチャと組み合わせているのもアツい。応用範囲が広い。
革新的なので、ControlNet での画像生成を使ったことがない人はマストで使ってみるべき。イラスト生成のコンテキストではポーズ指定のみ取り上げられがちだが、様々な構図を再現可能。マジすごいョ…。これから更に、様々な条件付き画像生成が可能になっていくのであろう。
SD-WebUI の extention として使える ControlNet WebUI もあって、sd-webから簡単に利用が可能。
わかりやすい解説等。
LoRA: Low-rank Adaptation for Fast Text-to-Image Diffusion Fine-tuning
- https://github.com/cloneofsimo/lora
- https://github.com/kohya-ss/sd-scripts/blob/main/docs/train_network_README-ja.md (上記LoRA の実装を参考にした LoRA 学習)
LoRAは元論文ではLoRA: Low-Rank Adaptation of Large Language ModelsとLLM(transformers)にたいしての論文だが、SD で利用される LoRA はこれらの実装が使われていることが多い。cloneofsimo/lora の実装では、Pivotal Tuning Inversion(PTI)を元に、高品質な出力になるような学習が可能。
LoRA は基盤モデルに低ランク行列を追加し、その部分だけを学習させることで、学習時のコストを下げることができ、また出来上がるパラメータのサイズも小さいので、パラメータのファイルサイズも、メモリ利用量も少なくすることができる。
画像生成時に LoRA を利用する利用者の視点からは、LoRA は「重ねがけ」がしやすい。基盤モデルAにLoRAで学習したパラメータBと、LoRA で学習したパラメータCを重ねがけすることができ、大きな変更なくAに対してBとCの特徴を持った画像が生成できる。SD-WebUI では <lora:model_a:1.0>, <lora:model_b:0.7>
といったテキストプロンプトからどの LoRA をどれほど適用するのかがササっと指定が可能。
なお、LoRA (LLM)についてのわかりやすい日本語資料はこちら。
Textual Inversion embeddings
- https://huggingface.co/docs/diffusers/training/text_inversion
- https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion
SDでは、生成の入力の一つに Clip Text Encoder の embeddings 出力(文ベクトル)を利用する。この embeddings を作る際に、特定の特徴を覚えた新しい単語を追加して、意図した出力になるよう調整する手法、と理解している(が曖昧)。
通常人間が text prompt に出力が変化するような文字列を入れて調整するが、Textual Inversionでは特定の表現を学習したテキストの embeddings を直接突っ込めるため、通常のテキストでは指示できないような更に細かい調整ができる。学習後の embeddings データは文ベクトルと同ランクの embeddings なので、ファイルサイズはめちゃくちゃ小さい。
これらembeddingsの有名所では、ネガティブプロンプトに指定するような単語の特徴を学習させ、手軽にネガティブプロンプトをいい感じに追加できるEasyNegativeや、変な腕・指の出力を抑えるbadhandv4やbad_promptなどがある。
checkpoint model の merge
checkpoint model を組み合わせて、別のcheckpointを作る。やっていることは単純で、モデル同士のパラメータを線形結合、つまり足し掛けするだけ。シンプルすぎてびっくりする。これだけで、AとBのモデルの特徴を兼ね揃えたCというモデルが作れる(!!!)。巷にあふれる XxxMix という名称のモデルは、複数のモデルのmergeモデルである。ただ、merge モデルと言っても、単純な線形結合しているだけではないモデルも有り、ネットワーク層ごとに割合を変えたり(これも線形結合には変わりないが…)と工夫しているようだ。
- https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#checkpoint-merger
- https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/How-to-make-your-own-Inpainting-model
SD-WebUI は、これらの新しい技術がどんどん使えるようになっており、たとえば LoRA / embeddings / 基盤モデル などはディレクトリに放り込めば動くし、extension で機能追加(sd-webui-controlnetとか)もできたり、UIのとっつきにくさはあるとはいえ、よくできているなーと感心する。ざっくりとした全機能説明のwikiページもある。無印SDを使っていると、何ができるのか自分で情報を集めなくてはならないが、SD-WebUIはドレンドはたいてい含まれているので流行りが解るというのも嬉しい。
画像生成AIには、もっぱら Midjourney ばかり使っていたのだけど、Stable Diffusion を改めて触るとOSSかつチェックポイントが公開されていることによる、エコシステムの進化や面白さも感じるなぁ。細かく見ていくと、あれもこれも興味深く、沼にハマってしまいそうなので深追いはしていないけど、ハマっても面白そうな沼である。
と、ここまで書いてそういえばAIアートの新時代:CLIPとStable Diffusionを活用した画像生成技術とその応用が積読だったなぁと読み始める。このメモに書いた内容はもちろん網羅されているし、SDはもちろんのこと、Clip Encoder 周辺に対しても様々な試験的アプローチをしていてめちゃ面白い。適用したらどうなるのか、という結果込みで書かれているので、どう生成画像が変わるのか、というのも伺い知れる。この本を読むと楽し~となれること間違いなし。