😸

生成AIをGoogle Colaboratoryで簡単に 【Part6.5 画像生成AI SDXL+ANIMAGINE XL 3.1編】

2024/07/31に公開

はじめに

今回は、初心者向けにGoogle Colaboratoryで、簡単に生成AIを使えるようにする環境を作ります。

Part6.5の今回は、Part6の内容の続きとして、画像生成AIを使えるようにします。
今回利用する画像生成AIはStable Diffusion XLになります。

その中で、Part6の際に利用していたモデルではなく、より高品質なアニメ風画像を生成可能なモデルを利用してみたく、今回実験してみます。
(今回利用するモデルから出力された画像は商用利用等に利用可能ですが、著作権問題に関しては、問題のある画像が生成される可能性があります。生成された画像を利用する場合は十分注意してください)

したがって、今回の記事はpart6の内容を読んでいることを前提に記載しますので、ぜひpart6の記事をご覧いただけますと幸いです。
今回の記事の内容はpart6のコードを利用してモデルを変更するだけです。

Part6の記事はこちらをご覧ください
https://zenn.dev/asap/articles/e4791be54f90ce

Stable Diffusion XL(SDXL)とは

Part6の記事をご覧ください。

ANIMAGINE XL 3.1とは

ANIMAGINEとはアニメイラストの出力に長けているSDXLモデルの一つであり、ANIMAGINE XL 3.1は2024年3月18日に公開された最新かつ強化モデルになります。

下記にてモデルは提供されています。
https://huggingface.co/cagliostrolab/animagine-xl-3.1

解説

利用するコードはpart6の記事をご覧ください。
基本的にpart6のコードが実行できる環境があることを前提であると考えます。

Part6との変更点

基本的に、StableDiffusionXL_sample.ipynbの設定を変更するだけです。
4セル目を下記のように変更してください。
(基本的に本家のチュートリアルの数値を引用しています)

#モデルの設定を行う。


config_text = """
[SDXL]
device = auto
n_steps=28
high_noise_frac=1.0
seed=42

vae_model_path = None
base_model_path = cagliostrolab/animagine-xl-3.1 
refiner_model_path = None

use_karras_sigmas = True
scheduler_algorithm_type = dpmsolver++
solver_order = 2

cfg_scale = 7.0
width = 832
height = 1216
output_type = pil
aesthetic_score = 6
negative_aesthetic_score = 2.5

"""

with open("configs/config.ini", "w", encoding="utf-8") as f:
  f.write(config_text)

上記の通り、Part6と比較すると結構変更があります。
まずは大きく変わるのは、指定するモデルがBaseモデル一つだけで、Refinerモデルは利用しないということです。part6の実装コードはRefinerやVAEを指定しない場合でも、問題なく動作するように実装しているため、設定ファイルでNoneと指定するだけで問題なく利用できます。

その他ステップ数や、画像の解像度などは、モデル開発者の設定を引用し、スケジューラの設定などは高性能なスケジューラをそのまま利用しています。

しかしながら、このまま実行すると下記のようなエラーが起きます。

ValueError: The deprecation tuple ('no variant default', '0.24.0', "You are trying to load the model files of the variant=fp16, but no such modeling files are available.The default model files: {'unet/diffusion_pytorch_model.safetensors', 'vae/diffusion_pytorch_model.safetensors', 'text_encoder_2/model.safetensors', 'text_encoder/model.safetensors'} will be loaded instead. Make sure to not load from variant=fp16if such variant modeling files are not available. Doing so will lead to an error in v0.24.0 as defaulting to non-variantmodeling files is deprecated.") should be removed since diffusers' version 0.29.2 is >= 0.24.0

これは、module/module_sd.pyの中で、モデルを読み込むときに下記のように指定しており、

base = DiffusionPipeline.from_pretrained(
        self.base_model_path, 
        torch_dtype=torch.float16,
        variant="fp16",
        use_safetensors=True
    )

この中で、variant="fp16"が原因でエラーが起きているようです。

ここで、Diffuserがfp16のモデルをロードする際に何の条件が必要かを整理しますと、safetensorsの重みの名前にfp16と記載されている必要があるようです。例えば下記のようにです。

