Spaces:
Runtime error
Runtime error
Download app.py from fotographerai/Fai-Fuzer-v0.3: direct link, hf CLI and curl.
- Browser
- Download file 8.24 kB
-
https://huggingface.co/spaces/fotographerai/Fai-Fuzer-v0.3/resolve/c8f3c52d466b38a01b8ff6096a0b6023f11fcf0b/app.py
- Command line
-
hf download hf://spaces/fotographerai/Fai-Fuzer-v0.3@c8f3c52d466b38a01b8ff6096a0b6023f11fcf0b/app.py
-
curl -L -o app.py https://huggingface.co/spaces/fotographerai/Fai-Fuzer-v0.3/resolve/c8f3c52d466b38a01b8ff6096a0b6023f11fcf0b/app.py
8.24 kB
| import os | |
| import math | |
| import gradio as gr | |
| import numpy as np | |
| import requests | |
| import json | |
| import base64 | |
| from PIL import Image | |
| from io import BytesIO | |
| import runpod | |
| from enum import Enum | |
| api_key = os.getenv("FAI_API_KEY") | |
| api = os.getenv("FAI_API") | |
| def image_to_base64(image): | |
| # Open the image file | |
| with image: | |
| # Create a buffer to hold the binary data | |
| buffered = BytesIO() | |
| # Save the image in its original format to the buffer | |
| #print(image.format) | |
| image.save(buffered, format="PNG") | |
| # Get the byte data from the buffer | |
| binary_image_data = buffered.getvalue() | |
| # Encode the binary data to a base64 string | |
| base64_image = base64.b64encode(binary_image_data).decode("utf-8") | |
| return base64_image | |
| def process(data, api, api_key): | |
| runpod.api_key = api_key | |
| input_payload = {"input": data } | |
| try: | |
| endpoint = runpod.Endpoint(api) | |
| run_request = endpoint.run(input_payload) | |
| # Initial check without blocking, useful for quick tasks | |
| status = run_request.status() | |
| print(f"Initial job status: {status}") | |
| if status != "COMPLETED": | |
| # Polling with timeout for long-running tasks | |
| output = run_request.output(timeout=60) | |
| else: | |
| output = run_request.output() | |
| print(f"Job output: {output}") | |
| except Exception as e: | |
| print(f"An error occurred: {e}") | |
| image_data = output['image'] | |
| # Decode the Base64 string | |
| image_bytes = base64.b64decode(image_data) | |
| # Convert binary data to image | |
| image = Image.open(BytesIO(image_bytes)) | |
| return image | |
| def process_generate(fore, prompt, image_width, image_height, intensity, mode, refprompt): | |
| forestr = image_to_base64(fore.convert("RGBA")) | |
| ''' | |
| data = { | |
| "foreground_image64": forestr, | |
| "prompt" : prompt, | |
| "mode" : mode, | |
| "intensity" : float(intensity), | |
| "width" : int(image_width), | |
| "height" : int(image_height), | |
| "refprompt" : refprompt | |
| } | |
| ''' | |
| data = { | |
| "foreground_image64": forestr, | |
| "prompt" : "There is Perfume, nestled on a crystalline cliff of glistening snow, under a celestial night sky adorned with constellations and swirling galaxies, framed by ethereal, blue flames that dance gracefully in the icy air", | |
| "mode" : "full", #refiner, full | |
| "intensity" : 3.0, | |
| "width" : 1000, | |
| "height" : 1000, | |
| "refprompt" : " transparent glass " | |
| } | |
| image = process(data, api, api_key) | |
| return image | |
| class Stage(Enum): | |
| FIRST_STAGE = "first-stage" | |
| SECOND_STAGE = "refiner" | |
| FULL = "full" | |
| css="""#disp_image { | |
| text-align: center; /* Horizontally center the content */ | |
| } | |
| #share-btn-container {padding-left: 0.5rem !important; padding-right: 0.5rem !important; background-color: #000000; justify-content: center; align-items: center; border-radius: 9999px !important; max-width: 13rem; margin-left: auto;} | |
| div#share-btn-container > div {flex-direction: row;background: black;align-items: center} | |
| #share-btn-container:hover {background-color: #060606} | |
| #share-btn {all: initial; color: #ffffff;font-weight: 600; cursor:pointer; font-family: 'IBM Plex Sans', sans-serif; margin-left: 0.5rem !important; padding-top: 0.5rem !important; padding-bottom: 0.5rem !important;right:0;} | |
| #share-btn * {all: unset} | |
| #share-btn-container div:nth-child(-n+2){width: auto !important;min-height: 0px !important;} | |
| #share-btn-container .wrap {display: none !important} | |
| #share-btn-container.hidden {display: none!important} | |
| #duplicate-button { | |
| margin-left: auto; | |
| color: #fff; | |
| background: #1565c0; | |
| } | |
| """ | |
| block = gr.Blocks(css=css, title="## F.ai Fuzer").queue() | |
| with block: | |
| gr.HTML(""" | |
| <center><h1 style="color:#000">Fotographer AI Fuzer</h1></center>""") | |
| gr.HTML(''' | |
| <div> | |
| <a style="display:inline-block; margin-left: .5em" href="https://app.fotographer.ai/home"><img src="https://img.shields.io/badge/2310.15110-f9f7f7?logo=data:image/png;base64,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"></a> | |
| <a style="display:inline-block; margin-left: .5em" href='https://app.fotographer.ai/home'><img src='https://img.shields.io/github/stars/SUDO-AI-3D/zero123plus?style=social' /></a> | |
| Check out our App<a href="https://app.fotographer.ai/home">Fotographer.ai</a>! | |
| </div> | |
| ''') | |
| with gr.Row(): | |
| gr.Markdown("### F.ai Fuzer: Real Composite Photography in 2 minutes!") | |
| with gr.Row(): | |
| fore = gr.Image(image_mode='RGBA', type="pil", label="Foreground Image", height=400) | |
| with gr.Column(): | |
| result_gallery = gr.Image(label='Output') #gr.Gallery(height=400, object_fit='contain', label='Outputs') | |
| with gr.Row(): | |
| prompt = gr.Textbox(label="Prompt") | |
| with gr.Column(): | |
| refprompt = gr.Textbox(label="Refiner Prompt") | |
| with gr.Row(): | |
| mode = gr.Radio(choices=[e.value for e in Stage], | |
| value=Stage.FULL.value, | |
| label="Generation Mode", type='value') | |
| with gr.Column(): | |
| image_width = gr.Slider(label="Image Width", minimum=256, maximum=1500, value=1024, step=64) | |
| image_height = gr.Slider(label="Image Height", minimum=256, maximum=1500, value=1024, step=64) | |
| with gr.Row(): | |
| intensity = gr.Slider(label="Refiner Strength", minimum=1, maximum=7, value=3, step=0.5) | |
| generate_button = gr.Button(value="Generate") | |
| ips = [fore, prompt, image_width, image_height, intensity, mode, refprompt] | |
| generate_button.click(fn=process_generate, inputs=ips, outputs=[result_gallery]) | |
| block.launch() | |