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()