animagine-xl-3.1.fp16.safetensors

しかしながら、本家が提供しているモデルの名前は下記の通りになっております。

animagine-xl-3.1.safetensors

したがってfp16と書かれていないことが原因です。
例え、内部的にfp16に対応していたとしても、名前にfp16と入っていなければ、読み込むことができないという謎仕様です。

ちなみに、「community」にて同様の問題がディスカッションされています。
https://huggingface.co/cagliostrolab/animagine-xl-3.1/discussions/11

こちらをみる限りでも、モデルはfp16を利用しているが、名前にfp16が入っていないため、variant="fp16"で読み込めません。

一方で、

base = DiffusionPipeline.from_pretrained(
        self.base_model_path, 
        torch_dtype=torch.float16,
        #variant="fp16",
        use_safetensors=True
    )

上記のようにvariant="fp16"をコメントアウトして消せば問題なく動作するようですが、Diffuserがfloat16ではなくfloat32で読み込んでしまい、その後推論の際にfloat16に変換して利用されるようです。

したがって、推論には問題ないのですが、モデルの読み込み時に、float16で直接読み込むよりもモデルの読み込み速度が遅くなってしまう問題があるようです。

そこで色々調査すると、下記の箇所にてvariant="fp16"で読み込めるようにモデルを変換(名前を変えただけ?)してくれている人がいましたため、こちらのモデルを利用することにします。

https://huggingface.co/Asahina2K/Animagine-xl-3.1-diffuser-variant-fp16

したがって、4セル目は下記の通り変更してください。

#モデルの設定を行う。


config_text = """
[SDXL]
device = auto
n_steps=28
high_noise_frac=1.0
seed=42

vae_model_path = None
base_model_path = Asahina2K/Animagine-xl-3.1-diffuser-variant-fp16
refiner_model_path = None

use_karras_sigmas = True
scheduler_algorithm_type = dpmsolver++
solver_order = 2

cfg_scale = 7.0
width = 832
height = 1216
output_type = pil
aesthetic_score = 6
negative_aesthetic_score = 2.5

"""

with open("configs/config.ini", "w", encoding="utf-8") as f:
  f.write(config_text)

また、5セル目のプロンプトを下記のように設定します。
こちらも公式の記事を引用します。

#読み上げるプロンプトを設定する。

main_prompt = """
1girl, souryuu asuka langley, neon genesis evangelion, solo, upper body, v, smile, looking at viewer, outdoors, night
"""

negative_prompt="""
nsfw, lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]
"""


実行結果

実行した結果、下記のような画像が得られました。
非常に高品質なアニメ画像が得られました。





追実験

その他、前回のpart6で使っていたプロンプトを利用して実験してみました。プロンプト以外の設定は同様です。
5セル目のプロンプトを下記のように設定して実行しました。

#読み上げるプロンプトを設定する。

main_prompt = """
1 girl ,Yellowish-white hair ,short hair ,red small ribbon,red eyes,red hat ,school uniform ,solo ,smile ,upper body ,Anime ,Japanese,best quality,high quality,ultra highres,ultra quality
"""

negative_prompt="""
nsfw, lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]
"""

ネガティブプロンプトは同じですが、メインプロンプトはPart6の記事で利用していたプロンプトを指定しました。
生成された画像は下記になります。





め、めちゃくちゃかわいい・・・
私が知らないだけで、何かのアニメのキャラクターなのでしょうか・・・

そのほか、本モデルを利用するにあたって、プロンプトを構築する場合は下記のページを参考にするのが良さそうだと思いました。
https://wikiwiki.jp/sd_toshiaki/Animagine XL
https://romptn.com/article/42309

まとめ

今回はPart6の延長として、現在非常に人気のあるアニメ画像生成モデルを試してみました。
(ついでにpart6のコードを利用して他のモデルが利用できることも実証しました。ただしfp16で読み込めるモデルである必要がありますが)

SD3 Mediumとかも触っていますが、このモデルの画質の高さは、SD3 Mediumよりもレベルが高いような気がしました。(私がSD3の性能を引き出せていないだけ説は全然ありますが)

記事を読んでくださりありがとうございました!!

Discussion