LoginSignup
27
24

Stable Diffusionの最新モデル「SDXL 1.0」と過去モデルの生成画像をひたすら比較して進化を実感してみた

Posted at

Supershipの名畑です。週刊少年ジャンプ34号に掲載された小園江ナツキ先生の読切漫画「殺陣ロール」好きです。

はじめに

7月27日についにStable Diffusionの新モデルSDXL1.0がリリースされました。当初の予定よりは遅れたものの、0.9がリリースされた6月23日から1月程度での高速リリースです。

SDXL 0.9の際に「Stable Diffusionの最新モデルSDXL 0.9と過去モデルで生成画像を比較してみた」という記事でStable Diffusionにおける生成画像の変遷をまとめましたが、今回もSDXL 1.0でどのように変わったのかを記録に残します。

画像の生成はPythonでstability.aiのAPIを呼び出すことで行なっています。

参考:ASCII.jp:最新の画像生成AI「Stable Diffusion XL(SDXL)1.0」ついに公開 簡単に試す方法あります

対象モデル

  • Stable Diffusion XL v1.0
    略称 SDXL 1.0 / 2023年7月27日リリース
  • Stable Diffusion XL v0.9
    略称 SDXL 0.9 / 2023年6月23日リリース
  • Stable Diffusion XL Beta v2.2.2
    略称 SDXL Beta / 2023年4月13日リリース
  • Stable Diffusion v2.1
    略称 SD 2.1 / 2022年12月7日リリース

今回はこの4つを比較していきます。
SDXL 1.0が最新で、そこから遡っていくとSDXL 0.9SDXL BetaSD 2.1の順番です。

コード

画像生成に用いたPythonのコードは下記です。

import base64
import os
import requests
import time

engine_id = "stable-diffusion-xl-1024-v1-0"  # SDXL 1.0
# engine_id = "stable-diffusion-xl-1024-v0-9"  # SDXL 0.9
# engine_id = "stable-diffusion-xl-beta-v2-2-2"  # SDXL Beta
# engine_id = "stable-diffusion-512-v2-1"  # SD 2.1

api_host = os.getenv('API_HOST', 'https://api.stability.ai')
api_key = os.getenv("STABILITY_API_KEY")

# API Keyの取得確認
if api_key is None:
    raise Exception("Missing Stability API key.")

# API呼び出し
response = requests.post(
    f"{api_host}/v1/generation/{engine_id}/text-to-image",
    headers={
        "Content-Type": "application/json",
        "Accept": "application/json",
        "Authorization": f"Bearer {api_key}"
    },
    json={
        "Samples": 3,
        "style_preset": "anime",
        "text_prompts": [
            {
                "text": "Japanese moe heroine"
            }
        ],
    },
)

# レスポンス確認
if response.status_code != 200:
    raise Exception("Non-200 response: " + str(response.text))

# レスポンス取得
data = response.json()

# 画像保存
# ファイル名にはタイムスタンプとengine_id、通番を含めています
# 通番は0〜samplesの値 - 1
for i, image in enumerate(data["artifacts"]):
    with open(f"./{engine_id}_{int(time.time())}_{i}.png", "wb") as f:
        f.write(base64.b64decode(image["base64"]))

前回同様、画風が違うと比較が難しいためstyle_presetも指定するようにしています。
全部で8つのプロンプトを試しましたが、最初の3つがanime、次の1つがfantasy-art、後半4つがphotographicです。

アカウント作成などの基本的なことは過去記事「Stable Diffusionでの画像生成をPythonとWeb APIで実装してみた記録」にあるので、自分で試してみたいという方はをぜひご覧ください。画像の生成だけならClipdropを使った方が手軽ではありますが。

画像解像度

APIのデフォルトでは解像度(width/height)が512x512なのですが、SDXL 1.0はこの解像度に対応していないためか、無指定の場合は1024x1024で生成されました。SDXL 0.91024x1024で生成されますが、手元にある過去の生成物からして、以前は512x512だったのではないかと思います(確信はないですが)。

今回の記事において用いたSD 2.1SDXL Betaの画像は512x512で生成されています。SDXL 0.9SDXL 1.0の画像は1024x1024です。
全部を1024x1024で統一することも考えたのですがデフォルトに従うことを優先しました。

ただしSDXL 0.9SDXL 1.0の画像も手元で512x512にリサイズした上で記事に掲載しています。1024x1024だと1枚あたりが1MBを超えてしまい、容量が大きすぎると考えたためです。

結果

ここからが結果です。

8つのプロンプトで画像を生成しました。

SD 2.1SDXL BetaSDXL 0.9の3モデルにつきましては、各3枚ずつの画像を表にまとめています。SD 2.1SDXL Betaは前回の記事で生成した画像と同様です。SDXL 0.91024x1024で生成し直しています。

その次に、今回リリースされたSDXL 1.0で生成した画像3枚を縦に並べています。

日本の萌えヒロイン

日本の萌えヒロイン(Japanese moe heroine)」をanime指定で生成しました。

