見出し画像

VRAM 4GBではじめるStable Diffusion - ゲーム素材を作ろう2 基礎知識

 この草稿は、VRAM 4GB環境下で『Stable Diffusion』を利用して、ローカルでの画像生成をするためのものです。生成する画像はファンタジー系の同人ゲーム/インディーゲームの画像素材です。この草稿は、2023年の2月下旬~3月上旬にかけて執筆されました。

 草稿をまとめて大幅増補したものを電子書籍で出しました。『Kindle Unlimited』ユーザーの方は無料で読めます。是非読んでください。

 この草稿では『Stable Diffusion』の簡単な解説をおこない、『AUTOMATIC1111版 Stable Diffusion web UI』の導入や使い方について説明します。また「背景」「キャラクター」「アイテム」「絵地図」「UI部品」といった画像素材の作成方法を説明します。

 この草稿は、私が2022~2023年に、同人ゲーム『Little Land War SRPG』を開発した時の知見を中心にまとめたものです。こちらも購入して遊んでいただけると幸いです。


本章の概要

 本章では「Stable Diffusionとは何か」「Web UIの各設定項目の解説」「設定のTIPS」を扱います。

 「txt2img」を中心に、各設定項目にどういった意味があり、どういった結果に繋がるのかを書いています。『Stable Diffusion』を道具として扱う上で、知っておくべき知識をまとめています。

 以下、本章の目次です。

  • Stable Diffusionについて

  • Web UIの設定と画像生成

    • Stable Diffusion checkpoint

    • タブ

  • txt2img

    • Generateボタン

    • Prompt

    • Negative Prompt

    • Sampling method

    • Sampling Steps

    • Width, Height

    • Restore faces

    • Tiling

    • Hires. fix

    • Batch count

    • Batch size

    • CFG Scale

    • Seed

    • Script

    • 出力画像

  • img2img

    • Denoising strength

  • Settings

    • Saving images/grids

  • 呪文や設定の試行錯誤


Stable Diffusionについて

 非常にざっくりと言うと、テキストを画像に変更するモデルです。「Diffusion = 拡散」ということで、拡散モデルというものを使っています。学習の過程では、画像に徐々にノイズを載せていき、ノイズだらけの状態にします。そして生成の過程では、ランダムなノイズ画像からノイズを取り除いていき、きれいな画像を作ります。

 生成時のランダムなノイズ画像には「元の画像」は存在しません。学習した情報をもとに「元の画像」と思われるものを得ます。よくある勘違いですが、学習した画像を継ぎ接ぎしてコラージュのように画像を作っているわけではありません。

 『Stable Diffusion』ではこのノイズからの元画像の復元処理に、テキストをベクトル化したものを関連づけています。たとえば「cat」という単語に、「猫らしい」という方向と大きさがあります。また、学習したそれぞれの単語に、そうした情報があります。このテキストのベクトルを手掛かりに、ランダムなノイズ画像から「元の画像」と思われるものを作り出します。

 『Stable Diffusion』は、こうした仕組みで動いています。また、こうした前提から、いくつかの特性が分かります。

  • 単語と画像の対応は、学習したデータにより決まる。

  • 学習モデル(単語と画像の関連付け)を換えると、同じ入力文字列でも違う画像が生成される。

  • ランダムのシード(初期のノイズ画像)を違う値にすると、同じ入力文字列でも違う画像が生成される。

  • 何段階かの逆拡散過程(ノイズを除去する作業)を経て、画像を精細化する。逆拡散過程を増やすと時間はかかるが精細になる。

 こうした特性を理解していると『Stable Diffusion』は扱いやすいです。それでは実際に『Stable Diffusion』を利用していきましょう。


Web UIの設定と画像生成

 『Web UI』上で設定できるパラメータと、生成画像への影響を見ていきます。

Stable Diffusion checkpoint

 『Web UI』の先頭にある項目です。学習モデルを切り替えます。以下のフォルダに配置した学習モデル(.ckpt or .safetensors 形式のファイル)を選べます。

<インストール先>/models/Stable-diffusion/

 切り替えには時間がかかりますので、同じ学習モデルを使った作業を集中しておこなった方がよいです。

 新たな学習モデルを配置した際は、この項目の横に付いているリロードボタンを押すと、ドロップダウンリストが更新されます。

タブ

 いくつかのタブが並んでいます。基本的に使うのは「txt2img」「img2img」の2つです。

