Mac でも NovelAI っぽい絵を出力したい

2022年12月30日

Mac でも NovelAI みたいな絵を出力したい

画像生成 AI、stable diffusion はめちゃ楽しいんだけど、Mac だと出力が遅いのが困りもんだった。あとインストールもけっこう面倒くさい。
 が、この界隈の進化のスピードには目覚ましいものがある。
 いまや、M1、M2 Mac の GPU を利用できる、stable diffusion のフロントエンドがあるのだ。
 InvokeAI がそれである。InvokeAI は Mac だけでなく、Windows や Linux でも使える。

InvokeAI のインストール

InvokeAI のインストールは、以前と比べたら格段に簡単になったとはいえ、コマンドラインでの操作に慣れていないとキツいのは変わらない。それでも、シェルスクリプトで一発である。
 準備として、

  1. Hagging Face のトークンの取得
  2. python、pip の準備
  3. SSD 容量の空き

あたりが必要となる。

Hagging Face のトークン

画像生成AI「Stable Diffusion」を低スペックPCでも無料かつ待ち時間なしで使う方法まとめ – GIGAZINE

上述の GIGAZINE さまの記事の前半に詳しいやり方が書いてあるので、事前にトークンを発行しておく。

python、pip の準備

InvokeAI のインストーラを適切に動かすには、python 3.9 以上と、python 3.9 以上に由来する pip3 が必要だ。

> python --version

ターミナルで上記のコマンドを実行し、 Python 3.9.15 などと出てくれば OK。
 3.8 とか、2.x とかの場合は、 which python3.9 などとやってみて、なかったら homebrew 等でインストールしなくてはならない。
 仮に python@3.9 をインストールしたとする。 python コマンドだけで python3.9 を呼び出すには、zshrc にエイリアスを設定する。
 筆者の場合、python3.9 と pip3.9 のインストール場所は、

> which python3.9
/opt/homebrew/bin/python3.9
> which pip3.9
/opt/homebrew/bin/pip3.9

となっている。

> open -a CotEditor ~/.zshrc

などと .zshrc を開き、

alias python=/opt/homebrew/bin/python3.9
alias pip=/opt/homebrew/bin/pip3.9

と書きこんで書類を保存する。 source ~/.zshrc で設定を反映できる。

> python --version
Python 3.9.15
> pip --version
pip 22.3.1 from /opt/homebrew/lib/python3.9/site-packages/pip (python 3.9)

SSD 容量の空き

InvokeAI のインストールの際、大量のデータがダウンロードされる。
 フルでダウンロードすると、たぶん、20 GB くらいいく。高速回線と容量の余裕が必須だ。
 データは、invokeai フォルダ以下にダウンロードされるようだ。

インストール

以上が準備できたら、いよいよインストールとなる。

Releases · invoke-ai/InvokeAI

上記ページから、InvokeAI-Installer-xxx-mac.zip をダウンロードして、zip を展開すると install.sh があるので、それを実行する。

> cd ~/Downloads/InvokeAI-Installer
> ./install.sh

途中、インストールする場所を尋ねられる。「/Users/USERNAME/」とか返せば、ホームフォルダにフォルダが作成され、すべてのデータがそこにダウンロードされる。
 あと、NSFW(18 禁フィルタ)をデフォルトにするか、みたいなことも聞かれるので、質問に答えながら進めていく。
 Hagging Face のトークンは、このインストールの途中で勝手に入力される。

実行してみる

InvokeAI の実行は、作成された invokeai フォルダ内の invoke.sh で行う。

> cd ~/invokeai
> ./invoke.sh
Do you want to generate images using the
1. command-line
2. browser-based UI
3. open the developer console
Please enter 1, 2, or 3:

コマンドラインでの操作か、web UI での操作か選べるわけだ。3 番目のコンソールっていうのは正直よくわからない。2 の web-UI を選択してエンターキーを押すと、モデルデータがロードされる。

>> Started Invoke AI Web Server!
>> Default host address now 127.0.0.1 (localhost). Use --host 0.0.0.0 to bind any address.
>> Point your browser at http://127.0.0.1:9090

と表示されたら、 http://127.0.0.1:9090 へブラウザでアクセスする。

InvokeAI web-UI の様子

web-UI はこんな感じ。
 プロンプトで作成画像の内容を指示して、「Invoke」を押す。筆者の環境(M2 MacBook Air、16 GB)だと 1 分半くらいで画像が生成された。
 Text to Image だけでなく、Image to Image、Out-painting(Unified Canvas)などが使える。特に Unified Canvas が凄い。
 使い方については動画を見ていただくのが早いと思う。英語だけどだいたいわかる。

終了のやり方は、ブラウザのタブを閉じて、ターミナルのほうは ctrl + c でいいんだと思う、たぶん。

