Supershipの名畑です。料理漫画というのはいかに読者に味を想像させるかが重要だと思っています。でも、現在連載中の「寿エンパイア」は味が想像困難な寿司が次々と登場するものの面白い。あと、今にして思えば「焼きたて!!ジャぱん」に登場するパンたちも味の想像なんてまったくできなかったです(そういう次元じゃない?)。
はじめに
画像生成モデルで有名なStable Diffusionの提供元stability.aiによる画像編集ツールとしてClipDropというものがあります。
ClipDropは複数のツールを提供しているのですが、そのうちの一つにSTABLE DOODLEというものがあります。
Sketch to image、つまりは、端的に言えば「落書きを元にして高品質画像を生成するツール」です。
下記の通り、Stable Diffusionの最新モデルであるStable Diffusion XL(SDXL)と、構図制御で有名なT2I-Adapterが用いられています。
Stable Doodle combines the advanced image generating technology of Stability AI’s Stable Diffusion XL with the powerful T2I-Adapter. T2I-Adapter is a condition control solution developed by Tencent ARC (license). It allows for precise control over AI image generation.
このSketch to imageはまだBetaではあるもののWeb APIも提供されております。
このAPIを用いて「落書きから高品質な画像を実際に生成してみる」というのが今回の趣旨です。
で、なにを描こうかと考えたんですが、先日「『食パンを咥えたヒロインと街角でぶつかる』シーンは、王道なのに元ネタが存在しないらしい→元ネタ不明の王道はこんなにある」というtogetterまとめを見ましたので、今回は「食パンをくわえて走る女子高生」を描いてみようと思います。
AIで生成するにはかなり難易度が高そうなお題なのでちょうどいいのではないかと。
Sketch to image未使用
まずは、参考までに、Sketch to imageを使わずに生成してみました。
果たしてどんな結果が出るのか。
生成に使用したのはClipDrop経由でのStable Diffusion XLです。
プロンプトはこちら。
A high school girl running through a residential area with a piece of plain bread putted in her mouth
直訳するなら「食パン一切れを口に入れて住宅街を走る女子高生」でしょうか。
後で思ったのですが「a slice of white bread」の方が正確でしたかね……それとも「a slice of sandwich bread」でしょうか。
スタイルとしてはAnimeを指定しました。
結果はこちらです。
「う〜ん、思っているのとは違う」という感じです。「食パンをなんだと思っているんだ?」というイラストたち。
やはり複雑なシチュエーションすぎるのですよね。
そして今のStable Diffusionだとこの複雑なシチュエーションをバッチリ再現するのは難しい。
ControlNetもなにも使わないと、普通の構図だってなかなか狙った通りには生成できないですからね。
Sketch to imageを使用
はい、ここからが本題です。
Sketch to imageを使った場合の結果です。
コード
API呼び出しのコードはこちらです。公式ガイドに記載の内容を元にしています。Pythonで書いています。
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': 'A high school girl running through a residential area with a piece of plain bread in her mouth, Anime'},
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()
非常にシンプルなコードです。
original_image.pngが元画像のファイル名です。
元画像とプロンプト、それにAPI KEYをパラメータとして渡します。
※API KEYの取得について詳しくは過去記事である「画像からの「人や物」「背景」「テキスト」の除去をPythonとClipdrop APIsで実装してみた」をご覧ください。
元画像
スケッチ画像として使用したのはこちらです。
生成結果
そしてAPIを通じて生成されたのはこちらです。
- 「えっ、こんなものなの?」
- 「口にくわえてるの、明らかに食パンじゃないよねwww」
なんて思われそうではありますが
- パンをくわえている
- 走っている
- 住宅街(に見えなくもない)
- 女子高生(小学生や中学生に見えなくもない)
といった各要素は満たされているし、あと、右足は不自然なもののかなり狙った構図ではあるので、ひとまずは前進としたい。
金額
ログイン時にClipDropのフリークレジットが100付与され、1画像を生成する度に1クレジットを使用します。
100枚より多く生成する場合はクレジットの購入が必要です。金額はPricingのページをご覧ください。まとめて購入する毎に単価が下がっていきますが、現在は1クレジット¥1.472〜¥8.128の範囲です。
最後に
まったくもって結果に納得できていないので、今後の記事でリベンジしたい。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。