Spaces:
Sleeping
Sleeping
File size: 3,657 Bytes
edfb9ce a466d6e 6e4a2a6 459eb54 6042875 edfb9ce 7bf4efc 6042875 6e4a2a6 a466d6e 6e4a2a6 a466d6e 51a8997 a466d6e 51a8997 a466d6e 6e4a2a6 6042875 6e4a2a6 fe4ca82 7bf4efc 6042875 f645d7c 6042875 6e4a2a6 6042875 6e4a2a6 6042875 6e4a2a6 6042875 8a28709 6042875 6e4a2a6 a466d6e 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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import gradio as gr
import cv2
import numpy as np
from gradio_client import Client
from io import BytesIO
from PIL import Image
# -----------------------------
# Hugging Face API Key
# -----------------------------
API_KEY = "HF_Token" # <-- Replace with your Hugging Face token
# -----------------------------
# Local "try-on" simulation
# -----------------------------
def tryon_local(person_img, garment_img, seed, randomize_seed):
if person_img is None or garment_img is None:
return None, None, "Empty image"
h_person, w_person = person_img.shape[:2]
h_garment, w_garment = garment_img.shape[:2]
scale = w_person / w_garment
new_w = int(w_garment * scale)
new_h = int(h_garment * scale)
garment_resized = cv2.resize(garment_img, (new_w, new_h))
overlay = person_img.copy()
y_offset = 0
x_offset = max(0, (w_person - new_w) // 2)
if garment_resized.shape[2] == 4:
alpha = garment_resized[:, :, 3] / 255.0
for c in range(3):
overlay[y_offset:y_offset+new_h, x_offset:x_offset+new_w, c] = \
alpha * garment_resized[:, :, c] + (1 - alpha) * overlay[y_offset:y_offset+new_h, x_offset:x_offset+new_w, c]
else:
overlay[y_offset:y_offset+new_h, x_offset:x_offset+new_w] = garment_resized
info = "Success (local simulation)"
return overlay, seed, info
# -----------------------------
# Initialize Hunyuan3D API client
# -----------------------------
hunyuan_client = Client("tencent/Hunyuan3D-2.1", hf_token=API_KEY)
# -----------------------------
# Convert NumPy image to bytes for API
# -----------------------------
def np_to_bytes(img: np.ndarray):
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(img_rgb)
buf = BytesIO()
pil_img.save(buf, format="PNG")
buf.seek(0)
return buf.read()
# -----------------------------
# Try-on using Hunyuan3D
# -----------------------------
def tryon_to_3d(person_img, garment_img, seed, randomize_seed):
tryon_img, seed_used, info = tryon_local(person_img, garment_img, seed, randomize_seed)
if tryon_img is None:
return None, "Local try-on failed"
try:
person_bytes = np_to_bytes(person_img)
garment_bytes = np_to_bytes(garment_img)
# Use the correct endpoint without keyword args
result_bytes = hunyuan_client.predict(person_bytes, garment_bytes)
result_img = np.array(Image.open(BytesIO(result_bytes)))
return result_img, info + " + Hunyuan3D processed"
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()
|