File size: 5,133 Bytes
c1d5b6a
 
 
7382a79
cd45a7f
bbc544c
 
c1d5b6a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bbc544c
 
3487adc
bbc544c
c1d5b6a
 
 
 
 
 
 
 
c51cdbe
c1d5b6a
 
 
 
 
 
 
 
 
 
7382a79
58bd6cd
 
c1d5b6a
bcc7fa5
 
 
7382a79
bcc7fa5
 
 
cd45a7f
bcc7fa5
 
 
7382a79
c1d5b6a
 
 
 
 
d5fdc80
 
 
0da8e7f
d5fdc80
eb1eb15
d5fdc80
bbc544c
 
c1d5b6a
84fce28
73c49e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60c58a2
798a5ce
60c58a2
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
import gradio as gr
import requests
import base64
from io import BytesIO
from PIL import Image
import random

# Get API key from environment variable
api_key = os.environ.get("NVCF_API_KEY")

if not api_key:
    raise ValueError("Please set the NVCF_API_KEY environment variable.")

# API details
invoke_url = "https://api.nvcf.nvidia.com/v2/nvcf/pexec/functions/89848fb8-549f-41bb-88cb-95d6597044a4"
fetch_url_format = "https://api.nvcf.nvidia.com/v2/nvcf/pexec/status/"
headers = {
    "Authorization": f"Bearer {api_key}",
    "Accept": "application/json",
}

# Function to generate image using the API
def generate_image(prompt, negative_prompt, sampler, seed, guidance_scale, inference_steps):
    # Validate and adjust seed value
    if seed is None or seed <= 0 or seed > 4294967296:
        seed = random.randint(1, 4294967296)
    
    payload = {
        "prompt": prompt,
        "negative_prompt": negative_prompt,
        "sampler": sampler,
        "seed": seed,
        "guidance_scale": guidance_scale,
        "inference_steps": inference_steps
    }
    print(payload)
    session = requests.Session()
    response = session.post(invoke_url, headers=headers, json=payload)

    while response.status_code == 202:
        request_id = response.headers.get("NVCF-REQID")
        fetch_url = fetch_url_format + request_id
        response = session.get(fetch_url, headers=headers)

    response.raise_for_status()
    response_body = response.json()

    # Print the API response for debugging
    print("API Response:", response_body)

    # Decode the base64-encoded image data
    b64_image_data = response_body.get("b64_json")
    if b64_image_data is None:
        return "Error: API response does not contain 'b64_json' key."
    
    image_data = base64.b64decode(b64_image_data)
    
    # Convert the binary data to a PIL Image
    image = Image.open(BytesIO(image_data))
    
    return image

# Create Gradio interface
iface = gr.Interface(
    fn=generate_image,
    inputs=[
        gr.Textbox(label="Prompt", placeholder="Describe the image you want to generate"),
        gr.Textbox(
            label="Negative Prompt", 
            placeholder="What should not be in the image", 
            value="(worst quality, low quality, normal quality, lowres, low details, oversaturated, undersaturated, overexposed, underexposed, grayscale, bw, bad photo, bad photography, bad art:1.4), (watermark, signature, text font, username, error, logo, words, letters, digits, autograph, trademark, name:1.2), (blur, blurry, grainy), morbid, ugly, asymmetrical, mutated malformed, mutilated, poorly lit, bad shadow, draft, cropped, out of frame, cut off, censored, jpeg artifacts, out of focus, glitch, duplicate, (airbrushed, cartoon, anime, semi-realistic, cgi, render, blender, digital art, manga, amateur:1.3), (3D ,3D Game, 3D Game Scene, 3D Character:1.1), (bad hands, bad anatomy, bad body, bad face, bad teeth, bad arms, bad legs, deformities:1.3)"
        ),
        gr.Dropdown(label="Sampler", choices=["DPM", "EulerA", "LMS", "DDIM"], value="DDIM"),
        gr.Number(label="Seed", value=0, step=1),
        gr.Slider(label="Guidance Scale", minimum=1, maximum=9, value=5, step=1),
        gr.Slider(label="Inference Steps", minimum=5, maximum=100, value=35, step=1)
    ],
    outputs=gr.Image(label="Generated Image"),
    description = """
        <div style="text-align: center; font-size: 1.5em; margin-bottom: 20px;">
            <strong>Generate Stunning Images with Stable Diffusion XL</strong>
        </div>
    
        <p>
            This Gradio app harnesses the power of Stable Diffusion XL image generation capabilities to bring your creative visions to life. Using NVIDIA NGC. 
            Simply provide a text prompt describing the image you desire, and let the AI do its magic!
        </p>
    
        <p>
            <strong>How to Use:</strong>
        </p>
    
        <ol>
            <li>Enter a detailed <strong>prompt</strong> describing the image you want to generate.</li>
            <li>Optionally, add a <strong>negative prompt</strong> to specify elements you want to avoid.</li>
            <li>Choose a <strong>sampler</strong> (algorithm) for image generation.</li>
            <li>Set a <strong>seed</strong> for reproducibility (or leave it blank for random results).</li>
            <li>Adjust the <strong>guidance scale</strong> to influence how closely the image follows the prompt.</li>
            <li>Set the <strong>inference steps</strong> to control the level of detail and processing time.</li>
            <li>Click <strong>Generate</strong> and marvel at your creation!
        </ol>
    
        <p>
            <strong>This service is powered by NVIDIA NGC and is completely free to use.</strong>
        </p>
    
        <p>
            <strong>Created by:</strong> @artificialguybr (<a href="https://twitter.com/artificialguybr">Twitter</a>)
        </p>
    
        <p>
            <strong>Explore more:</strong> <a href="https://artificialguy.com">artificialguy.com</a>
        </p>
    """
)

# Launch the Gradio app
iface.launch()