2022年8月に公開された、高性能画像生成モデルである「Stable Diffusion」を実装する方法を紹介するシリーズです。

第3回目はrinna社より公開された「日本語版のStable Diffusion」で、日本語から画像を生成する方法をご紹介します。

任意のキーワードから様々な画像を生成して遊んでみましょう。

Google colabを使用して簡単に実装することができますので、ぜひ最後までご覧ください。

今回の目標

・日本語版のStable Diffusion 「Japanese Stable Diffusion」とは

・Japanese Stable Diffusionの実装(txt2img)

Stable Diffusionとは

Stable Diffusionは拡散モデルによる画像生成モデルで、スタートアップ企業であるStability AIが2022年8月に「Stable Diffusion」と、それを使用したサービス「DreamStudio」のβ版をリリースしました。

Stable Diffusionは、SNSなどで話題になっている「Midjourney」と同様で、テキストから画像を生成することができます。

無料で公開されており、商用利用も可能なライセンスの下でリリースされているため、様々なシーンでの活用が期待されます。

Latent Diffusionをベースとしており、非常に大規模なデータセットであるLAION-5Bを用いてトレーニングされています。

参考URL:https://huggingface.co/blog/stable_diffusion

日本語版のStable Diffusion 「Japanese Stable Diffusion」とは

「Japanese Stable Diffusion」は、2022年9月にrinna株式会社が公開した日本語に特化させた画像生成モデルです。

前述の「Stable Diffusion」と同様に与えられたテキストから画像を生成することができます。

特徴

「Stable Diffusion」は英語のキャプション付き画像でAIを学習させているため、日本語による表現が難しい場合があります。

一方で、「Japanese Stable Diffusion」は、1億枚の日本語キャプション付き画像を用いて学習を行い、「Stable Diffusion」のテキスト解釈を担う「CLIP」と、画像生成モデル「Latent Diffusion Model」のパラメーターを更新する追加学習を行うことで、日本語の指示による画像生成に最適化していることが特徴です。

特に、和風イメージの生成や日本語の固有名詞を理解を得意としています。

モデルはHugging FaceやGitHubからダウンロードすることができます。

詳細は以下のリンクよりリンクよりご確認下さい。

Stable Diffusionの導入

Hugging Faceの登録とNewTokenの発行

Hugging Faceのアカウント作成

初めにHuggingFaceのアカウントを作成します。

※Hugging Faceとは米国のHugging Face社が提供している、自然言語処理に特化したディープラーニングのフレームワークです。
ソースコードは全てGitHub上で公開されており、誰でも無料で使うことができます。

HuggingFaceにアクセスし、画面右上のSignUpよりアカウントを作成することができます。

登録したメールアドレスに認証メールが届くので、メールに記載されたリンクにアクセスすれば、アカウント登録は完了です。

STEP
1

Access Repositoryの承諾

こちらのCompVis/stable-diffusion-v1-4にアクセスし記載の内容を確認の上、「Access Repository」をクリックすることで権限を得ることができます。

この時点で、モデルの作者にメールアドレスとユーザー名が共有されることになりますので注意してください。

モデルの使用にあたっては、意図的に違法または有害な出力やコンテンツを作成・共有することが禁止されています。

CreativeML OpenRAIL Licenseに準拠した上で、再配布や商用利用のルールなどについての記載に同意する必要があります。

STEP
2

Access Tokensの発行

画面右上のアカウントのアイコンから[Settings]->[Access Tokens]に移動しNewTokenを発行します。

後ほど使用しますので、メモしておきましょう。

STEP
3

Google colabの準備

ここからは、Google colab環境で進めていきます。

まずはGPUを使用できるように設定をします。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

まずはgoogleドライブをマウントします。

次に今回作成した画像を保存するフォルダを作成します。

フォルダ名は変えても問題ありありません。

from google.colab import drive 
drive.mount('/content/drive')

#保存フォルダを作成する
 !mkdir -p '/content/drive/My Drive/Stable Diffusion_main/'
%cd '/content/drive/My Drive/Stable Diffusion_main/'

以上で準備が完了しました。

Japanese Stable Diffusionの実装(txt2img)

準備

ここからはJapanese Stable Diffusionによる「txt2img」を実装していきます。

まずは必要なライブリをインストールします。

!pip install diffusers==0.2.4 transformers scipy ftfy
!pip install git+https://github.com/rinnakk/japanese-stable-diffusion

次にモデルをダウンロードしましょう。

ここで先程取得した、Access Tokensが必要となります。

import torch
from torch import autocast
from diffusers import LMSDiscreteScheduler
from japanese_stable_diffusion import JapaneseStableDiffusionPipeline
import matplotlib.pyplot as plt

# ここに先程取得したAccess Tokensを貼り付ける
access_tokens="ここにAccess Tokensを貼り付け" 
 
# モデルを読み込む
model_id = "rinna/japanese-stable-diffusion"
device = "cuda"
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
pipe = JapaneseStableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, use_auth_token=access_tokens)
pipe = pipe.to(device)

画像生成

生成したい画像のキーワードを日本語で指定すれば、画像生成することができます。

prompt = "猫の肖像画 油絵"

with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5)["sample"][0]  
    
image.save("output.png")

実行すると以下のような画像が保存されます。

Japanese Stable Diffusionで画像を生成することができました。

実装まとめ

これまでの実装内容を以下にまとめます。

なお、「prompt」のテキスト保存機能と、画像表示機能を追加しています。

import torch
from torch import autocast
from diffusers import LMSDiscreteScheduler
from japanese_stable_diffusion import JapaneseStableDiffusionPipeline
import matplotlib.pyplot as plt

# ここに先程取得したAccess Tokensを貼り付ける
access_tokens="ここにAccess Tokensを貼り付け" 

# モデルを読み込む
model_id = "rinna/japanese-stable-diffusion"
device = "cuda"
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
pipe = JapaneseStableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, use_auth_token=access_tokens)
pipe = pipe.to(device)

# 生成したいキーワード
prompt = "空飛ぶサラリーマン 写真"

# 保存フォルダを作成
!mkdir outputs

# キーワードをテキストファイルとして保存
txt_path = 'outputs/prompt.txt'
with open(txt_path,mode='w') as f:
  f.write(prompt)

# 画像を生成する枚数
num = 5
 
for i in range(num):
  # モデルにpromptを入力し画像生成
  with autocast("cuda"):
    image = pipe(prompt, guidance_scale=7.5, width=768, height=512)["sample"][0] 
  # 画像を保存
  image.save(f"outputs/test_{i:04}.png")

  # 画像を表示
  plt.imshow(image)
  plt.axis('off')
  plt.show()

生成した画像の紹介

いくつかの例を紹介します。

空飛ぶサラリーマン 写真

寿司 ランチ

神社で踊る女子高生のイラスト

まとめ

最後までご覧いただきありがとうございました。

今回はrinna社より公開された「日本語版のStable Diffusion」で、日本語から画像を生成する方法をご紹介しました。

「txt2img」により、任意のキーワードから様々な画像を生成することができました。

なお、作成した画像をより高解像度にする方法も別の記事で紹介しています。ぜひご覧ください。