Frqux’s AI laboratory

AIの技術が進化する今日

Stable Diffusionで、かわいい女の子を生成しよう

 こんにちは。ふらうです。

 今回は、Stable Diffusionモデルを利用して画像生成をしたいと思います。
 きっかけは、アイコンを変えたいと思っていた時でした。
 「著作権とか難しいな...そや!AIに書かせよう」という発想に至ったので、初の自然言語処理以外のAIに触れてみようと思いました。

Stable Diffusionとは

 Stable Diffusionとは、任意のテキストや画像などからリアルな画像を生成できるAIです。
 これらは、潜在拡散モデルというアルゴリズムを使用しており、自由度が高く美しい画像を多数生成することができます。

 このStable Diffusionがオープンソース化、つまり無料で全体に公開されたのはつい最近の2022年8月22日です。Stable Diffusionの生みの親であるStability AI(企業)は、デモサイトも公開しています。

 Stable Diffusionのモデルは多数公開されており、様々な方々が画像生成モデルを作っております。
 リアルな画像を生成するモデル。2次元の画像生成が得意なモデル。ちょっとムフフな画像を生成するのが得意なモデルなどなど多くのモデルが開発され、公開されています。

 それではさっそく生成していきましょう。


画像を生成する

 今回は、プログラムを書いて画像生成をしていきます。調べた限り、プログラミングなしで簡単に画像を生成する方法もあったのですが、今回はプログラムを書いていきます。

ライブラリ

from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import torch
from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

 これらのライブラリの用途は以下の通りです。
・StableDiffusionPipeline ... 学習済みStableDiffusionモデルをダウンロードするためのライブラリ

・DPMSolverMultistepScheduler ... StableDiffusionでの画像生成を高速化するためのライブラリ

・torch ... PyTorchフレームワーク

・xformers ... transformer・Pytorchを高速化するライブラリ。エラーが出るので使いませんが一応入れておきました。


モデルのダウンロード

model = "andite/anything-v4.0"

pipe = StableDiffusionPipeline.from_pretrained(model, torch_dtype=torch.float16)

pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

pipe = pipe.to("cuda")

 今回使うモデルは、「anything v4.0」です。
 anything v4.0は、2次元のキャラクターを生成するのが得意なモデルです。ほかにも、anything v3.0がありますが作者が異なるらしく、生成される絵もかなり違ったテイストのものになっています。

 個人的に「anything v4.0」の絵柄がかわいくて好きだったのでこちらにします。

 モデルは、hagging faceにアップロードされているモデルをパイプラインを用いてダウンロード・使用します。
 また、GPUを使って画像生成を行います。


画像生成

prompt = "girl"

image = pipe(
    prompt
).images[0]

image.save("girl.png")

 このpromptに生成したい画像の基となるテキストを入れると、そのテキストに沿った画像が生成されます。私は「girl」とだけ入れていますが、「cute girl」(キュートな女の子),「A girl who lives in a cyber world」(電脳世界に住む女の子)などいろんな文章で試せます。

 これで、変数imageに画像データが入りますので、最後にpngファイルとして出力しています。
 これで生成された画像を5点ほど紹介します。

生成された画像

 なかなか可愛いイラストを生成してくれましたね!

 これで画像生成は終了です。


(おまけ)画像の高画質化

 今回は、画像生成AIだけをしてみる予定でしたが、高画質化AIも紹介して使ってしまいます。
 今回使うのは、「SwinIR」です。
 このモデルは、超解像を得意とするモデルです。
 超解像とは、粗い画像や低画質の画像の画質を大幅に向上させることです。
 古いビデオカメラで撮った240pほどの粗い画像や、ノイズが入ってしまった画像などに使用することで鮮明化が期待できます。

 このモデルの高画質化の比較ができるよう、モデルにテストセットが用意されているので試してみたいと思います。その結果の一部がこちらです。

 左がSwinIRを実行する前。右が実行後です。かなり鮮明になっているのが分かると思います。私の方で画質をあえて悪くするということはしておりません。

 これを画像にかける方法を説明したいと思います。

 まず、SwinIRをダウンロードします。

git clone https://github.com/JingyunLiang/SwinIR

その後、SwinIRのモデルをダウンロードします。
以下のリンクより好きなモデルを選んでダウンロードしてください。
github.com

 私は、「003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth」というモデルをダウンロードしました。
 このダウンロードしたpthファイルを、先ほどcloneしたSwinIRのフォルダ直下に移動させます。

 次にSwinIRのフォルダに「images」というフォルダを新しく作り、そこに高画質化したい画像を入れます。

 そして最後、以下のコマンドで高画質化します。

python main_test_swinir.py --task real_sr --model_path 003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth --folder_lq images --scale 4 --large_model

 超解像された画像は、SwinIRフォルダの、「SwinIR\results\swinir_real_sr_x4_large」のフォルダ内に保存されます。

 SwinIRはかなり重いので、スペックによっては時間がかかります。


終わりに

 いかがでしたでしょうか。
 今回は、Stable Diffusionモデルを使って画像の生成を行いました。

 pipelineを用いてモデルをダウンロードして使う以外にも、ckptファイルからモデルを使うことができるようなのでそのやり方も調べてみたいですね。
 pipelineを用いる方法だと、「.jsonがないから無理」だとかが出て使えないモデルが多くあるからです。

 この画像生成AIと自然言語処理AIが合わされば、対話AIから出力されるテキストに沿ったイメージを画像生成AIが生成して...なんてこともできるかもしれませんね。

 ではこれで。

 最後まで見ていただきありがとうございます。


参考にさせていただいたサイト

・【2023年版】Stable Diffusion モデルまとめ - BLOG CAKE
https://blogcake.net/stable-diffusion-models/

・【Diffusers】Stable Diffusion v2.1モデルの利用方法
https://self-development.info/%E3%80%90diffusers%E3%80%91stable-diffusion-v2-1%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95/

・anything-v4.5.ckpt · andite/anything-v4.0 at main - Hugging Face
https://huggingface.co/andite/anything-v4.0/blob/main/anything-v4.5.ckpt


Pythonで画像を高画質化 (超解像 SwinIR)
https://miyashinblog.com/swinir/