(このタブは「Extensions」(拡張機能)を追加すると増えることがあります)

 「txt2img」タブは、「Prompt」入力欄に入力した文字列から画像を生成します。

 「img2img」タブは、読み込んだ画像と「Prompt」入力欄に入力した文字列から、新しい画像を生成します。また、「img2img」では「Inpaint」機能を利用して、画像の一部だけを書き換えることができます。

 「img2img」を使えば、写真や3Dモデルソフトで作った画像を読み込み、その画像に沿った画像を生成させされます。また、「txt2img」で生成した画像の一部を修正してクオリティを上げることもできます。


txt2img

 以下は「txt2img」タブを選んだ時の設定です。

Generateボタン

 画像生成を開始します。生成には時間がかかります。クリックすると進行バーが表示されて、完了すると進行バーが消えます。

Prompt

 入力文字列です。入力文字列は、俗に「呪文」と呼ばれます。入力した文字列からベクトルを得て画像を生成します。複数の単語を書いてフレーズを作ったり、カンマ区切りで複数のフレーズを書いて合成したりできます。

 こちらについては別の章で詳しく解説します。

Negative Prompt

 入力文字列その2です。「Prompt」が正の方向のベクトルを設定するなら、「Negative Prompt」は負の方向のベクトルを設定します。

 たとえば「Prompt」に「cat」と入力すると、catと思われる画像を「生成する」力が働きます。対して「Negative Prompt」に「cat」と入力すると、catと思われる画像を「生成しない」力が働きます。

 こうした「Prompt」と「Negative Prompt」のベクトルの合成結果が、最終的な出力画像になります。

Sampling method

 『Stable Diffusion』では、サンプラーを使って、逆拡散過程のステップ数を大幅に減らして高速化しています。このサンプラーには種類があって選べるようになっています。それぞれ異なる方法で過程を短縮しています。高速に結果が出るものもあれば、低速のものもあります。それぞれ過程を省いているので出力される画像が変わります。速度だけでなく、どういった画像を得たいかによって「Sampling method」を選ぶ必要があります。

 現時点でのデフォルトは「Euler a」です。末尾に「a」が付いている「Sampling method」は、ステップごとに絵が変わります。ランダム性を高めたい場合には末尾が「a」の「Sampling method」を選ぶとよいです。

 「Euler」のように末尾に「a」が付いていないものは、ステップ数を増やすと絵が緻密化します。より精細な画像を生成したい場合には、末尾が「a」でない「Sampling method」を選ぶとよいです。

 以下のURLに「Sampling method」の例が掲載されています。

Sampling method selection
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#sampling-method-selection

Sampling Steps

 何ステップ実行して画像を生成するかです。デフォルトでは「20」です。このステップ数を極端に小さくすると、ノイズが十分に除去されていない画像が出力されます。逆にステップ数を増やすと時間が掛かります。

 写真のような精細な画像ではなくゲーム素材に使う画像なら、ステップ数を「16」ぐらいに落としても問題ありません。

Width, Height

 生成する画像の横幅と高さです。1系統の学習モデルでは、512×512で学習しているため、生成も512×512にするとスムーズです。1系統では、縦横比を極端に変えると絵が破綻することが多いです。この縦横比の問題は、2系統では改善されています。

 2系統の「768」と名前が付いた学習モデルは768×768で学習しています。こちらを使う場合は、生成も768×768に合わせるとよいです。

 この値を大きくすると使用するVRAMが増えて、生成が完了するまでの時間が長くなります。また低VRAM環境ではエラー発生の原因になります。そのため、なるべく大きくしない方がよいです。

 私が推奨する方法は、短辺が512になる設定で画像を生成したあと、画像拡大に特化したAIツールを使い画像を拡大することです。実際の画像生成では、大量の画像を生成して目視で採用画像を選びます。大量に生成するので生成時間は短い方がよいです。そして小さい画像で生成したあと別のツールで拡大するのがよいです。

 画像拡大は何を使ってもよいのですが、私は以下のものをよく使っています。

nightmareai/real-esrgan – Run with an API on Replicate
https://replicate.com/nightmareai/real-esrgan

Restore faces

 顔の質を上げるチェックボックスです。写真のような画像を生成する場合に向いています。イラスト風やアニメ風の画像を作る場合は、逆に画像が崩れます。ゲーム用の画像を作る場合は、チェックしない方がよいでしょう。

Tiling

 背景の模様などに使う「繰り返し画像」を生成するためのチェックボックスです。壁紙的な画像を作る場合にはチェックを入れます。

