下書発掘:StableDiffusionまわり、何をやる?

備考
下書き欄に眠っていることを2024/08/04に発掘
Stablediffusionやらなんやらの画像生成出力共有サイトを参考にすればいいのでこの下のことをやる必要はないのでは?と思い再整理を行わず放流。
なお、全然違う方法でそれぞれ実行済みのように見える

前回の記事に書いた「今後やりたいこと」

プロンプトの総当たりを行うプログラムの作成

→ itertoolsを使えば簡単。
すごいぞitertoolsくん #Python - Qiita

参考元のプログラムを自分好みに微妙に改変。
こんなにプロンプト入力したんだからもっと使ってしまえー!という気持ちを込めた。

import json
import requests
import io
import base64
import random
import itertools
from PIL import Image, PngImagePlugin
import click

@click.command()
@click.option("--input_url", help="input url",default=r"http://localhost:7860")

def sdwebapi_get(input_url):
  default_prompt = "※必須にするプロンプトを入力"
  T1="※ここにTier1プロンプトを,区切りで入力".split(",")
  N="※ここにまああるといいなぁってプロンプトを,区切りで入力".split(",")
  D="hyper paint,masterpiece,".split(",") # ここは検証したいプロンプトを入力した。検証優先のため、プロンプトの入力順を気持ち前にしているが……
  payload = {
      "height": 768,
  }
  default_negative_prompt = "bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry"
  # random_negative_prompt = "lowres,".split(",")
  for t in itertools.combinations(T1, 2):# 4 + 4
      for n in itertools.combinations(N, 20):
          for d in itertools.combinations(D, 1): # +2
              try:
                payload['prompt'] = default_prompt+","+" ".join(t)+" "+" ".join(d)+" "+" ".join(n)

                url=f'{input_url}/sdapi/v1/txt2img'    
                response = requests.post(url=f'{input_url}/sdapi/v1/txt2img', json=payload)
                #print(url)
                response_models = requests.get(url=f'{input_url}/sdapi/v1/sd-models')

                r = response.json()
                r_model = response_models.json()
                #print(r)

                load_r = json.loads(r['info'])
                meta = load_r["infotexts"][0]

                i=0
                for x in r['images']:
                  i=i+1
                  image = Image.open(io.BytesIO(base64.b64decode(x)))
                  pnginfo = PngImagePlugin.PngInfo()
                  pnginfo.add_text("parameters", meta)
                  image.save(r"./output/out/"+str(r_model[0]["model_name"])+"_" + str(load_r["all_seeds"][0])+"_" + str(i) + ".png", pnginfo=pnginfo)
                  #print( 'Prompt:' + r['info'].split(':')[1].replace(', "all_prompts"','').replace('"','') + ' で生成しました。' )
                        
              except Exception as e:
                print(e)
                input("press Enter")
                import sys
                sys.exit()

if __name__ == "__main__":
  sdwebapi_get() # pylint: disable=no-value-for-parameter

主観的な評価を適当に船井がつけるための何かの作成

→ PySimpleGUIで気軽にできそう。tkなんちゃらとどっちが簡単かな
Python画像処理のためのGUI入門(PySimpleGUI解説) #Python - Qiita

画像からプロンプトの逆生成ができるので、そのプロンプトを自動で持ってくる(もしくは生成時にどこかにDBかcsvか何か使って記録する)プログラムの作成

→ なんと参考元サイトのコードをよく見るとpnginfoにinfotexts付けていた。じゃあここから取ればいいよね。
https://twitter.com/271108_/status/1602508705454432256?s=20&t=W8KQz3JcL1k0Z4jxw-5j8Q

顔面が増えるプロンプトは何?

→ さすがに明確な罠プロンプトは即時発見はできなかった。

Waifuなんちゃらってやつにモデルを変えてみるとどうなる?

→ やる?