Staging / app.py
Vijish's picture
Update app.py
b94709f verified
import gradio as gr
import requests
import base64
from PIL import Image
import io
import time
import os
# Your endpoint URL and token (you might want to use environment variables for these in production)
API_URL = "https://ca80xvp8jmhqanbz.us-east-1.aws.endpoints.huggingface.cloud"
def process_image(input_image, prompt):
# Convert Gradio's image input to base64
if input_image is None:
return None, "Please upload an image"
# Convert PIL Image directly to base64 string
buffer = io.BytesIO()
input_image.save(buffer, format="WEBP")
base64_image = f"data:image/webp;base64,{base64.b64encode(buffer.getvalue()).decode('utf-8')}"
# Prepare headers and data
headers = {
"Authorization": f"Bearer {os.getenv('HF_API_KEY')}",
"Content-Type": "application/json",
"Accept": "application/json"
}
data = {
"inputs": {
"prompt": prompt,
"image": base64_image
}
}
# Make the API request with retry mechanism
max_retries = 5
retry_delay = 60 # seconds
for retry in range(max_retries):
try:
response = requests.post(API_URL, headers=headers, json=data, timeout=300)
if response.status_code == 200:
# Convert the response base64 directly to PIL Image
result = response.json()
image_bytes = base64.b64decode(result["final_image"])
output_image = Image.open(io.BytesIO(image_bytes))
# Return both the image and the parameters used
params_text = "\nParameters used:\n"
for key, value in result["parameters"].items():
params_text += f"{key}: {value}\n"
return output_image, params_text
elif response.status_code == 503:
if retry < max_retries - 1:
time.sleep(retry_delay)
continue
return None, f"Service unavailable after {max_retries} retries"
else:
return None, f"Error: {response.status_code}\n{response.text}"
except requests.exceptions.RequestException as e:
if retry < max_retries - 1:
time.sleep(retry_delay)
continue
return None, f"Request error: {str(e)}"
return None, "Maximum retries reached"
# Create Gradio interface
with gr.Blocks(title="Room Design Diffusion", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# Room Design Diffusion
Upload a room image and provide a prompt describing how you'd like to redesign it.
The AI will generate a new version of your room based on your description.
""")
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Upload Room Image", type="pil")
prompt = gr.Textbox(
label="Describe how you want to redesign the room",
placeholder="Example: A modern living room with a comfortable gray sectional sofa, glass coffee table, minimalist TV stand, and geometric area rug",
lines=3
)
submit_btn = gr.Button("Generate Design", variant="primary")
with gr.Column():
output_image = gr.Image(label="Generated Design")
output_text = gr.Textbox(label="Processing Details", lines=5)
submit_btn.click(
fn=process_image,
inputs=[input_image, prompt],
outputs=[output_image, output_text]
)
gr.Examples(
examples=[
[
os.path.join(os.path.dirname(__file__), "examples/free-photo-of-empty-living-room-with-with-walls.jpeg"),
"A living room featuring a comfortable sofa with neutral cushions, a classic wooden coffee table, a functional TV stand with storage, and a cozy area rug that ties the space together."
],
[
os.path.join(os.path.dirname(__file__), "examples/2.webp"),
"A living room featuring a rugged leather sofa, a rustic wood and metal coffee table, a sturdy industrial-style media stand, and a vintage-inspired rug adding warmth to the space."
],
[
os.path.join(os.path.dirname(__file__), "examples/3.webp"),
"A modern minimalist living room with a sleek sectional sofa, contemporary glass coffee table, floating media console, and geometric pattern area rug."
],
[
os.path.join(os.path.dirname(__file__), "examples/download (36).jpg"),
"A living room featuring a comfortable sofa with neutral cushions, a classic wooden coffee table, a functional TV stand with storage, and a cozy area rug that ties the space together."
],
[
os.path.join(os.path.dirname(__file__), "examples/popular-flooring.jpeg"),
"A living room with a sleek sectional sofa, a minimalist glass coffee table, a contemporary media console, and a geometric rug adding a touch of modern flair."
],
[
os.path.join(os.path.dirname(__file__), "examples/free-photo-of-newly-renovated-empty-bedroom.jpeg"),
"A bedroom featuring a gray upholstered bed with soft bedding, a gold and glass nightstand with a textured lamp, a simple console table with fresh greenery, and a cozy patterned rug underfoot."
]
],
inputs=[input_image, prompt],
)
gr.Markdown("""
### Tips for best results:
- Use clear, detailed prompts describing the desired room style
- Make sure the input image is well-lit and clearly shows the room
- Be patient as generation can take a few minutes
""")
# Launch the app with sharing enabled
demo.launch(share=True)