「食パンをくわえて走る女子高生」のイラストをSketch to imageでAI生成してみた

[Supership](https://supership.jp/)の名畑です。料理漫画というのはいかに読者に味を想像させるかが重要だと思っています。でも、現在連載中の「[寿エンパイア](https://urasunday.com/title/1020)」は味が想像困難な寿司が次々と登場するものの面白い。あと、今にして思えば「[焼きたて!!ジャぱん](https://ja.wikipedia.org/wiki/%E7%84%BC%E3%81%8D%E3%81%9F%E3%81%A6!!%E3%82%B8%E3%83%A3%E3%81%B1%E3%82%93)」に登場するパンたちも味の想像なんてまったくできなかったです(そういう次元じゃない?)。

## はじめに

画像生成モデルで有名な[Stable Diffusion](https://ja.stability.ai/stable-diffusion)の提供元[stability.ai](https://stability.ai/)による画像編集ツールとして[ClipDrop](https://clipdrop.co/)というものがあります。

**ClipDrop**は複数のツールを提供しているのですが、そのうちの一つに[STABLE DOODLE](https://clipdrop.co/stable-doodle)というものがあります。
**Sketch to image**、つまりは、端的に言えば「**落書きを元にして高品質画像を生成するツール**」です。

下記の通り、**Stable Diffusion**の最新モデルである**Stable Diffusion XL**(SDXL)と、構図制御で有名な[T2I-Adapter](https://github.com/TencentARC/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を用いて「**落書きから高品質な画像を実際に生成してみる**」というのが今回の趣旨です。

で、なにを描こうかと考えたんですが、先日「[『食パンを咥えたヒロインと街角でぶつかる』シーンは、王道なのに元ネタが存在しないらしい→元ネタ不明の王道はこんなにある](https://togetter.com/li/2213133)」という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**を指定しました。


結果はこちらです。

![38333add-1318-4cf1-88d0-15082887c851.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/34416257-a90f-ac55-3064-c4dbf8e5bf39.jpeg)
![02c8a1ca-979a-4192-9aa0-40940576a667.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/a44a7cf1-08cf-1d14-3e51-e8697aabb542.jpeg)

「**う〜ん、思っているのとは違う**」という感じです。「**食パンをなんだと思っているんだ？**」というイラストたち。

やはり複雑なシチュエーションすぎるのですよね。
そして今の**Stable Diffusion**だとこの複雑なシチュエーションをバッチリ再現するのは難しい。

[ControlNet](https://github.com/lllyasviel/ControlNet)もなにも使わないと、普通の構図だってなかなか狙った通りには生成できないですからね。

## Sketch to imageを使用

はい、ここからが本題です。
**Sketch to image**を使った場合の結果です。

### コード

API呼び出しのコードはこちらです。[公式ガイド](https://clipdrop.co/apis/docs/sketch-to-image)に記載の内容を元にしています。Pythonで書いています。

```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で実装してみた](https://qiita.com/nabata/items/683e3a9ccb4d6279ca02)」をご覧ください。

### 元画像

スケッチ画像として使用したのはこちらです。

![original_image_with_bread.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/cdfa0443-1fe6-2df4-a0d4-1ca100423271.png)

### 生成結果

そしてAPIを通じて生成されたのはこちらです。

![generated_image_with_bread.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/4ebba671-5789-a0d1-8c45-a1e9f736ab37.png)

- 「**えっ、こんなものなの?**」
- 「**口にくわえてるの、明らかに食パンじゃないよねwww**」

なんて思われそうではありますが

- **パンをくわえている**
- **走っている**
- **住宅街(に見えなくもない)**
- **女子高生(小学生や中学生に見えなくもない)**

といった各要素は満たされているし、あと、右足は不自然なもののかなり狙った構図ではあるので、ひとまずは前進としたい。

## 金額

ログイン時にClipDropのフリークレジットが100付与され、1画像を生成する度に1クレジットを使用します。

100枚より多く生成する場合はクレジットの購入が必要です。金額は[Pricing](https://clipdrop.co/apis/pricing)のページをご覧ください。まとめて購入する毎に単価が下がっていきますが、現在は1クレジット¥1.472〜¥8.128の範囲です。

## 最後に

まったくもって結果に納得できていないので、今後の記事でリベンジしたい。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

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