From d93d19dc7aafa6971c4d6a75774de1a3df654466 Mon Sep 17 00:00:00 2001 From: AIrjen Date: Mon, 1 Jan 2024 08:11:42 +0100 Subject: [PATCH] decent version of auto negative --- OneButtonPromptNodes.py | 56 +++++++- build_dynamic_prompt.py | 42 +++++- csv_reader.py | 17 +++ csvfiles/special_lists/negativewords.csv | 174 ++++++++++++++++++++--- negativeprompttester.py | 8 +- 5 files changed, 270 insertions(+), 27 deletions(-) diff --git a/OneButtonPromptNodes.py b/OneButtonPromptNodes.py index c30b5d1..d63d1c5 100644 --- a/OneButtonPromptNodes.py +++ b/OneButtonPromptNodes.py @@ -435,12 +435,66 @@ class SavePromptToFile: return ("done") +class AutoNegativePrompt: + + + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + + return { + "required": { + "postive_prompt": ("STRING", {"default": '', "multiline": True}), + }, + "optional": { + "insanitylevel": ("INT", { + "default": 0, + "min": 0, #Minimum value + "max": 10, #Maximum value + "step": 1 #Slider's step + }), + "base_negative": ("STRING", { + "multiline": True, #True if you want the field to look like the one on the ClipTextEncode node + "default": "text, watermark" + }), + "enhancenegative": ("INT", { + "default": 1, + "min": 0, #Minimum value + "max": 1, #Maximum value + "step": 1, #Slider's step + }), + + "seed": ("INT", {"default": 0, "min": 0, "max": 0xFFFFFFFFFFFFFFFF}), + }, + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("negative_prompt",) + + FUNCTION = "Comfy_OBP_AutoNegativePrompt" + + #OUTPUT_NODE = False + + CATEGORY = "OneButtonPrompt" + + def Comfy_OBP_AutoNegativePrompt(self, postive_prompt, insanitylevel, enhancenegative,base_negative, seed): + generatedprompt = build_dynamic_negative(postive_prompt, insanitylevel, enhancenegative, base_negative) + + print("Generated negative prompt: " + generatedprompt) + + return (generatedprompt,) + + + # A dictionary that contains all nodes you want to export with their names # NOTE: names should be globally unique NODE_CLASS_MAPPINGS = { "OneButtonPrompt": OneButtonPrompt, "CreatePromptVariant": CreatePromptVariant, - "SavePromptToFile": SavePromptToFile + "SavePromptToFile": SavePromptToFile, + "AutoNegativePrompt": AutoNegativePrompt, } # A dictionary that contains the friendly/humanly readable titles for the nodes diff --git a/build_dynamic_prompt.py b/build_dynamic_prompt.py index 5c80676..36c0a5a 100644 --- a/build_dynamic_prompt.py +++ b/build_dynamic_prompt.py @@ -3686,7 +3686,7 @@ def replacewildcard(completeprompt, insanitylevel, wildcard,listname, activatehy return completeprompt -def build_dynamic_negative(postive_prompt = "", insanitylevel = 5): +def build_dynamic_negative(positive_prompt = "", insanitylevel = 0, enhance = False, existing_negative_prompt = ""): negative_primer = [] @@ -3697,16 +3697,38 @@ def build_dynamic_negative(postive_prompt = "", insanitylevel = 5): # the negative words to put in the negative prompt negative_primer, negative_result = load_negative_list() - allwords = split_prompt_to_words(postive_prompt) + # do a trick for artists, replace with their tags instead + artistlist, categorylist = load_all_artist_and_category() + # lower them + artist_names = [artist.strip().lower() for artist in artistlist] + + # note, should we find a trick for some shorthands of artists?? + + for artist_name, category in zip(artist_names, categorylist): + positive_prompt = positive_prompt.lower().replace(artist_name, category) + + + allwords = split_prompt_to_words(positive_prompt) + + + #lower all! for word in allwords: - if(word in negative_primer): - index_of_word = negative_primer.index(word) + if(word.lower() in negative_primer): + index_of_word = negative_primer.index(word.lower()) all_negative_words_list.append(negative_result[index_of_word]) all_negative_words = ", ".join(all_negative_words_list) all_negative_words_list = all_negative_words.split(",") all_negative_words_list = [elem.strip().lower() for elem in all_negative_words_list] + + + + + + if enhance == True: + enhancelist = ["worst quality", "low quality", "normal quality", "lowres", "low details", "oversaturated", "undersaturated", "overexposed", "underexposed", "grayscale", "bw", "bad photo", "bad photography", "bad art", "watermark", "signature", "text font", "username", "error", "logo", "words", "letters", "digits", "autograph", "trademark", "name", "blur", "blurry", "grainy", "ugly", "asymmetrical", "poorly lit", "bad shadow", "draft", "cropped", "out of frame", "cut off", "censored", "jpeg artifacts", "out of focus", "glitch", "duplicate"] + all_negative_words_list += enhancelist # new lets remove some based on the reverse insanitylevel @@ -3716,6 +3738,10 @@ def build_dynamic_negative(postive_prompt = "", insanitylevel = 5): if(random.randint(1, 100) 2): - counttotal = int(count/2) + #counttotal = int(count/2) + counttotal = count if(counttotal > 3): counttotal = 3 unique_words.append(f"({word}:1.{counttotal})") @@ -3738,6 +3765,8 @@ def build_dynamic_negative(postive_prompt = "", insanitylevel = 5): negative_result = ", ".join(unique_words) + negative_result += ", " + existing_negative_prompt + return negative_result def replace_match(match): @@ -3943,6 +3972,9 @@ def parse_custom_functions(completeprompt, insanitylevel = 5): def split_prompt_to_words(text): # first get all the words + # Use a regular expression to replace non-alphabetic characters with spaces + text = re.sub(r'[^a-zA-Z,-]', ' ', text) + # Split the string by commas and spaces words = re.split(r'[,\s]+', text) # Remove leading/trailing whitespaces from each word diff --git a/csv_reader.py b/csv_reader.py index e3466b8..5438880 100644 --- a/csv_reader.py +++ b/csv_reader.py @@ -176,4 +176,21 @@ def load_negative_list(): return primerlist, negativelist +def load_all_artist_and_category(): + artistlist = [] + categorylist = [] + script_dir = os.path.dirname(os.path.abspath(__file__)) + + full_path_default_artist_file = os.path.join(script_dir, "./csvfiles/" ) + artist_file = full_path_default_artist_file + 'artists_and_category.csv' + + with open(artist_file, "r", newline="",encoding="utf8") as file: + reader = csv.DictReader(file, delimiter=",") + artistlist = [row["Artist"] for row in reader] + with open(artist_file, "r", newline="",encoding="utf8") as file: + reader = csv.DictReader(file, delimiter=",") + categorylist = [row["Tags"] for row in reader] + + return artistlist, categorylist + \ No newline at end of file diff --git a/csvfiles/special_lists/negativewords.csv b/csvfiles/special_lists/negativewords.csv index 950d4dc..8bb50ed 100644 --- a/csvfiles/special_lists/negativewords.csv +++ b/csvfiles/special_lists/negativewords.csv @@ -3,40 +3,73 @@ photo;painting,abstract,camera,anime,cartoon,sketch,3d,render,illustration photograph;painting,abstract,camera,anime,cartoon,sketch,3d,render,illustration photographic;painting,abstract,camera,anime,cartoon,sketch,3d,render,illustration cinematic;painting,surrealism,camera,anime,cartoon,abstract,illustration +cinema;painting,surrealism,camera,anime,cartoon,abstract,illustration +cinestill;painting,surrealism,camera,anime,cartoon,abstract,illustration +movie still;painting,surrealism,camera,anime,cartoon,abstract,illustration film grain;painting,surrealism,camera,anime,cartoon,abstract,illustration +stylized;photorealism sharp;bokeh,blurry,blur +focus;bokeh,blurry,blur +focussed;bokeh,blurry,blur abstract;photograph, realism, photorealism,plain, simple, monochrome +cubism;photograph, realism, photorealism,plain, simple expressionism;photograph, photorealism, low contrast -manga;photograph, realism, photorealism, worst quality, low quality, western -anime;photograph, realism, photorealism, worst quality, low quality, western +manga;photograph, realism, photorealism, worst quality, low quality, western cartoon +anime;photograph, realism, photorealism, worst quality, low quality, western cartoon +cartoon;photograph, realism, photorealism, worst quality, low quality, manga +melanin;photograph, realism, photorealism +children's illustration;photograph, realism, photorealism, worst quality, low quality, nsfw, ugly architecture;painting, illustration 3D;photograph, realism, photorealism, low contrast, low poly +pixar;photograph, realism, photorealism, low contrast, low poly +octane;photograph, realism, photorealism, low contrast, low poly +unreal engine;photograph, realism, photorealism, low contrast, low poly render;photograph, realism, photorealism, low contrast, low poly -kawaii;gothic, dark, moody, monochromatic, ugly, western -adorable;gothic, dark, moody, monochromatic, ugly -cute;gothic, dark, moody, monochromatic, ugly +kawaii;gothic, dark, moody, monochromatic, ugly, gritty, western cartoon +chibi;gothic, dark, moody, monochromatic, ugly, gritty, western cartoon +adorable;gothic, dark, moody, monochromatic, ugly, gritty +cute;gothic, dark, moody, monochromatic, ugly, gritty +cutecore;gothic, dark, moody, monochromatic, ugly, gritty art deco;low contrast, photorealism, modernist, minimalist art nouveau;low contrast, industrial, mechanical, photorealism, modernist, minimalist renaissance;low contrast, photorealism, modernist, minimalist +romanticism;low contrast, photorealism, modernist, minimalist, moody, dark baroque;low contrast, photorealism, modernist, minimalist +rococo;low contrast, photorealism, modernist, minimalist caricature;realism dark fantasy;bright, sunny, light, vibrant, colorful dark;bright, sunny, light, vibrant, colorful +colorless;vibrant, colorful +one color;vibrant, colorful darkness;bright, sunny, light, vibrant, colorful moody;bright, sunny, light, vibrant, colorful +sad;happy, bright +happy;sad, dark, moody +smile;sad, dark, moody +smiling;sad, dark, moody goth;bright, sunny, light, vibrant, colorful gothic;bright, sunny, light, vibrant, colorful macabre;bright, sunny, light, vibrant, colorful +desolate;bright, sunny, light, vibrant, colorful, people grim;bright, sunny, light, vibrant, colorful faded;bright, sunny, light, vibrant, colorful noir;bright, sunny, light, vibrant, colorful -horror;bright, sunny, light, vibrant, colorful +horror;bright, sunny, light, vibrant, colorful, beautiful, cute +monster;beautiful, cute, adorable +creepy;beautiful, cute, adorable +luminism;monochromatic, washed out fortnite;photograph, realism, photorealism ink;bright, sunny, light, vibrant, colorful light;dark, moody, night, monochromatic, washed out happy;dark, moody, night, monochromatic, washed out joy;dark, moody, night, monochromatic, washed out +joyful;dark, moody, night, monochromatic, washed out vibrant;dark, moody, night, monochromatic, washed out +colorful;dark, moody, night, monochromatic, washed out +colors;dark, moody, night, monochromatic, washed out +colours;dark, moody, night, monochromatic, washed out +colourful;dark, moody, night, monochromatic, washed out +vivid;dark, moody, night, monochromatic, washed out neon;moody, monochromatic, washed out monochrome;colorful, vibrant drawing;photograph, photorealism @@ -49,62 +82,169 @@ surrealism;photograph, realism, photorealism surrealist;photograph, realism, photorealism suprematism;realism watercolor;photograph, photorealism +water color;photograph, photorealism watercolour;photograph, photorealism -whymsical;drab, boring, moody +whymsical;drab, boring, moody, serious, realism +whimsical;drab, boring, moody, serious, realism masterpiece;cropped, worst quality, low quality, poorly drawn, low resolution quality;cropped, worst quality, low quality, poorly drawn, low resolution +artstation;cropped, worst quality, low quality, poorly drawn, low resolution +pixabay;cropped, worst quality, low quality, poorly drawn, low resolution +behance;cropped, worst quality, low quality, poorly drawn, low resolution sketch;photograph, realism, photorealism artistic;insignificant, flawed, made by bad artist, low quality, low resolution -dynamic;still life,static, still, slow, boring, standing still, calm, peaceful +dynamic;still life, static, still, slow, boring, standing still, calm, peaceful +still life;dynamic, action +calm;dynamic, action +boring;dynamic, action undead;alive painting;drawing,sketch,frame,watermark +ukiyo-e;drawing,sketch,frame,watermark comic;photograph, realism, photorealism,frame,watermark +comics;photograph, realism, photorealism,frame,watermark +graphic design;photograph, realism, photorealism,frame,watermark illustration;photograph, realism, photorealism,frame,watermark clay;photograph, realism, photorealism,sloppy, messy digital;photograph, photorealism fantasy;photograph, realism, photorealism, modern, ordinary, mundane +concept;photograph, realism, photorealism, modern, ordinary, mundane fairy tale;photograph, realism, photorealism, modern, ordinary, mundane +fairy-tale;photograph, realism, photorealism, modern, ordinary, mundane magical realism;modern, ordinary, mundane +storybook realism;modern, ordinary, mundane magical;modern, ordinary, mundane magic;modern, ordinary, mundane +ethereal;modern, ordinary, mundane isometric;photograph, realism, photorealism line art;painting,abstract,camera,anime,cartoon,sketch,3d,render pixel;photograph, realism, photorealism, painting,abstract,camera,anime,cartoon,sketch,3d,render pixel-art;photograph, realism, photorealism, painting,abstract,camera,anime,cartoon,sketch,3d,render professional;amateurish, sloppy, unattractive +professionally;amateurish, sloppy, unattractive advertisement;amateurish, sloppy, unattractive advertising;amateurish, sloppy, unattractive commercial;amateurish, sloppy, unattractive corporate;amateurish, sloppy, unattractive -fashion;amateurish, sloppy, unattractive, baggy, cheap, trash -luxury;amateurish, sloppy, unattractive, baggy, cheap, trash +fashion;amateurish, sloppy, unattractive, baggy, cheap, trashy clothing +fauvism;amateurish, sloppy, unattractive, baggy, cheap, trashy clothing +luxury;amateurish, sloppy, unattractive, baggy, cheap, trashy clothing hyperrealistic;simple, plain, abstract, unrealistic, impressionistic, low resolution,surrealism -hyperrealism;simple, plain, abstract, unrealistic, impressionistic, low resolution,surrealism +realistic;simple, plain, abstract, unrealistic, impressionistic, low resolution,surrealism +figurativism;simple, plain, abstract, unrealistic, impressionistic, low resolution, surrealism, symbolism +hyperrealism;simple, plain, abstract, unrealistic, impressionistic, low resolution, surrealism +realism;simple, plain, abstract, unrealistic, impressionistic, low resolution, surrealism +real;simple, plain, abstract, unrealistic, impressionistic, low resolution, surrealism pointillism;line drawing, smooth shading, large color fields, simplistic psychedelic;photograph, realism, photorealism,plain, simple, monochrome biomechanical;natural, rustic, primitive, organic, simplistic futuristic;natural, rustic, primitive, organic, simplistic cybernetic;natural, rustic, primitive, organic, simplistic cyberpunk;natural, rustic, primitive, organic, simplistic +robot;natural, rustic, primitive, organic, simplistic +robotic;natural, rustic, primitive, organic, simplistic technology;natural, rustic, primitive, organic, simplistic +geometric;natural, rustic, primitive, organic, simplistic +angular;natural, rustic, primitive, organic, simplistic +bauhaus;natural, rustic, primitive, organic, simplistic +nature;industrial, mechanical, geometric patterns +nature-inspired;industrial, mechanical, geometric patterns +natural;industrial, mechanical, geometric patterns +floral;industrial, mechanical, geometric patterns +flora;industrial, mechanical, geometric patterns +fauna;industrial, mechanical, geometric patterns +flower;industrial, mechanical, geometric patterns +flowers;industrial, mechanical, geometric patterns +blossoms;industrial, mechanical, geometric patterns +organic;industrial, mechanical, geometric patterns +vegetation;industrial, mechanical, geometric patterns +forest;industrial, mechanical, geometric patterns +trees;industrial, mechanical, geometric patterns +foliage;industrial, mechanical, geometric patterns +overgrown;industrial, mechanical, geometric patterns retro;modern vintage;modern -modern;retro, vintage -sci-fi;historical -sci fi;historical -scifi;historical -science fiction;historical +primitivism;modern, ornate, complicated, highly detailed +primitive;modern, ornate, complicated, highly detailed +modern;retro, vintage, traditional +sci-fi;historical, traditional +sci fi;historical, traditional +scifi;historical, traditional +science fiction;historical, traditional game art;photograph, photorealism, low contrast dream;ordinary, mundane +dreamlike;ordinary, mundane dreamy;ordinary, mundane minimalist;ornate, complicated, highly detailed, cluttered, disordered, messy, noisy, maximalism +simple;ornate, complicated, highly detailed, cluttered, disordered, messy, noisy, maximalism +simplistic;ornate, complicated, highly detailed, cluttered, disordered, messy, noisy, maximalism +clean;cluttered, disordered, messy, noisy minimalism;ornate, complicated, highly detailed, cluttered, disordered, messy, noisy, maximalism detailed;simplistic,minimalism, plain, simple +overdetailed;simplistic,minimalism, plain, simple +details;simplistic,minimalism, plain, simple +complex;simplistic,minimalism, plain, simple +intricate;simplistic,minimalism, plain, simple papercut;3D, high detail, painting, drawing, photo paper;3D, high detail, painting, drawing, photo kirigami;3D, high detail, painting, drawing, photo alien;earthly, mundane, common, realistic, simple +otherworldly;earthly, mundane, common, realistic, simple winter;summer summer;winter +spring;autumn +autumn;spring +fall;spring industrial;organic -bokeh;sharp,focus \ No newline at end of file +bokeh;sharp,focus +depth of field;sharp,focus +dof;sharp,focus +beautiful;ugly, gritty +gorgeous;ugly, gritty +beauty;ugly, gritty +beautifully;ugly, gritty +aestheticism;ugly, gritty, asymetrical, low contrast +aesthetic;ugly, gritty, asymetrical, low contrast +ugly;beautiful, cute +gritty;beautiful, cute +visual novel;photograph, photorealism, low contrast +landscape;portrait,people +cloudscape;portrait,people +streetscape;portrait +portrait;full body shot +close up;full body shot +closeup;full body shot +close-up;full body shot +body shot;portrait +shadow;brightly lit +shadows;brightly lit +messy;clean, simple +scene;lonesome +cityscape;portrait +seascape;portrait,people +character;portrait +high contrast;low contrast, monochromatic +monochromatic;light, vibrant, colorful +monochrome;light, vibrant, colorful +street art;portrait +symbolism;figurativism +low contrast;high contrast +desaturated;vibrant, colorful +saturated;dark, moody, monochromatic +oversaturated;dark, moody, monochromatic +dramatic;plain, well lit, brightly lit +emotions;emotionless, plain, boring +emotinal;emotionless, plain, boring +feeling;emotionless, plain, boring +expressing;emotionless, plain, boring +expressive;emotionless, plain, boring +emotive;emotionless, plain, boring +casual;corporate +traditional;modern, contemporary +formal;casual +candle light;brightly lit +feminine;masculine +masculine;feminine +product photo;cluttered background +product shot;cluttered background +white background;cluttered background +plain background;cluttered background \ No newline at end of file diff --git a/negativeprompttester.py b/negativeprompttester.py index 13abdf7..75e31b2 100644 --- a/negativeprompttester.py +++ b/negativeprompttester.py @@ -10,7 +10,7 @@ from build_dynamic_prompt import * -def generateprompts(amount = 1,positive_prompt = "",insanitylevel="5"): +def generateprompts(amount = 1,positive_prompt = "",insanitylevel="0",enhance=False,existing_negative_prompt=""): loops = int(amount) # amount of images to generate steps = 0 @@ -19,8 +19,8 @@ def generateprompts(amount = 1,positive_prompt = "",insanitylevel="5"): # build prompt if positive_prompt == "": positive_prompt = build_dynamic_prompt() - result = build_dynamic_negative(postive_prompt=positive_prompt, insanitylevel=insanitylevel) - print(result) + result = build_dynamic_negative(positive_prompt=positive_prompt, insanitylevel=insanitylevel,enhance=enhance, existing_negative_prompt=existing_negative_prompt) + print("negative prompt: " + result) print("") print("loop " + str(steps)) print("") @@ -32,4 +32,4 @@ def generateprompts(amount = 1,positive_prompt = "",insanitylevel="5"): print("") print("All done!") -generateprompts(1,"",1) \ No newline at end of file +generateprompts(1,"",1,False,"") \ No newline at end of file