andresgtn's picture
Update app.py
4e9944c
raw
history blame
3.37 kB
from diffusers import StableDiffusionPipeline
import gradio as gr
import requests
import base64
from PIL import Image, PngImagePlugin
from io import BytesIO
import torch
# required for stable difussion
auth_token = os.environ.get("auth_token") #in secret space
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=auth_token)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
pipe.to(device)
def encode_pil_to_base64(pil_image):
''' From: https://github.com/gradio-app/gradio/blob/main/gradio/processing_utils.py'''
with BytesIO() as output_bytes:
# Copy any text-only metadata
use_metadata = False
metadata = PngImagePlugin.PngInfo()
for key, value in pil_image.info.items():
if isinstance(key, str) and isinstance(value, str):
metadata.add_text(key, value)
use_metadata = True
pil_image.save(
output_bytes, "PNG", pnginfo=(metadata if use_metadata else None)
)
bytes_data = output_bytes.getvalue()
base64_str = str(base64.b64encode(bytes_data), "utf-8")
return "data:image/png;base64," + base64_str
def decode_base64_to_image(encoding):
''' From: https://github.com/gradio-app/gradio/blob/main/gradio/processing_utils.py'''
content = encoding.split(";")[1]
image_encoded = content.split(",")[1]
return Image.open(BytesIO(base64.b64decode(image_encoded)))
def improve_image(img, scale=2):
''' Improves an input image using GFP-GAN
Inputs
img (PIL): image to improve
scale (int): scale factor for new image
Output
Improved image. If the request to GFPGAN is unsuccesful, it returns
a black image.
'''
url = "https://hf.space/embed/NotFungibleIO/GFPGAN/+/api/predict"
request_objt = {"data":[encode_pil_to_base64(img),'v1.3', scale]}
try:
imp_img = decode_base64_to_image(requests.post(url, json=request_objt).json()['data'][0])
except AttributeError:
return Image.new('RGB', size=(512, 512))
return imp_img
def generate(celebrity, movie, guidance, improve_flag, scale): # add scale as var
prompt = f"A movie poster of {celebrity} in {movie}."
image = pipe(prompt, guidance=guidance).images[0]
if improve_flag:
image = improve_image(image, scale=scale)
return image
movie_options = ["James Bond", "Snatch", "Saving Private Ryan", "Scarface", "Avatar", "Top Gun"]
title = "Movie Poster Celebrity Swap"
description = "Write the name of a celebrity, and pick a movie from the dropdown menu.\
It will generate a new movie poster (inspired by your chosen movie)\
with the chosen celebrity in it. See below for explanation of the\
input variables."
article= "Inputs explained: \n Guidance: the lower, the more random the output\
image. Improve and scale: if selected, the image will be refined\
using GFP-GAN (google it), and scaled (if scale is >1)."
demo = gr.Interface(
fn=generate,
inputs=[gr.Textbox(value="Daniel Craig"),
gr.Dropdown(movie_options, value="Saving Private Ryan"),
gr.Slider(1, 20, value=7.5, step=0.5),
gr.Checkbox(label="Improve and scale? (extra time)"),
gr.Slider(1, 3, value=1, step=0.5)
],
outputs='image',
title=title,
description=description,
article=article
)
demo.launch()