LoginSignup
4
4

「オリジナルのジェットコースター」の画像をSketch to imageでAI生成してみた

Posted at

Supershipの名畑です。今剣への想いをありったけ込めてすえひろがりの完走を応援しています。

はじめに

前回「「食パンをくわえて走る女子高生」のイラストをSketch to imageでAI生成してみた」という記事を書きました。Stable Diffusionの提供元stability.aiによる画像編集ツールClipDropが提供するSketch to image(落書きを元にして高品質画像を生成するツール)のAPIを使ってみたという記事です。

そこでも触れたように、生成された結果に全く納得がいかなかったので、別の挑戦をしてみることにしました。

今回は「オリジナルのジェットコースター」のAI生成に挑戦してみます。

食パンをくわえて走る女子高生」を現実に見たことはないですが「ジェットコースター」であれば何度も見てきました。つい先日もジェットコースターを見て、それで、生成してみたいなと思いました。

Sketch to image未使用

まずは前回同様、参考までに、Sketch to imageを使わずに生成してみました。
過去記事「Stable Diffusionの最新モデル「SDXL 1.0」と過去モデルの生成画像をひたすら比較して進化を実感してみた」のコードを元にしています。stability.aiのAPIを呼び出しています。

import base64
import os
import requests
import time

engine_id = "stable-diffusion-xl-1024-v1-0"  # SDXL 1.0

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,
        "text_prompts": [
            {
                "text": "roller coaster"
            }
        ],
    },
)

# レスポンス確認
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"]))

roller coaster

というシンプルなプロンプトで生成した結果が下記です。ジェットコースターは和製英語らしい。

coaster_1.png

coaster_2.png

no1c.png

色々とツッコミどころはあるというか、そもそもまともに動きそうもないですが、まあ、ジェットコースターですね。

Sketch to imageを使用

はい、ここからが本題です。
Sketch to imageを使った場合の結果です。
基本のコードは前回の記事「「食パンをくわえて走る女子高生」のイラストをSketch to imageでAI生成してみた」と同様です。

import requests
import os
import time

r = requests.post('https://clipdrop-api.co/sketch-to-image/v1/sketch-to-image',
                  files={
                      'sketch_file': ('original_image.png', open("./original_image.png", "rb"), 'image/png'),
                  },
                  data={'prompt': 'roller coaster'},
                  headers={'x-api-key': os.getenv("CLIPDROP_API_KEY")}
                  )

if r.ok:
    with open(f"./generated_image_{int(time.time())}.jpg", "wb") as f:
        f.write(r.content)
else:
    r.raise_for_status()

プロンプト

roller coaster

こちらもシンプルなプロンプトで試してみました。

元画像1

はい、ただぐにゃぐにゃの線を描いてみました。

coaster_3.png

生成画像1

上記の元画像を用いて生成された結果はこちらです。

coaster_4.jpg

うーん、あまり線が生かされている感じがない。
流石に無理があったか。

元画像2

シンプルにしてみました。

coaster_5.png

生成画像2

coaster_6.jpg

うん、線が生かされている感は出ましたね。

元画像3

もう少し複雑な線にしてみました。

coaster_7.png

生成画像3

coaster_8.jpg

線は生かされているが、果たしてこれはジェットコースターと呼べるのか。この画像をずっと見ていると背中が汗をかきそう。

元画像4

レールを2本の線で描いてみると良くなりそうな気がしたのでこうしてみました。

coaster_9.png

生成画像4

coaster_10.jpg

かなり近づいた。
もう少し書き込むと、よりイメージ通りになりそうです。

最後に

ジェットコースターの画像を日常で必要とすることがないので使い所はなかなか思いつかないですが、こうやって画像の生成をいくつも試していると、いつか役に立つ気はしています。勘違いかもだけれど。

宣伝

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

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

4
4
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
4
4