stable diffusion は工夫しだいで凄いポテンシャルを発揮するのだが、アニメっぽい絵だけはめっためたに弱い。それを補う waifu-diffusion-1.3、trinart_characters-1.0 などのモデルもあるのだが、ここはひとつ、豪勢に Anything-V3 をインポートしてみたい。

Anything のインポート

Anything-V3 はアニメっぽいイラストに強い学習済みモデルである。一説によると、NovelAI のモデルが流用されているとかで、けっこうグレーに近い、という話がある。
 そういうものだと思って、注意しつつ使っていくのが良いだろう。

データは Hagging Face でダウンロードできる。

Linaqruf/anything-v3.0 at main

ここから「Anything-V3.0.ckpt」(7.7 GB)と、「Anything-V3.0.vae.pt」(823 MB)というふたつのファイルをダウンロードする。たぶん、HaggingFace のアカウントが必要になってくると思う。

Anything V3.0 のダウンロード

丸をつけた下矢印がダウンロードのリンクだ。

ダウンロードしたファイルを、~/invokeai/models/ldm/stable-diffusion-v1 へと移動する。別の場所でも大丈夫だと思うけど、一応ここに。

そしたら、sh invoke.sh で invokeAI を起動、1 のコマンドラインでの操作を選択する。
 invoke> というプロンプトが出てきたら、以下を実行。

!import_model models/ldm/stable-diffusion-v1/Anything-V3.0.ckpt

すると対話式でインポートできるようになる。
 short name は通称みたいなもんだろう、「Anything」とした。
 description は概要みたいな感じだと思う。適当に書いた。
 Configuration file はデフォルトのまま。これを別の書類にも出来るらしい。
 VAE autoencoder file で、ダウンロードした「Anything-V3.0.vae.pt」ファイルのパスを指定する。
 画像の縦横のサイズはデフォルトのまま。
 このモデルを通常で使用するか、を y とした。

これでエンターキーを押すと、最終確認を表示してきて、インポートするか聞いてくるので、y でいくことにする。

invoke> !import_model models/ldm/stable-diffusion-v1/Anything-V3.0.ckpt
>> Model import in process. Please enter the values needed to configure this model:

Short name for this model: Anything
Description of this model: Anything Model
Configuration file for this model: configs/stable-diffusion/v1-inference.yaml
VAE autoencoder file for this model [None]: models/ldm/stable-diffusion-v1/Anything-V3.0.vae.pt
Default image width: 512
Default image height: 512
Make this the default model? [n] y

>> New configuration:
Anything:
  config: configs/stable-diffusion/v1-inference.yaml
  default: true
  description: Anything Model
  height: 512
  vae: models/ldm/stable-diffusion-v1/Anything-V3.0.vae.pt
  weights: models/ldm/stable-diffusion-v1/Anything-V3.0.ckpt
  width: 512

OK to import [n]? y

しばらくするとモデルがロードされる。
 Keep model loaded? [y]、と聞かれるので、これも y。
 再度 invoke> のプロンプトが出てくるので、girl とだけテキストを入力してテストした。
 1 分 30 秒くらいで画像が生成される。

girl
girl

ガール、とぶっきらぼうに注文しただけで、このクオリティ。

コマンドラインによる操作

ここからは勉強のつもりで、コマンドラインで操作してみる。

といっても invoke> に呪文を入力してリターンキーを押すだけだ。[h] + [return] でヘルプ、[q] + [return] で終了となる。

プロンプト

プロンプトは、NovelAI で使われるテクニックが役に立つ。筆者は下記のブログさまを参考にさせていただいた。

【NovelAI】 エロもいける!最強プロンプト(呪文)辞典 | ゲス顔イオナズン

作成したい絵をイメージして、上から順番に単語を書きこみ、カンマで区切っていく。

{{{masterpiece}}}, 1 girl, character focus, full body, from above, pigeon toed, face focus, blue eyes, heart shaped pupils, looking up at viewer, makeup, medium breasts, cleavage, curvy, blush, incoming kiss, closed eyes, in heat, wearing cropped shirt, wearing denim shorts, torn clothes,

なんか、こんな感じ。あまり長すぎるとエラーで終了してしまう。
  {{{masterpiece}}} のように、強調したい単語を {}() で囲むと反映されやすい、とされている。二重三重に囲めばさらに効果が高いらしい。特に masterpiece は必須というひともいる。
 正直このへんの効果、本当にあるのかまだ実感していない。

ネガティブ・プロンプト

逆に避けたい表現を [] で囲むと AI が理解してくれる。

female elf
female elf
female elf, [large breasts]
female elf, [large breasts]

