ポスターデザインコンペにStable Diffusionを使って絵を書いて応募したら入賞してしまった話


こんにちはn0bisukeです。

[沖中塾(初心者向け記事) アドベントカレンダー 2022](https://qiita.com/advent-calendar/2022/okinakajyuku)2日目の記事です。

ポスターデザインコンペにStable Diffusionを使って絵を書いて応募したら入賞してしまった話ですが、初心者向けカレンダーということでStable Diffusionの使い方も紹介していきます。

## 沖中塾とは

沖中塾は沖中塾長(@okinakamasayos1)を筆頭に、プログラミングなどをやったことがなくてもテクノロジーを自分で使いこなして試行錯誤している人たちの集まりです。

> デジタルを身近に！「試作品（プロトタイプ）を現場で作って試してみる」を実践する沖中塾長の活動を紹介しております。 「劣等感を力に変える」をモットーに出来るからやるではなく出来ないからやる！で日々、成長します！ハッシュタグは#沖中塾
> https://twitter.com/okinaka_jyuku

数万人の参加者がいて全国に支部がある模様です。一説によると沖縄に本部があるそうです。

Wikipediaのページはなかったのですがそのうち中の人ができるような気がします。

## 沖中塾デザインコンペ

沖中塾さんがポスターデザイン募集をしていたので話題のStable Diffusionを使って絵を書いて応募したらどうなるかを検証してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【沖中塾ポスターデザイン大募集】<br>沖中塾ポスターデザインの募集企画を開催します。<br>添付の募集要項をご確認下さい！<br>ささやかながらプレゼント🎁を準備しました！<br>10/16(日)23:59迄、受付しています。<br>多くのご応募お待ちしております！<a href="https://twitter.com/hashtag/%E6%B2%96%E4%B8%AD%E5%A1%BE?src=hash&amp;ref_src=twsrc%5Etfw">#沖中塾</a><a href="https://twitter.com/hashtag/%E6%B2%96%E4%B8%AD%E5%A1%BE%E3%83%9D%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%A4%A7%E5%8B%9F%E9%9B%86%E4%B8%AD?src=hash&amp;ref_src=twsrc%5Etfw">#沖中塾ポスターデザイン大募集中</a> <a href="https://t.co/uZxaMOf2Wj">pic.twitter.com/uZxaMOf2Wj</a></p>&mdash; 沖中塾 (@okinaka_jyuku) <a href="https://twitter.com/okinaka_jyuku/status/1578902994497998850?ref_src=twsrc%5Etfw">October 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ハッシュタグを見てるとみなさんCanvaなど色々ツールを駆使して作っていたみたいですが、僕はAIに描いてもらうアプローチで挑んでみました。

## Stable Diffusionでのimg2img

こちらの記事を元にAI画像生成のStable Diffusionでimg2imgを試してみました。

> [Stable Diffusionのimg2imgをGoogle Colabでやってみる](http://cedro3.com/ai/image2image/)

### Hugging Faceのトークン取得

Hugging Faceというサービス上でトークンを生成してサーバーを利用させてもらいます。

[こちらの記事](http://cedro3.com/ai/stable-diffusion/)の手順でアクセストークンを取得できます。

`Write`と`Read`が出ますが、Readの方を使います。

> ![スクリーンショット 2022-12-02 14.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/695712e9-b565-d64c-3fcd-406adfddcce3.png "スクリーンショット 2022-12-02 14.01.11.png")

### Google Colabを始める

Google ColabはGoogleが無料で提供している機械学習の教育や研究用の開発環境です。今回のStable Diffusionを試すにあたりローカルでパソコンにインストールする方法などもありますが、無料でクラウドを利用させてもらえるので乗っかりましょう。

ブラウザだけでできるので、自身のPCスペックが低くても使えるのも良いですね。

https://colab.research.google.com/?hl=ja 

こちらにアクセスするとGoogle Colabを使えます。

ノードブックの新規作成を選択すると空のノートブックが表示されます。

> ![スクリーンショット 2022-12-02 14.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/61a2c32c-121d-54ab-61ce-1c347ad1a0c8.png "スクリーンショット 2022-12-02 14.07.59.png")

何か入力できそうなエリアと再生ボタンが表示されますね。

以下をコピペして、再生ボタンを押します。

```py
#@title **セットアップ**
 
# ライブラリ・インストール
! pip install transformers gradio scipy ftfy "ipywidgets>=7,<8" datasets
 
# githubからコードをコピーしインストール
! git clone https://github.com/huggingface/diffusers.git
! pip install git+https://github.com/huggingface/diffusers.git
%cd diffusers
 
# 関数定義（追加）
import PIL
from PIL import Image
import numpy as np
 
def preprocess(image):
    w, h = image.size
    w, h = map(lambda x: x - x % 32, (w, h))  # resize to integer multiple of 32
    image = image.resize((w, h), resample=PIL.Image.LANCZOS)
    image = np.array(image).astype(np.float32) / 255.0
    image = image[None].transpose(0, 3, 1, 2)
    image = torch.from_numpy(image)
    return 2.*image - 1.
```

> ※コードは参考記事からそのまま持って来ています。
> http://cedro3.com/ai/image2image/

こんな感じでコピペ。

> ![スクリーンショット 2022-12-02 14.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/36b95653-336c-0dd6-07b1-78db2abf6d7a.png "スクリーンショット 2022-12-02 14.09.33.png")

再生ボタンを押すと何やらインストールが始まりますね。

> ![スクリーンショット 2022-12-02 14.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/5ce929a2-4fbf-3d4b-ac74-ce9e21d9ee4e.png "スクリーンショット 2022-12-02 14.10.19.png")

ここまででライブラリのインストールなど準備ができました。

次にHugging Faceにログインします。左上の`+コード`を押すと1番下に入力できるフォームが追加されます。

> ![スクリーンショット 2022-12-02 14.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/2bd5a655-8d37-84cd-ccb3-7f3c9b8a00e5.png "スクリーンショット 2022-12-02 14.11.47.png")

また、同じようにコピペと再生ボタンを押しましょう。

```py
#@markdown　・事前にHagging Faceでアクセス・トークンを取得しておいて下さい
 
from huggingface_hub import notebook_login
 
# ログイン
notebook_login()
```

> ※コードは参考記事からそのまま持って来ています。
> http://cedro3.com/ai/image2image/

トークンを入れるように求められるので先ほど取得したトークン(Readのほう)を入れてログインします。

> ![スクリーンショット 2022-12-02 14.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/b2e724e8-a744-27bc-b8d4-4858d64c877b.png "スクリーンショット 2022-12-02 14.13.54.png")

成功すると`Login successful`と表示されます。

> ![スクリーンショット 2022-12-02 14.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/e081ebcc-8b1c-5965-c074-fe35972c6db3.png "スクリーンショット 2022-12-02 14.14.49.png")

最後にプログラムを動かします。またコード追加 -> コピペ -> 再生ボタンで進みましょう。

```py
#@title **本体プログラム**
import gradio as gr
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler
import requests
from PIL import Image
from io import BytesIO
from IPython.display import clear_output ###

#from examples.inference.image_to_image import StableDiffusionImg2ImgPipeline, preprocess
from diffusers import StableDiffusionImg2ImgPipeline

lms = LMSDiscreteScheduler(
    beta_start=0.00085, 
    beta_end=0.012, 
    beta_schedule="scaled_linear"
)

pipe = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4", 
    scheduler=lms,
    revision="fp16", 
    use_auth_token=True
).to("cuda")

pipeimg = StableDiffusionImg2ImgPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
).to("cuda")




block = gr.Blocks(css=".container { max-width: 800px; margin: auto; }")

num_samples = 2

def infer(prompt, init_image, strength):
    if init_image != None:
        init_image = init_image.resize((512, 512))
        init_image = preprocess(init_image)
        with autocast("cuda"):
            images = pipeimg([prompt] * num_samples, init_image=init_image, strength=strength, guidance_scale=7.5)[0]
    else: 
        with autocast("cuda"):
            images = pipe([prompt] * num_samples, guidance_scale=7.5)[0]

    return images


with block as demo:
    gr.Markdown("<h1><center>Stable Diffusion</center></h1>")
    gr.Markdown(
        "Stable Diffusion is an AI model that generates images from any prompt you give!"
    )
    with gr.Group():
        with gr.Box():
            with gr.Row().style(mobile_collapse=False, equal_height=True):

                text = gr.Textbox(
                    label="Enter your prompt", show_label=False, max_lines=1
                ).style(
                    border=(True, False, True, True),
                    rounded=(True, False, False, True),
                    container=False,
                )
                btn = gr.Button("Run").style(
                    margin=False,
                    rounded=(False, True, True, False),
                )
        strength_slider = gr.Slider(
            label="Strength",
            maximum = 1,
            value = 0.75         
        )
        image = gr.Image(
            label="Intial Image",
            type="pil"
        )
               
        gallery = gr.Gallery(label="Generated images", show_label=False).style(
            grid=[2], height="auto"
        )
        text.submit(infer, inputs=[text,image,strength_slider], outputs=gallery)
        btn.click(infer, inputs=[text,image,strength_slider], outputs=gallery)

    gr.Markdown(
        """___
   <p style='text-align: center'>
   Created by CompVis and Stability AI
   <br/>
   </p>"""
    )

clear_output() ###
demo.launch(debug=True)
```

> ※コードは参考記事からそのまま持って来ています。
> http://cedro3.com/ai/image2image/

問題なく実行されるとアプリケーションが起動して、画像をアップロードしてテキストを入れるフォームが出て来ます。塾長の写真をTwitterなどから見つけてアプリケーションに投げつつ、`Cool Poster（かっこいいポスター）`とテキスト（プロンプト）も入れてみました。

二つの候補がでてくるのでこれを元にまた改変していきます。

> ![スクリーンショット 2022-12-02 14.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/9cf6cbd4-7655-85cc-d556-6a041ad800d3.png "スクリーンショット 2022-12-02 14.28.26.png")

Strengthのパラメーターではどれくらいテキストの意味合いを強くするかを選べます。

## Stable Diffusionでお絵描き途中の様子

`欲しいものは自分で作る`といったコンセプトが提示されていたので、DeepL翻訳に投げて翻訳された`Make what you want`をプロンプトにしてやるともはや別人が生まれたりしてました。

> ![スクリーンショット 2022-12-02 14.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d753b8f7-1419-6e69-a0b0-90aa836be784.png "スクリーンショット 2022-12-02 14.31.18.png")

時の運みたいなところもあって、以下の画像がけっこういい感じだったんですけど保存し忘れて微妙なスクショになってしまいました。

> ![スクリーンショット 2022-12-02 14.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/09ac2242-3a1f-0810-1e49-699657a06b0e.png "スクリーンショット 2022-12-02 14.34.38.png")


そんなこんなでいくつか生成してみてました。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">昭和風<a href="https://twitter.com/hashtag/%E6%B2%96%E4%B8%AD%E5%A1%BE?src=hash&amp;ref_src=twsrc%5Etfw">#沖中塾</a><a href="https://twitter.com/hashtag/%E6%B2%96%E4%B8%AD%E5%A1%BE%E3%83%9D%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%A4%A7%E5%8B%9F%E9%9B%86%E4%B8%AD?src=hash&amp;ref_src=twsrc%5Etfw">#沖中塾ポスターデザイン大募集中</a><a href="https://twitter.com/hashtag/%E3%83%9C%E3%83%84%E3%83%8D%E3%82%BF?src=hash&amp;ref_src=twsrc%5Etfw">#ボツネタ</a><a href="https://twitter.com/hashtag/stableDifusion?src=hash&amp;ref_src=twsrc%5Etfw">#stableDifusion</a> <a href="https://t.co/Tp521g0B0e">pic.twitter.com/Tp521g0B0e</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1581667230739152897?ref_src=twsrc%5Etfw">October 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## お絵描きばりグッドくんでも作ってみた

ここまでimg2imgを使って生成してましたが、全く別口でLINEでお絵描き生成ができる[お絵描きばりぐっどくん](https://page.line.me/877ieiqs)というLINE Botが少し前に有名になってたのですがこちらでも作ってみました。ここまで色々書いたけどLINEから日本語でお願いすると書いてくれるって楽ですよね。

> ![スクリーンショット 2022-12-02 14.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/4480eaec-e8d9-e68c-b794-63a5d625b08a.png "スクリーンショット 2022-12-02 14.45.57.png")

Stable Diffusionをこういう形で組み込んだアプリケーションはどんどん増えている印象なので、生成サクッとしたいならGoogle Colabで自分でやらなくても良さそうです。笑

## 受賞したのはなんと...

何個か出した気がしたのですが、受賞したのがこちらです。特別賞をもらいました。

AIに書いてもらった作品が特別賞... ノリで参加した感だったのでなんかすみません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">びっくり特別賞<a href="https://twitter.com/n0bisuke?ref_src=twsrc%5Etfw">@n0bisuke</a> さま<br>〈塾長コメント〉<br>理由は不明ですが、とにかく脳にベッタリとこべりついて、全然離れないから。インパクト抜群です。 <a href="https://t.co/ObeB1A4ata">pic.twitter.com/ObeB1A4ata</a></p>&mdash; 沖中塾 (@okinaka_jyuku) <a href="https://twitter.com/okinaka_jyuku/status/1582352646182432768?ref_src=twsrc%5Etfw">October 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

はい、ということで...

**なんとお絵描きばりグッドくんに描いてもらったやつが入賞してました。**

僕がAIにお願いして書くよりもお絵描きばりグッドくんに描いてもらった絵の方が審査員にウケたんですね〜〜

`ポスターデザインコンペにStable Diffusionを使って絵を書いて応募したら入賞してしまった話`というタイトルでしたがお絵描きばりグッドくんは中でStable Diffusionを使ってるそうなのでタイトル詐欺にはギリギリならないかな...苦笑

## 人間がAIに負ける、どころではなかった

AIを使って描いた作品がAIを使ってない人の作品に勝ったという事実は色々な論争がありそうで面白いなと思っているのですが、それとは別でAIを使ってるのにAIに負けたという事実が次世代の戦いを感じます。

人間がAIに負けるよねー人間の仕事がなくなるーみたいな論争はもはや全世代的な話題なのかもしれません。

AIをうまく使う方法をキャッチアップしていかないとですね！

ということで締めです。
カレンダー3日目の明日は@cog1t0さんの「softrでアプリを作ろう」とのことです、お楽しみに！

それでは！