text2prompt

May 28, 2024 · View on GitHub

This is an extension to make prompt from simple text for Stable Diffusion web UI by AUTOMATIC1111.
Currently, only prompts consisting of some danbooru tags can be generated.

Installation

Extensions tab on WebUI

Copy https://github.com/toshiaki1729/stable-diffusion-webui-text2prompt.git into "Install from URL" tab and "Install".

Install Manually

To install, clone the repository into the extensions directory and restart the web UI.
On the web UI directory, run the following command to install:

git clone https://github.com/toshiaki1729/stable-diffusion-webui-text2prompt.git extensions/text2prompt

Usage

  1. Type some words into "Input Theme"
  2. Type some unwanted words into "Input Negative Theme"
  3. Push "Generate" button

Tips

  • For more creative result
    • increase "k value" or "p value"
    • disable "Use weighted choice"
    • use "Cutoff and Power" and decrease "Power"
    • or use "Softmax" (may generate unwanted tags more often)
  • For more strict result
    • decrease "k value" or "p value"
    • use "Cutoff and Power" and increase "Power"
  • You can enter very long sentences, but the more specific it is, the fewer results you will get.

How it works

It's doing nothing special;

  1. Danbooru tags and it's descriptions are in the data folder
  2. Tokenize your input text and calculate cosine similarity with all tag descriptions
  3. Choose some tags depending on their similarities

Database (Optional)

You can choose the following dataset if needed.
Download the following, unzip and put its contents into text2prompt-root-dir/data/danbooru/.

Tag descriptionall-mpnet-base-v2all-MiniLM-L6-v2
well filtered (recommended)download (preinstalled)download
normal (same as previous one)downloaddownload
full (noisy)downloaddownload

well filtered: Tags are removed if their description include the title of some work. These tags are heavily related to a specific work, meaning they are not "general" tags.
normal: Tags containing the title of a work, like tag_name(work_name), are removed.
full: Including all tags.


More detailed description

iN=1,2,...,ni \in N = \\{1, 2, ..., n\\} for index number of the tag
si=SC(di,t)s_i = S_C(d_i, t) for cosine similarity between tag description did_i and your text tt
PiP_i for probability for the tag to be chosen

"Method to convert similarity into probability"

"Cutoff and Power"

pi=clamp(si,0,1)Power=max(si,0)Powerp_i = \text{clamp}(s_i, 0, 1)^{\text{Power}} = \text{max}(s_i, 0)^{\text{Power}}

"Softmax"

pi=σ(snnN)i=esiΣjN esjp_i = \sigma(\\{s_n|n \in N\\})_i = \dfrac{e^{s_i}}{ \Sigma_{j \in N}\ e^{s_j} }

"Sampling method"

Yes, it doesn't sample like other "true" language models do, so "Filtering method" might be better.

"NONE"

Pi=piP_i = p_i

"Top-k"

Pi={piΣpj for all top-kif pi is top-k largest in pnnN0otherwiseP_i = \begin{cases} \dfrac{p_i}{\Sigma p_j \text{ for all top-}k} & \text{if } p_i \text{ is top-}k \text{ largest in } \\{p_n | n \in N \\} \\ 0 & \text{otherwise} \\ \end{cases}

"Top-p (Nucleus)"

  • Find smallest NpNN_p \subset N such that ΣiNp pi p\Sigma_{i \in N_p}\ p_i\ \geq p
    • set Np=N_p=\emptyset at first, and add index of p(k)p_{(k)} into NpN_p where p(k)p_{(k)} is the kk-th largest in pnnN\\{p_n | n \in N \\} for k=1,2,...,nk = 1, 2, ..., n, until the equation holds.
Pi={piΣpj for all jNpif iNp0otherwiseP_i = \begin{cases} \dfrac{p_i}{\Sigma p_j \text{ for all }j \in N_p} & \text{if } i \in N_p \\ 0 & \text{otherwise} \\ \end{cases}

Finally, the tags will be chosen randomly while the number \leq "Max number of tags".