File size: 3,706 Bytes
33c27ec
 
 
 
 
9184aae
30b12a2
 
9184aae
 
 
 
33c27ec
9184aae
 
 
 
 
33c27ec
9184aae
 
 
 
 
 
 
 
 
 
88c3a2a
7d9848b
 
 
 
 
 
 
 
 
 
 
9184aae
30b12a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9184aae
30b12a2
33c27ec
9184aae
 
 
 
 
 
 
 
 
 
 
 
 
33c27ec
 
9184aae
 
 
 
 
 
 
 
 
7d9848b
 
 
9184aae
7d9848b
9184aae
 
 
 
 
33c27ec
 
88c3a2a
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
import streamlit as st
import os
import requests
from PIL import Image
from io import BytesIO
import replicate
from stability_sdk import client
import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation

# Configure your API keys here
CLIPDROP_API_KEY = '1143a102dbe21628248d4bb992b391a49dc058c584181ea72e17c2ccd49be9ca69ccf4a2b97fc82c89ff1029578abbea'
STABLE_DIFFUSION_API_KEY = 'sk-GBmsWR78MmCSAWGkkC1CFgWgE6GPgV00pNLJlxlyZWyT3QQO'

# Set up environment variable for Replicate API Token
os.environ['REPLICATE_API_TOKEN'] = 'r8_3V5WKOBwbbuL0DQGMliP0972IAVIBo62Lmi8I'  # Replace with your actual API token

def generate_image_from_text(prompt):
    r = requests.post('https://clipdrop-api.co/text-to-image/v1',
        files = {
            'prompt': (None, prompt, 'text/plain')
        },
        headers = { 'x-api-key': CLIPDROP_API_KEY }
    )
    
    if r.ok:
        return r.content
    else:
        r.raise_for_status()

def resize_image(image_bytes, max_size=(640, 640)):
    # Open the image from bytes
    img = Image.open(BytesIO(image_bytes))
    
    # Resize the image
    img.thumbnail(max_size)

    # Save it back to bytes
    buffer = BytesIO()
    img.save(buffer, format="PNG")
    return buffer.getvalue()

def upscale_image_stable_diffusion(image_bytes):
    # Set up environment variables
    os.environ['STABILITY_HOST'] = 'grpc.stability.ai:443'
    os.environ['STABILITY_KEY'] = STABLE_DIFFUSION_API_KEY

    # Set up the connection to the API
    stability_api = client.StabilityInference(
        key=os.environ['STABILITY_KEY'],
        upscale_engine="stable-diffusion-x4-latent-upscaler",
        verbose=True,
    )

    # Open the image from bytes
    img = Image.open(BytesIO(image_bytes))

    # Call the upscale API
    answers = stability_api.upscale(init_image=img)

    # Process the response
    upscaled_img_bytes = None
    for resp in answers:
        for artifact in resp.artifacts:
            if artifact.type == generation.ARTIFACT_IMAGE:
                upscaled_img = Image.open(BytesIO(artifact.binary))
                upscaled_img_bytes = BytesIO()
                upscaled_img.save(upscaled_img_bytes, format='PNG')
                upscaled_img_bytes = upscaled_img_bytes.getvalue()
    
    return upscaled_img_bytes

def further_upscale_image(image_bytes):
    # Run the GFPGAN model
    output = replicate.run(
        "tencentarc/gfpgan:9283608cc6b7be6b65a8e44983db012355fde4132009bf99d976b2f0896856a3",
        input={"img": BytesIO(image_bytes), "version": "v1.4", "scale": 16}
    )
    
    # The output is a URI of the processed image
    # We will retrieve the image data and save it
    response = requests.get(output)
    img = Image.open(BytesIO(response.content))
    img.save("upscaled.png")  # Save the upscaled image
    return img

def main():
    st.title("Image Generation and Upscaling")
    st.write("Enter a text prompt and an image will be generated and upscaled.")

    prompt = st.text_input("Enter a textual prompt to generate an image...")
    
    if prompt:
        st.success("Generating image from text prompt...")
        image_bytes = generate_image_from_text(prompt)
        
        st.success("Resizing image...")
        resized_image_bytes = resize_image(image_bytes)
        
        st.success("Upscaling image with stable-diffusion-x4-latent-upscaler...")
        upscaled_image_bytes = upscale_image_stable_diffusion(resized_image_bytes)
        
        st.success("Further upscaling image with GFPGAN...")
        img = further_upscale_image(upscaled_image_bytes)
        
        st.image(img, caption='Upscaled Image', use_column_width=True)

if __name__ == "__main__":
    main()