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
というシンプルなプロンプトで生成した結果が下記です。ジェットコースターは和製英語らしい。
色々とツッコミどころはあるというか、そもそもまともに動きそうもないですが、まあ、ジェットコースターですね。
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
はい、ただぐにゃぐにゃの線を描いてみました。
生成画像1
上記の元画像を用いて生成された結果はこちらです。
うーん、あまり線が生かされている感じがない。
流石に無理があったか。
元画像2
シンプルにしてみました。
生成画像2
うん、線が生かされている感は出ましたね。
元画像3
もう少し複雑な線にしてみました。
生成画像3
線は生かされているが、果たしてこれはジェットコースターと呼べるのか。この画像をずっと見ていると背中が汗をかきそう。
元画像4
レールを2本の線で描いてみると良くなりそうな気がしたのでこうしてみました。
生成画像4
かなり近づいた。
もう少し書き込むと、よりイメージ通りになりそうです。
最後に
ジェットコースターの画像を日常で必要とすることがないので使い所はなかなか思いつかないですが、こうやって画像の生成をいくつも試していると、いつか役に立つ気はしています。勘違いかもだけれど。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。