はじめに
生成AIの発展はすさまじいです。近年では特に拡散モデルから文章(プロンプト)から画像を生成する生成AIが話題になりました。
世界に衝撃を与えた画像生成AI「Stable Diffusion」を徹底解説!
https://qiita.com/omiita/items/ecf8d60466c50ae8295b
未来都市にたたずむサンタクロース(Stable Diffusionで生成)
さて、文章から画像を生成するAIもあれば、こちらは画像生成AIよりかは話題になる頻度が少ないですが、画像からその画像に何が写っているかを説明しくれるAIもあるようです。(より専門的に言えば、画像生成AIの入力プロンプトを当てるモデルだそうです。)
https://www.idnet.co.jp/column/page_253.html
生成日本語訳:雪の中を犬と一緒に走る女性。
さて、こちらのAIは言い換えれば画像から文章を生成するAIということができます。
ではここで一つの疑問が生じました。
ある画像を上述の「画像から文章を生成するAI」を使い文章に変換した後で、さらに「文章から画像を生成するAI」を使った画像は一体どんな画像なのか?元の画像からかけ離れてしまうのか?
さらにこの過程を2回繰り替えしたらどうなるのか?
さらにさらに、両AIのランダムシード値を固定したうえで、画像→文章→画像→文章.............と無限に繰り返していき、そしてやがては全く同じ画像しか出力しなくなるそんな収束状態に陥るまで無限に繰り返したとき、一体その画像は何になるのだろうかと?
私はこう思いました、それこそAIしかしらないこの世の「真理」なのではないかと。
本記事はこの仮説を検証し、この世の真理にたどり着くまでの物語です。
実装
さて実装していきます。前節で壮大なことを書いてしまいましたが、実装するべきコードは
1.ランダムシード値を固定したうえで文章生成AIで入力画像から文章を生成する
2.ランダムシード値を固定したうえで画像生成AIで入力文章から画像を生成する
3.1と2を繰り返し、同じ文章が生成されたら探知する
4.最終的な文章を画像生成AIに入力し、でてきた画像こそその画像にまつわる真理である
だけです。実装したものが以下のコードになります。
from diffusers import StableDiffusionPipeline
import torch
from PIL import Image
from clip_interrogator import Config, Interrogator
import open_clip
model_id = "stabilityai/stable-diffusion-2"
generator = torch.Generator("cuda").manual_seed(42)
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
ci = Interrogator(Config(clip_model_name="ViT-L-14/openai",chunk_size = 400))
image = Image.open("./freesozainohito/freesozainohito.jpg").convert('RGB')
i=0
n_prompt='low quality, worst quality, out of focus, ugly, error, jpeg artifacts, lowers, blurry, bokeh,bad anatomy, long_neck, long_body, longbody, deformed mutated disfigured, missing arms, extra_arms, mutated hands, extra_legs, bad hands, poorly_drawn_hands, malformed_hands, missing_limb, floating_limbs, disconnected_limbs, extra_fingers, bad fingers, liquid fingers, poorly drawn fingers, missing fingers, extra digit, fewer digits, ugly face, deformed eyes, partial face, partial head, bad face, inaccurate limb, cropped,multipul angle, two shot, split view, grid view'
prompt_list=[]
while True:
prompt=ci.interrogate(image)
# prompt_cutted=prompt.split(',')[0]
prompt_cutted = prompt
if prompt_cutted in prompt_list:
break
else:
prompt_list.append(prompt_cutted)
image = pipe(prompt,negative_prompt=n_prompt,generator=generator).images[0]
print(prompt)
image.save("./freesozainohito/image"+str(i)+".png")
i=i+1
さて使用したモデルは
画像生成がstable-diffusion-2
https://huggingface.co/stabilityai/stable-diffusion-2
文章生成がViT-L-14/openai
となっております。
ここで問題が生じました。文章生成AIでランダムシード値を固定する方法がわかりませんでした。仕方がないの画像生成AIのみランダムシード値を固定します。
この条件で実行してみました。すると、、、、、
まじでいつまでたっても収束しない......
初期値としてこちらのよく見るフリー素材の男性を入力してこちらの男性の真の姿を調べようとしたのですが、、、、
約1500枚目の果物と化したところで実行をやめました、、、、、
さていつまでたってもこの人の真の姿にたどり着けけないので収束条件を変えましょう。
画像から文章を生成するAIの出力結果は
arafed man looking at his cell phone while standing against a white background, yee chong, telegram sticker, an overweight, professional studio photo, highres, inspired by Reuben Tam, epic stock photo, asian decent, pfp, fat ripped satanic creature, profile picture 1024px, 2 4 - year - old man, twitter pfp
のように','で区切られているのですが、','でくぎられた最初の一要素だけで画像生成AIに入力することにしましょう。こうしてむりやりですが収束させることができ、この人の真の姿を解き明かすことができました。
結果
最初に入力する画像を何にするのか、すなわち何の真理を調べるのかです。さきほど触れてしまったのですが、ターゲットはこの方、
おそらく皆さんも一度は見たことがあるであろうフリー素材のこの方です。この人の真理すなわち本性を調べていきましょう。だんだん収束していく様子を動画として用意しました。すなわち無限ループの画像の部分のみを集めたということです。
なぜかゴルフ場になった
もしやこのスマホで調べていたのはゴルフ場についてだったのかもしれません。
もう一枚だけ検証していきます。
ターゲットイラストやの謎画像シリーズより「社畜のイラスト」です。(一体いつ使うんだ)
果たしてこの二人は一体何を考えているのか?左の従業員の男性は今の状況をどうおもっているのか?右の経営者の男性は逆にこの状況が本当に幸せなのか?この二人の真理をこの手法で調べていきましょう。
電車になった
検証結果
フリー素材の人はゴルフ場だし、社畜は電車だった。
参考