8
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-02

こんにちはn0bisukeです。

沖中塾(初心者向け記事) アドベントカレンダー 20222日目の記事です。

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

沖中塾とは

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

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

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

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

沖中塾デザインコンペ

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

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

Stable Diffusionでのimg2img

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

Stable Diffusionのimg2imgをGoogle Colabでやってみる

Hugging Faceのトークン取得

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

こちらの記事の手順でアクセストークンを取得できます。

WriteReadが出ますが、Readの方を使います。

スクリーンショット 2022-12-02 14.01.11.png

Google Colabを始める

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

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

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

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

スクリーンショット 2022-12-02 14.07.59.png

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

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

#@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

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

スクリーンショット 2022-12-02 14.10.19.png

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

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

スクリーンショット 2022-12-02 14.11.47.png

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

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

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

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

スクリーンショット 2022-12-02 14.13.54.png

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

スクリーンショット 2022-12-02 14.14.49.png

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

#@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

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

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

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

スクリーンショット 2022-12-02 14.31.18.png

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

スクリーンショット 2022-12-02 14.34.38.png

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

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

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

スクリーンショット 2022-12-02 14.45.57.png

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

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

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

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

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

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

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

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

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

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

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

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

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

それでは!

8
2
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
8
2