Dbmaxwell's picture
Switch Studio10 to Qwen multi-angle generation
0ac7455 verified
Raw
History Blame Contribute Delete
2.51 kB
from __future__ import annotations
import os
import secrets
import gradio as gr
from model_runtime import predict_mask
from multiview_runtime import generate_studio_photos, save_studio_outputs
from studio_pipeline import isolate_product, prepare_input
def create_studio_set(uploaded_image):
try:
image = prepare_input(uploaded_image)
mask = predict_mask(image)
product = isolate_product(image, mask)
results = generate_studio_photos(product, secrets.randbelow(2**31 - 1))
files, archive = save_studio_outputs(results)
return [(photo, title) for title, photo in results], files, archive, "Ready"
except Exception as exc:
raise gr.Error(f"Generation failed: {exc}") from exc
CSS = """
.gradio-container { max-width: 1120px !important; margin: 0 auto !important; }
#hero { text-align: center; padding: 34px 8px 14px; }
#hero h1 { font-size: clamp(2.5rem, 6vw, 4.8rem); letter-spacing: -.06em; margin-bottom: 4px; }
#hero p { color: #64748b; font-size: 1.15rem; }
.card { border: 1px solid #e2e8f0 !important; border-radius: 22px !important; box-shadow: 0 14px 40px rgba(15,23,42,.06); }
#generate { min-height: 58px; font-weight: 800; }
#status { text-align: center; color: #64748b; font-size: .9rem; }
"""
with gr.Blocks(css=CSS, title="Studio10") as demo:
gr.Markdown("# Studio10\nFrom a casual photo to studio shots.", elem_id="hero")
source = gr.Image(
label="Upload a product photo",
type="pil",
image_mode=None,
sources=["upload", "clipboard"],
height=500,
elem_classes="card",
)
generate = gr.Button("Generate 10 studio shots", variant="primary", elem_id="generate")
status = gr.Markdown("", elem_id="status")
gallery = gr.Gallery(
show_label=False,
columns=2,
rows=5,
height=1350,
object_fit="contain",
elem_classes="card",
)
with gr.Row():
output_files = gr.File(label="Images", file_count="multiple")
zip_file = gr.File(label="ZIP")
generate.click(
fn=create_studio_set,
inputs=source,
outputs=[gallery, output_files, zip_file, status],
api_name="generate_10_studio_shots",
concurrency_limit=1,
scroll_to_output=True,
)
demo.queue(default_concurrency_limit=1, max_size=4)
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=int(os.getenv("PORT", "7860")),
show_error=True,
)