"style_preset": "anime",
"text_prompts": [
    {
        "text": "Japanese moe heroine"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_e_1.png sdxl_beta_e_1.png sdxl_09_e_1.png
sd21_e_2.png sdxl_beta_e_2.png sdxl_09_e_2.png
sd21_e_3.png sdxl_beta_e_3.png sdxl_09_e_3.png

モデルが新しくなるほどに、画風が現代の流行りに近づいているという印象を持ちました。

最新モデル SDXL 1.0 生成結果

sdxl_1_a_1.png sdxl_1_a_2.png sdxl_1_a_3.png

第一印象としては、構図を含め、かなり絵としてのクオリティが上がったと感じました。より、現代的な流行りに近づいた。
ただ、腕など、不自然さが目立ちはしますね

日本の人気アニメに登場するスイーツ

次は「日本の人気アニメに登場するスイーツ(Sweets that appear in popular Japanese anime)」です。

"style_preset": "anime",
"text_prompts": [
    {
        "text": "Sweets that appear in popular Japanese anime"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_g_1.png sdxl_beta_g_1.png sdxl_09_g_1.png
sd21_g_2.png sdxl_beta_g_2.png sdxl_09_g_2.png
sd21_g_3.png sdxl_beta_g_3.png sdxl_09_g_3.png

前例の萌えヒロイン同様、モデルが新しくなるほどに現代的な絵になるという印象を受けました。ただ、スイーツの種類が一部日本のアニメっぽくないですかね。

最新モデル SDXL 1.0 生成結果

sdxl_1_b_1.png sdxl_1_b_2.png sdxl_1_b_3.png

スイーツという単語を聞いて私が思い描くものに近づいた、かな。

修学旅行中の男子高校生

続いて「修学旅行中の男子高校生(Male high school student on a school trip)」です。

"style_preset": "anime",
"text_prompts": [
    {
        "text": "Male high school student on a school trip"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_f_1.png sdxl_beta_f_1.png sdxl_09_f_1.png
sd21_f_2.png sdxl_beta_f_2.png sdxl_09_f_2.png
sd21_f_3.png sdxl_beta_f_3.png sdxl_09_f_3.png

新しいモデルになるほどに修学旅行っぽさが増しているように思います。
ただ、そもそもとして修学旅行っぽさってなんだろう。

最新モデル SDXL 1.0 生成結果

sdxl_1_c_1.png sdxl_1_c_2.png sdxl_1_c_3.png

乗り物が登場していることなど、さらに修学旅行っぽさが増しているように思います。
ところどころが不自然ではありますが。

ギターを演奏するお姫様

次は「ギターを演奏するお姫様(A princess playing guitar)」です。
fantasy-artを指定してみました。

"style_preset": "fantasy-art",
"text_prompts": [
    {
        "text": "A princess playing guitar"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_h_1.png sdxl_beta_h_1.png sdxl_09_h_1.png
sd21_h_2.png sdxl_beta_h_2.png sdxl_09_h_2.png
sd21_h_3.png sdxl_beta_h_3.png sdxl_09_h_3.png

好みによるところも多分にあるでしょうが、いわゆるモデルが新しくなるほどに上手な絵になっていると感じました。

最新モデル SDXL 1.0 生成結果

sdxl_1_d_1.png sdxl_1_d_2.png sdxl_1_d_3.png

画風が固定されて感じるのはstyle_presetの影響でしょうか。
SDXL 0.9と同様にハイクオリティな絵ですね。

ノートパソコン上の可愛い妖精

ノートパソコン上の可愛い妖精(A cute fairy on top of a white laptop)」です。
ここからはphotographicを指定しています。

"style_preset": "photographic",
"text_prompts": [
    {
        "text": "A cute fairy on top of a white laptop"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_a_1.png sdxl_beta_a_1.png sdxl_09_a_1.png
sd21_a_2.png sdxl_beta_a_2.png sdxl_09_a_2.png
sd21_a_3.png sdxl_beta_a_3.png sdxl_09_a_3.png

モデルが新しくなるほどに、私の思う可愛い妖精に近づいているという印象です。

最新モデル SDXL 1.0 生成結果

sdxl_1_e_1.png sdxl_1_e_2.png sdxl_1_e_3.png

ノートパソコンあたりの描画がより実物に近づいていますね。妖精が直接ノートパソコンの上にいることですとか。

黒いボブヘアで可愛い28歳の日本人女性

私がQiita記事で使う定番プロンプト「黒いボブヘアで可愛い28歳の日本人女性(28-year-old Japanese pretty woman with black bobbed hair)」です。

"style_preset": "photographic",
"text_prompts": [
    {
        "text": "28-year-old Japanese pretty woman with black bobbed hair"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_b_1.png sdxl_beta_b_1.png sdxl_09_b_1.png
sd21_b_2.png sdxl_beta_b_2.png sdxl_09_b_2.png
sd21_b_3.png sdxl_beta_b_3.png sdxl_09_b_3.png

新しいモデルになるほどに上手な人が撮った写真に近づいていると感じました。

最新モデル SDXL 1.0 生成結果

sdxl_1_f_1.png sdxl_1_f_2.png sdxl_1_f_3.png

もはやただの思い込みの気もしますがAIが生成する顔から実際にいる女性の顔に近づいているような印象を持ちました。
あと、髪型もボブから連想されるものに近いです。

1980年代の香港の繁華街

人ではなく景色を生成してみます。「1980年代の香港の繁華街(Hong Kong downtown in the 1980s)」です。

"style_preset": "photographic",
"text_prompts": [
    {
        "text": "Hong Kong downtown in the 1980s"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_c_1.png sdxl_beta_c_1.png sdxl_09_c_1.png
sd21_c_2.png sdxl_beta_c_2.png sdxl_09_c_2.png
sd21_c_3.png sdxl_beta_c_3.png sdxl_09_c_3.png

モデルが新しくなるほどにプロンプトの再現度が上がっている印象は受けました。

最新モデル SDXL 1.0 生成結果

sdxl_1_g_1.png sdxl_1_g_2.png sdxl_1_g_3.png

写真っぽさが増し、また、私が香港を訪れたのは2010年代なので何の説得力もないかもしれませんが、1980年代の香港っぽさも増しているように思います。

2020年の新宿歌舞伎町

最後になります。
2020年の新宿歌舞伎町(Shinjuku Kabukicho in 2020)」です。

"style_preset": "photographic",
"text_prompts": [
    {
        "text": "Shinjuku Kabukicho in 2020"
    }
],

過去モデル 生成結果(旧 → 新)

SD 2.1 SDXL Beta SDXL 0.9
sd21_d_1.png sdxl_beta_d_1.png sdxl_09_d_1.png
sd21_d_2.png sdxl_beta_d_2.png sdxl_09_d_2.png
sd21_d_3.png sdxl_beta_d_3.png sdxl_09_d_3.png

新しいモデルほどに新宿のイメージに近付いているとは思いました。文字だけはどうしても「それっぽい」に留まりますね。

最新モデル SDXL 1.0 生成結果

sdxl_1_h_1.png sdxl_1_h_2.png sdxl_1_h_3.png

うーん、歌舞伎町に近づいているような、そうでもないような。

指定可能なモデル一覧

おまけとしてenginesのlist APIで取得した指定可能なモデルのリストを貼っておきます。

[
    {
        "description": "Real-ESRGAN_x2plus upscaler model",
        "id": "esrgan-v1-x2plus",
        "name": "Real-ESRGAN x2",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion XL v0.9",
        "id": "stable-diffusion-xl-1024-v0-9",
        "name": "Stable Diffusion XL v0.9",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion XL v1.0",
        "id": "stable-diffusion-xl-1024-v1-0",
        "name": "Stable Diffusion XL v1.0",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion v1.4",
        "id": "stable-diffusion-v1",
        "name": "Stable Diffusion v1.4",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion v1.5",
        "id": "stable-diffusion-v1-5",
        "name": "Stable Diffusion v1.5",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion v2.0",
        "id": "stable-diffusion-512-v2-0",
        "name": "Stable Diffusion v2.0",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion 768 v2.0",
        "id": "stable-diffusion-768-v2-0",
        "name": "Stable Diffusion v2.0-768",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion Depth v2.0",
        "id": "stable-diffusion-depth-v2-0",
        "name": "Stable Diffusion v2.0-depth",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion v2.1",
        "id": "stable-diffusion-512-v2-1",
        "name": "Stable Diffusion v2.1",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion 768 v2.1",
        "id": "stable-diffusion-768-v2-1",
        "name": "Stable Diffusion v2.1-768",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Diffusion XL Beta v2.2.2",
        "id": "stable-diffusion-xl-beta-v2-2-2",
        "name": "Stable Diffusion v2.2.2-XL Beta",
        "type": "PICTURE"
    },
    {
        "description": "Stable Diffusion x4 Latent Upscaler",
        "id": "stable-diffusion-x4-latent-upscaler",
        "name": "Stable Diffusion x4 Latent Upscaler",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Inpainting v1.0",
        "id": "stable-inpainting-v1-0",
        "name": "Stable Inpainting v1.0",
        "type": "PICTURE"
    },
    {
        "description": "Stability-AI Stable Inpainting v2.0",
        "id": "stable-inpainting-512-v2-0",
        "name": "Stable Inpainting v2.0",
        "type": "PICTURE"
    }
]

最後に

生成画像を見た印象としては「プロンプトから私がイメージするもの」にさらに近づいたと感じます。
ただ、向上を感じるのは構図だったり、画風だったりについてであって、正確性についてはやはり改善が厳しいのだと感じる部分も多いです。

しかし、少なくとも現時点においては生成AIに最優先で求められるものは正確性ではない気がしているので、正確性を他で補う前提であれば、望まれる進化を辿っているように思えもします。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

27
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
24