Untitled

 avatar
unknown
python
2 years ago
13 kB
13
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()