Spaces:
Sleeping
Sleeping
File size: 2,928 Bytes
edfb9ce a466d6e 6e4a2a6 459eb54 b793cb4 6042875 b793cb4 6e4a2a6 b793cb4 9d9631e b793cb4 9d9631e b793cb4 a100145 b793cb4 9d9631e b793cb4 6e4a2a6 b793cb4 6e4a2a6 b793cb4 6e4a2a6 a466d6e 6e4a2a6 a466d6e c3b4694 a466d6e 6e4a2a6 a466d6e d82b800 a466d6e d82b800 a466d6e 51a8997 |
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 |
import gradio as gr
import cv2
import numpy as np
from gradio_client import Client
import io
from PIL import Image
# -----------------------------
# Hunyuan3D API setup
# -----------------------------
API_KEY = "HT_Token" # Replace with your valid key
try:
hunyuan_client = Client("tencent/Hunyuan3D-2.1", hf_token=API_KEY)
# Grab first endpoint index for the 3D try-on function
fn_index_default = hunyuan_client.endpoints[0].fn_index if hunyuan_client.endpoints else 0
client_loaded = True
except Exception as e:
print(f"Failed to load Hunyuan3D client: {e}")
hunyuan_client = None
fn_index_default = 0
client_loaded = False
# -----------------------------
# Convert numpy image to bytes
# -----------------------------
def np_to_bytes(img_np):
img_pil = Image.fromarray(cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB))
buf = io.BytesIO()
img_pil.save(buf, format="PNG")
return buf.getvalue()
# -----------------------------
# Try-on function using Hunyuan3D API
# -----------------------------
def tryon_to_3d(person_img, garment_img, seed, randomize_seed):
if not client_loaded:
return None, "Hunyuan3D client not loaded. Please check your API key."
if person_img is None or garment_img is None:
return None, "Empty image provided."
try:
# Convert to bytes
person_bytes = np_to_bytes(person_img)
garment_bytes = np_to_bytes(garment_img)
# Call the 3D try-on endpoint
result = hunyuan_client.predict(
person_bytes,
garment_bytes,
fn_index=fn_index_default
)
# Convert returned bytes to image
result_img = np.array(Image.open(io.BytesIO(result)))
return cv2.cvtColor(result_img, cv2.COLOR_RGB2BGR), "3D try-on successful!"
except Exception as e:
return None, f"Hunyuan3D API error: {e}"
# -----------------------------
# Gradio UI
# -----------------------------
css = """
#col-left, #col-mid, #col-right {
margin: 0 auto;
max-width: 430px;
}
#col-showcase {
margin: 0 auto;
max-width: 1100px;
}
#button { color: blue; }
"""
with gr.Blocks(css=css) as app:
with gr.Row():
with gr.Column(elem_id="col-left"):
person_input = gr.Image(label="Person Image", type="numpy")
with gr.Column(elem_id="col-mid"):
garment_input = gr.Image(label="Garment Image", type="numpy")
with gr.Column(elem_id="col-right"):
output_img = gr.Image(label="3D Result")
result_info = gr.Text(label="Info")
seed = gr.Slider(0, 999999, value=0, step=1, label="Seed")
randomize_seed = gr.Checkbox(label="Random seed", value=True)
run_btn = gr.Button("Run")
run_btn.click(
fn=tryon_to_3d,
inputs=[person_input, garment_input, seed, randomize_seed],
outputs=[output_img, result_info]
)
app.launch()
|