Hires. fix

 ハイレゾ化です。画像を生成したあと、その画像をimg2imgで高解像度にします(拡大します)。「Upscaler」(アルゴリズム)が選べるようになっており、書き込みが増えるなど出力画像が変化します。

 私は、大量に画像を生成したあと拡大していたので、この機能は使いませんでした。ノベルゲームのイベント絵など、キャラクター入りの大きな1枚絵を生成したい場合には、この設定が活用できると思います。

Batch count

 一度の実行で生成する枚数です。

 注意しなければならない点は、同じ「Prompt」でも、「Seed」(乱数の初期値)によって、生成される画像がまるで違う点です。そのため、入力した呪文が自分が考えていたような結果を出すかどうかは、1枚生成しただけでは判断できません。複数枚出力して想定した画像に近い物が出力された時点で、初めて呪文が有効だと分かります。

 私は、以下のような手順で「Batch count」の数を変化させて使っています。

  1. 呪文を「Prompt」に入力する。

  2. 「Batch count」を「4」にして実行する。想定したものから遠い場合は1に戻る。

  3. 改良した呪文を「Prompt」に入力する。

  4. 「Batch count」を「4」にして実行する。想定したものから遠い場合は1に戻る。まだ改善の余地があると判断した場合は3に戻る。

  5. 想定した画像が出力できると判断した場合は、「Batch count」を「16」~「64」に設定して実行する。

  6. 出力された画像の中で、採用できるものがあれば採用する。細部の修正が必要だと判断した場合は、出力画像を元画像にして「img2img」で改良画像を生成する。

 2、4の時点で「Batch count」を「4」にしているのには理由があります。25%の確率で想定した画像に近いものが出る場合は、生成数を増やせば当たりの画像を得られる可能性が高いです。また、4枚程度なら短い時間で生成できて、呪文の改良を短いサイクルでできるからです。

Batch size

 同時に生成する画像の枚数です。この値を増やすと、一度に生成する画像が増えますが、その分VRAMの使用量が増えます。よほど潤沢なVRAM環境でない限り、この数を増やすのではなく「Batch count」の数を増やした方がよいです。

CFG Scale

 「CFG」は「Classifier-free Guidance」の略です。元々「Classifier Guidance」という手法があり、こちらは別途用意した分類器を用いてテキストから画像を生成します。この「Classifier Guidance」に対して「別途用意しない」という意味で「Classifier-free Guidance」という言葉があります。

 「CFG」では、拡散モデルと分類器を同時に学習します。この分類器の影響を強くするほど、入力した文字列に沿った画像が生成されます。

 このように「CFG Scale」の値が大きいほど入力文字列や入力画像に沿った画像が生成されます。その代わり生成画像の多様性はなくなり、似通った画像ばかりになります。

 逆に「CFG Scale」の値が小さいと、多様な画像が生成されますが、入力文字列や入力画像からは想定しづらい画像が混ざります。

 いずれにしても極端に大きかったり小さかったりすると出力画像は破綻します。

 デフォルトの値は「7」です。ゲーム用の素材を生成する場合は、呪文から想起される典型的な画像を得たいことが多いです。そのため「7」より大きな「10」や「12」で生成することもあります。求める画像が得られないと感じた時は、この数値を大きくしてみると良好な結果が得られることがあります。

Seed

 『Stable Diffusion』では、ランダムな数値をもとに多様な画像を生成します。この乱数のシード値(計算で求めるランダムな値の「種」になる元の値)をここで設定します。

 デフォルトのように「-1」が設定されている場合は、ランダムに値を作り、その値をシード値として『Stable Diffusion』に渡します。

 また「Batch count」で複数画像を生成する場合は、2枚目からは「1ずつ値を大きくしたシード値」で画像を生成します。

 基本的には、同じ呪文と設定、シード値なら、同じ画像が出力されます。

Script

 いろいろな呪文の組み合わせや、設定のバリエーションを試したい時に、表形式でまとめて生成してくれる機能です。その分、時間が掛かるので、おまけ機能と思った方がよいです。

 「Prompt matrix」では「|」で区切った複数の呪文の組み合わせを表にしてくれます。「X/Y plot」では、「Prompt」「Sampler」「Steps」など設定の組み合わせを表にしてくれます。

 強力なグラフィックボードを搭載しているなら試してみるとよいでしょう。

出力画像

 生成した画像は、以下のフォルダに入っています。

<インストール先>/outputs/

 この下にさらにフォルダがあり、出力内容によって分類されています。

txt2imgで複数出力した時のまとめ画像
<インストール先>/outputs/txt2img-grids/