[bad anatomy, bad hands] のように、複数指定してもいけるようだ。
 また、ネガティブ・プロンプトは、プロンプトとは別に単語数を数えているらしく、わりと長めに入力してもエラーにならない。
 ネガティブ・プロンプトの例文はググれはたくさん出てくる。筆者はこんな感じにした。

[multiple angle, blurry, longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair, extra digit]

オプション

InvokeAI のオプションは、下記のページで説明されている。

InvokeAI/CLI.md at main · invoke-ai/InvokeAI · GitHub

代表的なものは、

オプション意味
-o ~/Pictures出力先の指定
-W 1024幅の指定
-H 512高さの指定
-n 3作成する枚数
-s 50steps の指定
-C 7.5cfg_scale の指定
-S 0000000seed の指定
-A k_lmssampler の指定

-s の steps は 25 ぐらいでも画像生成してくれる。出力が早くなる分、描きこみの量が下がる。
 ただ、steps は増やせば絵が良くなる、というわけでもないようだ。
 -S の seed 値は、画像の生成とともに「-S 2161187662」という形でターミナルに出力される。同じプロンプト、同じ seed 値でパラメータも同じにすると、まったく同じ画像が生成される。プロンプトをちょっと変えると、同じキャラクターの別ポーズが出力されやすい、とされている。
 seed 値は、画像の出力先に生成される「invoke_log.md」でも確認できる。invoke_log.md は作成履歴をたどれて便利だ。

README.md · Linaqruf/anything-v3.0 at main を見ると、sampler に ddim を、cfg_scale を 12 にしているので、真似してみる。

{{{masterpiece}}}, 1 girl, character focus, full body, from above, pigeon toed, face focus, blue eyes, heart shaped pupils, looking up at viewer, makeup, medium breasts, cleavage, curvy, blush, incoming kiss, closed eyes, in heat, wearing cropped shirt, wearing denim shorts, torn clothes, [multiple angle, blurry, longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair, extra digit] -H 1024 -A ddim -C 12.0

ここまで書いて、やっと実行。高さを 1024 ピクセルにしたので、出力に 5 分くらいかかる。

えちデニム01

いいじゃない。
 ターミナルに seed 値が表示されるので、同じ seed で別のプロンプトを試してみる。

えちデニム02

いいじゃない。エロいじゃない。
 steps や sampling、scale については NovelAI 5ch wiki が詳しいかと思う。

steps を上げると、同一 seed でも顔とか服装とか変わってくる。

steps 28
steps 70
steps 25
steps 50

パラメータを変更することで、いろいろなバリエーションが出てくる。
 ちなみに、NovelAI のデフォルトは、steps 28、cfs_scale 11 らしい。

他にも

他にも InvokeAI では、Hentai-Diffusion version1.7 や、EimisAnimeDiffusion 1.0v というモデルをインポートできる。

GitHub – Delcos/Hentai-Diffusion: The official place for the best A.I.

eimiss/EimisAnimeDiffusion_1.0v at main

ダウンロードは上記のリンク先で出来る。
 特に Hentai-Diffusion は妙に整った絵を出してくれる。

Hentai-Diffusion 作例 vaeなし

えちぃねぇ。
 インポートの際、vae ファイルを指定しなくても問題ないのだが、configs/models.yaml 書類をエディタで編集して、
vae: models/ldm/stable-diffusion-v1/vae-ft-mse-840000-ema-pruned.ckpt
 という具合に、stable-diffusion 1.5 などが使ってる vae を指定すると、画像がくっきりする。

Hentai-Diffusion 作例 vaeあり

これはこれでいいけど、vae なしの曇った感じも味がある。
 なので、vae を使用した「Hentai」と、vae を使用しない「Hentai-notvae」のふたつを models.yaml に書いておいて、使いわけるのがいいかもしれない。

ちなみにモデルの交換は、!switch でおこなう。

invoke> !switch Hentai

Hentai の部分は、インポートの際に記入した Short name だ。
 なお、Hentai-Diffusion とモデルのインポートのやり方は、下記のブログさまで勉強させていただきました。ありがとうございます。

今日もInvokeAIで遊ぶ – Smile Peace〜かなうなら全ての人に笑顔と安らぎを〜

 プロンプトについては、こういう便利なサイトもある。

MajinAI | ホーム

それにしても面白すぎる

こんなオモロいのなんで。
 ひとは、それほどまでに絵を描きたかったんだろうか。絵を描きたいんだけど、労力は惜しみたかったんだろうか。筆者の場合はそうだったんだろう、たぶん。
 ひとつに、必ずしも思っていた通りの絵が出来るわけじゃない、というところにゲーム性みたいなものがあるんだと思う。ガチャ、的な。望んでいた以上の物が出来て、驚かされるときもあるし。
 いずれにせよ、もっと遊びたおしながら勉強してみたい気がした。