Untitled
unknown
python
2 years ago
13 kB
16
Indexable
import os import shutil import time import tempfile import base64 import requests from PIL import Image import openai # Set up the OpenAI API client openai.api_key = "7ot let api key mta3 dirrabek" IMAGE_FOLDER = "seq" PROCESSED_IMAGE_FOLDER = "newcn" from datetime import datetime old_ins = """ You can include only one word from the following words in the generated prompt: realistic, modern, intricate, elegant, highly detailed, digital painting, artstation, concept art, addiction, chains, smooth, sharp focus, illustration, art by ilja repin digital art, trending on artstation, hyperdetailed, matte painting, CGSociety Add these to the generated negative prompt: poorly Rendered face poorly drawn face poor facial details poorly drawn hands poorly rendered hands low resolution Images cut out at the top, left, right, bottom. bad composition mutated body parts blurry image disfigured oversaturated bad anatomy deformed body features """ def generate_prompt(): instruction = """ Generate a new positive and negative artistic and visually descriptive prompt. The prompts should be inspired by the following examples, but should not use these examples directly. Describe the texture and style of the art, always include 30 relevant artist names for that style of art in the positive prompt, and make the prompts 80 words long. example prompts: Positive example 1: cyborg woman| with a visible detailed brain| muscles cable wires| biopunk| cybernetic| cyberpunk| white marble bust| canon m50| 100mm| sharp focus| smooth| hyperrealism| highly detailed| intricate details| carved by michelangelo, H.R. Giger, Hajime Sorayama Negative example 1: cgi| octane| render| digital art| digital painting| concept art| 3d| blurry| fuzzy| disfigured| misshaped| mutant| deformed| bad art| out of frame Positive example 2: surreal landscape| floating islands| dreamy| glowing crystals| cascading waterfalls| vibrant colors| rich foliage| thick mist| mysterious| ethereal| Salvador Dalí, Yerka Jacek, Vladimir Kush Negative example 2: flat colors| dull| boring| monochromatic| low contrast| washed out| uninspired| simplistic| lacking depth| sparse detail Positive example 3: steampunk| mechanical dragon| intricate gears| brass| copper| steam engine| smoke| fire| ornate design| elegant craftsmanship| realistic textures| H.G. Wells, Brian Kesinger, James Ng Negative example 3: plastic look| cheap materials| unrealistic| cartoonish| toy-like| low-quality| poorly executed| lacking authenticity| unconvincing Positive example 4: futuristic cityscape| neon lights| bustling streets| skyscrapers| holographic advertisements| flying cars| advanced technology| reflections| rain-soaked pavement| Syd Mead, Masashi Wakui, Liam Wong Negative example 4: repetitive buildings| poor lighting| empty streets| uninteresting| lack of atmosphere| generic| lifeless| unoriginal Positive example 5: magical forest| ancient trees| glowing mushrooms| enchanted creatures| sparkling lights| lush vegetation| soft mist| whimsical| fairytale atmosphere| Thomas Kinkade, Andy Kehoe, Kinuko Y. Craft Negative example 5: sparse trees| uninteresting flora| bland| unimaginative| lack of detail| unengaging| monotonous| mundane append the following to the negative prompt only after you generate it: EasyNegative poorly Rendered face poorly drawn face poor facial details poorly drawn hands poorly rendered hands low resolution bad face bad eyes poorly drawn eyes ugly eyes Images cut out at the top left, right, bottom. bad composition mutated body parts blurry image disfigured oversaturated bad anatomy deformed body features poorly drawn finger bad drawing bad art cropped Make the generated negative and positive prompts exactly 150 words long, with the words in the generated prompts separated by " | " (with a space before and after the "|" character). The goal is to generate stunning and detailed art to sell online. Respond in the following format: + : words_min_positive_prompt - : words_min_negative_prompt do not give me one from the example prompts. if the generated prompt includes a human body, include words to descripe the perfection of the anatomy the generated positive prompt should be no less than 4000 character long. include descriptions of color, texture and lighting of the art idea in the positive prompt. Include 'in the style of <lora:howllatentDADAP4:1>' in positive prompt. also Include words like: masterpiece, 8k Make the prompts very very detailed, describe every element of the image very very well. put the most important words that you want the viewer of the generated image to focus on between (( )) always only one \n between the postive and negative prompt. """ # Send the request to the OpenAI API response = openai.Completion.create( engine="text-davinci-003", prompt=instruction, temperature=1.2, max_tokens=3097 , top_p=0.9, frequency_penalty=0, presence_penalty=0 ) print(response.choices[0].text.strip()) # Extract and return the generated prompts return response.choices[0].text.strip() generated_prompts = generate_prompt() print(generate_prompt) positive_prompt, negative_prompt = generated_prompts.split('\n') print("\n \n \n \nGenerated Prompt: \n") print(f"Generated positive prompt: {positive_prompt} \n") print(f"Generated negative prompt: {negative_prompt}") # ... (rest of the code remains the same) DEFAULT_PARAMS = { "prompt": positive_prompt.replace("Positive example 1", "").replace("+ :","") , "negative_prompt": negative_prompt.replace("Negative example 1", "").replace("- :","") , "seed": -1, "subseed": -1, "subseed_strength": 0, "batch_size": 1, "n_iter": 1, "steps": 40, "cfg_scale": 7, "width": 800, "denoising_strength": 0.45, "height": 600, "restore_faces": True, "eta": 0, "controlnet_enabled": False, "sampler_index": "DPM++ SDE Karras", "guessmode" : "true", # "lowvram" : "true", # "controlnet_module": 'openpose', #"controlnet_model": 'controlnetPreTrained_openposeV10 [9ca67cc5]', "controlnet_guidance": 0, "model" : "howlsMovingCastleInterior_v3", } def mix_images(img1, img2, alpha=0.5): img1 = Image.open(img1) img2 = Image.open(img2) img1 = img1.resize(img2.size, Image.ANTIALIAS) mixed_img = Image.blend(img1, img2, alpha) mixed_img_file = tempfile.NamedTemporaryFile(suffix=".png", delete=False) mixed_img.save(mixed_img_file.name, "PNG") return mixed_img_file.name def process_images(): image_files = os.listdir(os.path.abspath(IMAGE_FOLDER)) image_files = [file for file in image_files if file.lower().endswith(('.png', '.jpg', '.jpeg'))] # prompt_five_words = '-'.join(DEFAULT_PARAMS['prompt'].split()[:1]).replace(' ', '-') folder_name = f"{DEFAULT_PARAMS['model']}-{DEFAULT_PARAMS['denoising_strength']}-{DEFAULT_PARAMS['cfg_scale']}-{datetime.now().strftime('%Y%m%d-%H%M%S')}" global PROCESSED_IMAGE_FOLDER PROCESSED_IMAGE_FOLDER = os.path.join(os.getcwd(), folder_name) os.makedirs(PROCESSED_IMAGE_FOLDER, exist_ok=True) if len(image_files) > 0: image_path = os.path.join(os.path.abspath(IMAGE_FOLDER), image_files[0]) last_output_file = process_image(image_path) if last_output_file: # Check if the output file path is not False for image_file in image_files[1:]: image_path = os.path.join(os.path.abspath(IMAGE_FOLDER), image_file) mixed_image = mix_images(image_path, last_output_file) new_output_file = process_image(mixed_image) if new_output_file: # Update last_output_file only if the new output file is valid last_output_file = new_output_file def process_image(image_path): timestamp = int(time.time()) before_output_filename_prefix = f"{timestamp}-1-before" after_output_filename_prefix = f"{timestamp}-2-after" # Load the image try: img_file = open(image_path, 'rb') b64img = base64.b64encode(img_file.read()).decode() img_file.seek(0) # Reset file pointer after reading except: return print(f"Couldn't open the image file: {image_path}") # Save the before image save_before_image(image_path, before_output_filename_prefix) # Prepare data for API params = DEFAULT_PARAMS params["controlnet_input_image"] = [b64img] params["init_images"] = [b64img] # Send to API output_file = actually_send_to_api(params, after_output_filename_prefix) # If we got a successful image created, save it to the processed folder if output_file: new_output_file = None # Save the after image new_output_file = save_after_image( after_output_filename_prefix, output_file) return new_output_file # Return the output file path instead of True else: return False def actually_send_to_api(params, filename_prefix): # create headers headers = { "User-Agent": "Yakdhane/", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", } # prepare server url server_url = "http://localhost:9999" + "/controlnet/txt2img" # send API request try: response = requests.post( server_url, json=params, headers=headers, timeout=1000) except requests.exceptions.ConnectionError: return print(f"The Automatic1111 server couldn't be found.") except requests.exceptions.MissingSchema: return print(f"The url for your Automatic1111 server is invalid.") except requests.exceptions.ReadTimeout: return print("The Automatic1111 server timed out.") # Print HTTP request and response details print(f"HTTP Request URL: {response.request.url}") print(f"HTTP Request Method: {response.request.method}") print(f"HTTP Request Headers: {response.request.headers}") print(f"HTTP Request Body: {response.request.body}") print(f"HTTP Response Status Code: {response.status_code}") print(f"HTTP Response JSON: {response.json()}") # handle the response if response.status_code == 200: return handle_api_success(response, filename_prefix) else: return handle_api_error(response) def handle_api_success(response, filename_prefix): try: response_obj = response.json() base64_img = response_obj["images"][0] except: print("Automatic1111 response content: ") print(response.content) return print("Received an unexpected response from the Automatic1111 server.") # create a temp file try: output_file = create_temp_file(filename_prefix + "-") except: return print("Couldn't create a temp file to save image.") # decode base64 image try: img_binary = base64.b64decode( base64_img.replace("data:image/png;base64,", "")) except: return print("Couldn't decode base64 image.") # save the image to the temp file try: with open(output_file, 'wb') as file: file.write(img_binary) except: return print("Couldn't write to temp file.") # return the temp file return output_file def handle_api_error(response): if response.status_code == 404: import json try: response_obj = response.json() if response_obj.get('detail') and response_obj['detail'] == "Not Found": return print("It looks like the Automatic1111 server is running, but it's not in API mode.") elif response_obj.get('detail') and response_obj['detail'] == "Sampler not found": return print("The sampler you selected is not available.") else: return print(f"An error occurred in the Automatic1111 server. Full server response: {json.dumps(response_obj)}") except: return print("It looks like the Automatic1111 server is running, but it's not in API mode.") else: return print("An error occurred in the Automatic1111 server.") def create_temp_file(prefix, suffix=".png"): return tempfile.NamedTemporaryFile(prefix=prefix, suffix=suffix).name def save_before_image(image_path, filename_prefix): pass def save_after_image(filename_prefix, img_file): filename = f"{filename_prefix}.png" full_path_and_filename = os.path.join(os.path.abspath( PROCESSED_IMAGE_FOLDER), filename) try: copy_file(img_file, full_path_and_filename) return full_path_and_filename except: return print(f"Couldn't save 'after' image to {full_path_and_filename}") def copy_file(src, dest): shutil.copy2(src, dest) # Call process_images to process the sequence of images process_images()
Editor is loading...