txt2imgの個々の画像
<インストール先>/outputs/txt2img-images/

 「txt2img-grids」に出力される画像は以下のようなものです。一度に複数枚出力した際に、まとめ画像が生成されます。

 「txt2img」の個々の画像の出力先を知っていると、以前に生成していた画像がやっぱり欲しいとなった時に、簡単に取り出せます。

 また「img2img」の場合は、以下のフォルダに出力されます。

img2imgで複数出力した時のまとめ画像
<インストール先>/outputs/img2img-grids/

img2imgの個々の画像
<インストール先>/outputs/img2img-images/

 次に『Web UI』からの画像の保存方法を書きます。

 画像を選択した状態で「Save」ボタンを押すと、その下にリストが開きます。リスト内の「Download」リンクをクリックすると画像を保存できます。

 また、こうした面倒なことをしなくても、表示されている画像をExplorerにドラッグ&ドロップするだけでも保存可能です。私はこちらの方法を使っています。

 生成した画像をテキストエディタで開いてみてください。入力した呪文や設定が埋め込まれています。この情報は『Web UI』の「PNG Info」タグを開いて「Source」エリアにドロップすると表示できます。また、この設定を「txt2img」や「img2img」に送ることも可能です。


img2img

 「img2img」のタブでは、画像と呪文をもとに新しい画像を生成できます。「img2img」は、以下のような用途で利用します。

  • 写真や画像を元に、違う絵を描かせる。

  • 3Dモデルなどでキャラクターのポーズなどを作っておき、そのモデルを元に絵を描かせる。

  • 「txt2img」で生成した画像を修正する。

 このタブの中には、さらにいくつかのタブがあります。

 「img2img」タブでは、画像を読み込んで新しい画像を生成します。

 「Inpaint」タブでは、画像を読み込んだあと、変更しない場所をマスクとして書き込み、それ以外の場所を書き換えて生成できます。「Mask blur」の値を設定することで、書き込んだマスクを「どれだけぼかすか」を指定できます。

 設定の多くは、基本的に「txt2img」と同様です。以下、「img2img」で特徴的な設定について補足します。

Denoising strength

 ノイズ除去の強さです。0にすると、元の画像と同じものが生成されます。1に近づけるほど、新しい画像になります。


Settings

 「Settings」タブでは、動作の設定をおこなえます。全てを説明するのは煩雑なので、押さえておきたいところだけ紹介します。

 設定を変更した場合は、ページ上部の「Apply settings」を押すと設定が保存されます。

Saving images/grids

 「File format for images」「File format for grids」で「<インストール先>/outputs」に保存される画像の形式を指定できます。

 デフォルトでは「png」ですが、大量の画像を生成するなら「jpg」に変更しておいた方がよいです。すぐに数GBになってしまいますので。

 また、手動で消すのが面倒な場合は、「Always save all generated images」「Always save all generated image grids」のチェックを外しておくのも手です。


呪文や設定の試行錯誤

 実際に素材を作る時は、呪文や設定の値を細かく変えながら、求める画像が出るまで出力を繰り返します。

 以下、『Little Land War SRPG』での実例を示します。

 「土の精霊使い」の画像を作った時のバリエーションを掲載します。

 まずは、最終的に選んだ画像です。

 次に、試行錯誤の過程で作られたバリエーションの一部を示します。実際には、1つのキャラクターで数十枚から数百枚画像を出力して、呪文とパラメーターを調整しています。

 もう1人、副主人公の「ミミ」の画像を作った時のバリエーションも掲載します。

 まずは、最終的に選んだ画像です。

 次に、試行錯誤の過程で作られたバリエーションの一部を示します。クオリティーがよいものを生成するのも大切ですが、ゲームのキャラクターの性格に合った画像を選別することが重要です。

 キャラクターだけでなく、アイテム生成のバリエーションも示します。

 以下は盾の画像を生成した時のものです。様々なパターンを出力してゲームの雰囲気に合うものを選別します。大量のリテイクを出しながら画像を選べるのは、AIによる画像生成の利点です。


(続く)

全体目次

  • 第1章 環境構築

  • ★★★第2章 基礎知識★★★【今ここ】

  • 第3章 呪文理論

  • 第4章 背景画像の生成

  • 第5章 キャラクター画像の生成

  • 第6章 キャラにポーズを付ける

  • 第7章 キャラを学習させる

  • 第8章 武器や道具の生成

  • 第9章 絵地図の生成

  • 第10章 UI部品のテクスチャの生成


※ 草稿をまとめて大幅増補したものを電子書籍で出しました。『Kindle Unlimited』ユーザーの方は無料で読めます。是非読んでください。


この記事が気に入ったらサポートをしてみませんか?