こんにちはn0bisukeです。
沖中塾(初心者向け記事) アドベントカレンダー 20222日目の記事です。
ポスターデザインコンペにStable Diffusionを使って絵を書いて応募したら入賞してしまった話ですが、初心者向けカレンダーということでStable Diffusionの使い方も紹介していきます。
沖中塾とは
沖中塾は沖中塾長(@okinakamasayos1)を筆頭に、プログラミングなどをやったことがなくてもテクノロジーを自分で使いこなして試行錯誤している人たちの集まりです。
デジタルを身近に!「試作品(プロトタイプ)を現場で作って試してみる」を実践する沖中塾長の活動を紹介しております。 「劣等感を力に変える」をモットーに出来るからやるではなく出来ないからやる!で日々、成長します!ハッシュタグは#沖中塾
https://twitter.com/okinaka_jyuku
数万人の参加者がいて全国に支部がある模様です。一説によると沖縄に本部があるそうです。
Wikipediaのページはなかったのですがそのうち中の人ができるような気がします。
沖中塾デザインコンペ
沖中塾さんがポスターデザイン募集をしていたので話題のStable Diffusionを使って絵を書いて応募したらどうなるかを検証してみました。
【沖中塾ポスターデザイン大募集】
— 沖中塾 (@okinaka_jyuku) October 9, 2022
沖中塾ポスターデザインの募集企画を開催します。
添付の募集要項をご確認下さい!
ささやかながらプレゼント🎁を準備しました!
10/16(日)23:59迄、受付しています。
多くのご応募お待ちしております!#沖中塾#沖中塾ポスターデザイン大募集中 pic.twitter.com/uZxaMOf2Wj
ハッシュタグを見てるとみなさんCanvaなど色々ツールを駆使して作っていたみたいですが、僕はAIに描いてもらうアプローチで挑んでみました。
Stable Diffusionでのimg2img
こちらの記事を元にAI画像生成のStable Diffusionでimg2imgを試してみました。
Hugging Faceのトークン取得
Hugging Faceというサービス上でトークンを生成してサーバーを利用させてもらいます。
こちらの記事の手順でアクセストークンを取得できます。
Write
とRead
が出ますが、Readの方を使います。
Google Colabを始める
Google ColabはGoogleが無料で提供している機械学習の教育や研究用の開発環境です。今回のStable Diffusionを試すにあたりローカルでパソコンにインストールする方法などもありますが、無料でクラウドを利用させてもらえるので乗っかりましょう。
ブラウザだけでできるので、自身のPCスペックが低くても使えるのも良いですね。
こちらにアクセスするとGoogle Colabを使えます。
ノードブックの新規作成を選択すると空のノートブックが表示されます。
何か入力できそうなエリアと再生ボタンが表示されますね。
以下をコピペして、再生ボタンを押します。
#@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/
こんな感じでコピペ。
再生ボタンを押すと何やらインストールが始まりますね。
ここまででライブラリのインストールなど準備ができました。
次にHugging Faceにログインします。左上の+コード
を押すと1番下に入力できるフォームが追加されます。
また、同じようにコピペと再生ボタンを押しましょう。
#@markdown ・事前にHagging Faceでアクセス・トークンを取得しておいて下さい
from huggingface_hub import notebook_login
# ログイン
notebook_login()
※コードは参考記事からそのまま持って来ています。
http://cedro3.com/ai/image2image/
トークンを入れるように求められるので先ほど取得したトークン(Readのほう)を入れてログインします。
成功するとLogin successful
と表示されます。
最後にプログラムを動かします。またコード追加 -> コピペ -> 再生ボタンで進みましょう。
#@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(かっこいいポスター)
とテキスト(プロンプト)も入れてみました。
二つの候補がでてくるのでこれを元にまた改変していきます。
Strengthのパラメーターではどれくらいテキストの意味合いを強くするかを選べます。
Stable Diffusionでお絵描き途中の様子
欲しいものは自分で作る
といったコンセプトが提示されていたので、DeepL翻訳に投げて翻訳されたMake what you want
をプロンプトにしてやるともはや別人が生まれたりしてました。
時の運みたいなところもあって、以下の画像がけっこういい感じだったんですけど保存し忘れて微妙なスクショになってしまいました。
そんなこんなでいくつか生成してみてました。
昭和風#沖中塾#沖中塾ポスターデザイン大募集中#ボツネタ#stableDifusion pic.twitter.com/Tp521g0B0e
— 菅原のびすけ (@n0bisuke) October 16, 2022
お絵描きばりグッドくんでも作ってみた
ここまでimg2imgを使って生成してましたが、全く別口でLINEでお絵描き生成ができるお絵描きばりぐっどくんというLINE Botが少し前に有名になってたのですがこちらでも作ってみました。ここまで色々書いたけどLINEから日本語でお願いすると書いてくれるって楽ですよね。
Stable Diffusionをこういう形で組み込んだアプリケーションはどんどん増えている印象なので、生成サクッとしたいならGoogle Colabで自分でやらなくても良さそうです。笑
受賞したのはなんと...
何個か出した気がしたのですが、受賞したのがこちらです。特別賞をもらいました。
AIに書いてもらった作品が特別賞... ノリで参加した感だったのでなんかすみません。
びっくり特別賞@n0bisuke さま
— 沖中塾 (@okinaka_jyuku) October 18, 2022
〈塾長コメント〉
理由は不明ですが、とにかく脳にベッタリとこべりついて、全然離れないから。インパクト抜群です。 pic.twitter.com/ObeB1A4ata
はい、ということで...
なんとお絵描きばりグッドくんに描いてもらったやつが入賞してました。
僕がAIにお願いして書くよりもお絵描きばりグッドくんに描いてもらった絵の方が審査員にウケたんですね〜〜
ポスターデザインコンペにStable Diffusionを使って絵を書いて応募したら入賞してしまった話
というタイトルでしたがお絵描きばりグッドくんは中でStable Diffusionを使ってるそうなのでタイトル詐欺にはギリギリならないかな...苦笑
人間がAIに負ける、どころではなかった
AIを使って描いた作品がAIを使ってない人の作品に勝ったという事実は色々な論争がありそうで面白いなと思っているのですが、それとは別でAIを使ってるのにAIに負けたという事実が次世代の戦いを感じます。
人間がAIに負けるよねー人間の仕事がなくなるーみたいな論争はもはや全世代的な話題なのかもしれません。
AIをうまく使う方法をキャッチアップしていかないとですね!
ということで締めです。
カレンダー3日目の明日は@cog1t0さんの「softrでアプリを作ろう」とのことです、お楽しみに!
それでは!