Spaces:
Sleeping
Sleeping
""" | |
Aplikasi Toko Baju Virtual - Virtual Try-On | |
Deskripsi: | |
Aplikasi ini memungkinkan pengguna untuk mencoba pakaian secara virtual dengan | |
mengunggah gambar diri mereka sendiri dan gambar pakaian yang ingin dicoba. | |
Menggunakan teknologi **Virtual Try-On** yang dipanggil melalui API eksternal untuk | |
menghasilkan gambar realistis dari pengguna yang mengenakan pakaian yang dipilih. | |
Oleh : | |
ยฉ2024 __drat. | ๐ฎ๐ฉ Untuk Indonesia Jaya! | |
""" | |
import os | |
import gradio as gr | |
from gradio_client import Client, handle_file | |
from gradio_client.exceptions import AppError # Import untuk menangkap kesalahan Gradio Client | |
from themes import IndonesiaTheme | |
from PIL import Image | |
import random | |
import tempfile | |
import time | |
# Siapkan URL untuk permintaan API Virtual Try-On | |
url_api = os.environ['url_api'] | |
url_api2 = os.environ['url_api2'] | |
url_api3 = os.environ['url_api3'] | |
url_api4 = os.environ['url_api4'] | |
url_api5 = os.environ['url_api5'] | |
url_api6 = os.environ['url_api6'] | |
url_api7 = os.environ['url_api7'] | |
# Fungsi untuk memilih URL secara acak | |
def get_random_api_url(): | |
return random.choice([url_api, url_api2, url_api3, url_api4, url_api5, url_api6, url_api7]) | |
# Fungsi untuk menyimpan gambar sementara ke file | |
def save_temp_image(image_array): | |
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png") | |
image = Image.fromarray(image_array.astype('uint8')) | |
image.save(temp_file.name) | |
return temp_file.name | |
# Fungsi untuk memanggil API Virtual Try-On | |
def virtual_tryon(person_img, garment_img, garment_des, seed, randomize_seed, denoise_steps, is_checked, is_checked_crop): | |
# Pilih URL secara acak | |
selected_api_url = get_random_api_url() | |
client = Client(selected_api_url) | |
# Simpan gambar sementara | |
person_img_path = save_temp_image(person_img) | |
garment_img_path = save_temp_image(garment_img) | |
try: | |
# Pemanggilan API yang sudah disesuaikan dengan format baru | |
result = client.predict( | |
dict={ | |
"background": handle_file(person_img_path), | |
"layers": [], | |
"composite": None # Menggunakan None sesuai dengan format yang diberikan | |
}, | |
garm_img=handle_file(garment_img_path), | |
garment_des=garment_des, # Deskripsi pakaian dari input pengguna | |
is_checked=is_checked, # Checkbox apakah checked atau tidak | |
is_checked_crop=is_checked_crop, # Checkbox untuk cropping | |
denoise_steps=denoise_steps, # Denoise steps slider | |
seed=seed, | |
api_name="/tryon" | |
) | |
# Daftar kalimat acak yang menarik dan lucu | |
compliments = [ | |
"Anda tampak hebat dengan baju itu!", | |
"Wow, Anda terlihat sangat memukau sekarang!", | |
"Siap jadi pusat perhatian dengan outfit ini!", | |
"Anda terlihat seperti bintang di red carpet!", | |
"Baju ini benar-benar cocok dengan gaya Anda!", | |
"Luar biasa! Anda terlihat seperti seorang model profesional!", | |
"Siapa yang tidak terpesona melihat Anda sekarang?", | |
"Gaya Anda sangat menakjubkan dengan pakaian ini!", | |
"Perfect match! Anda terlihat menawan!", | |
"Siap untuk sesi foto? Anda benar-benar keren!" | |
] | |
# Tampilkan hasil dan kalimat acak yang menarik | |
return result[0], random.choice(compliments), "Proses selesai." | |
except AppError as e: | |
# Tampilkan pesan error di result_info jika terjadi kesalahan API | |
return None, str(e), "Terjadi kesalahan selama proses." | |
finally: | |
# Hapus file sementara setelah selesai | |
os.remove(person_img_path) | |
os.remove(garment_img_path) | |
# Tampilkan pesan peringatan dan menunggu selama 1 menit sebelum proses baru dimulai | |
gr.Warning("Ruang ganti kami terbatas. Mohon menunggu antreannya.") | |
time.sleep(60) | |
# Path untuk contoh gambar | |
example_path = os.path.join(os.path.dirname(__file__), 'assets') | |
# Daftar gambar pakaian contoh | |
garm_list = os.listdir(os.path.join(example_path, "cloth")) | |
garm_list_path = [os.path.join(example_path, "cloth", garm) for garm in garm_list] | |
# Daftar gambar orang contoh | |
human_list = os.listdir(os.path.join(example_path, "human")) | |
human_list_path = [os.path.join(example_path, "human", human) for human in human_list] | |
# CSS untuk styling antarmuka | |
css = """ | |
#col-left, #col-mid, #col-right { | |
margin: 0 auto; | |
max-width: 400px; | |
padding: 10px; | |
border-radius: 15px; | |
background-color: #f9f9f9; | |
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); | |
} | |
#banner { | |
width: 100%; | |
text-align: center; | |
margin-bottom: 20px; | |
} | |
#run-button { | |
background-color: #ff4b5c; | |
color: white; | |
font-weight: bold; | |
padding: 10px; | |
border-radius: 10px; | |
cursor: pointer; | |
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | |
} | |
#footer { | |
text-align: center; | |
margin-top: 20px; | |
color: silver; | |
} | |
""" | |
# Membuat antarmuka Gradio dengan tema IndonesiaTheme | |
with gr.Blocks(css=css, theme=IndonesiaTheme()) as TokoBajuVirtual: | |
# Tambahkan banner | |
gr.HTML(""" | |
<div style='text-align: center;'> | |
<img src='https://i.ibb.co.com/BgBLhSW/banner.jpg' alt='Banner' style='width: 100%; height: auto;'/> | |
</div> | |
""") | |
# Ganti judul | |
gr.Markdown("<h1 style='text-align: center;'>Selamat Datang Pelanggan Tercinta!โค๏ธ Senang dapat melayani Anda.. </h1>") | |
# Layout utama | |
with gr.Row(): | |
with gr.Column(elem_id="col-left"): | |
gr.Markdown("### Unggah Foto Anda") | |
person_img = gr.Image(label="Foto Anda", type="numpy") | |
gr.Markdown("### Deskripsi Pakaian") | |
garment_des = gr.Textbox(label="Deskripsi Pakaian", placeholder="Optional : Berikan deskripsi pakaian...") | |
gr.Examples(inputs=person_img, examples=human_list_path, examples_per_page=8) | |
with gr.Column(elem_id="col-mid"): | |
gr.Markdown("### Unggah Foto Pakaian") | |
garment_img = gr.Image(label="Foto Pakaian", type="numpy") | |
gr.Examples(inputs=garment_img, examples=garm_list_path, examples_per_page=14) | |
with gr.Column(elem_id="col-right"): | |
gr.Markdown("### Ruang Ganti Umum") | |
result_img = gr.Image(label="Hasil", show_share_button=False) | |
seed = gr.Slider(label="Token-Slider", minimum=0, maximum=999999, step=1, value=42) | |
randomize_seed = gr.Checkbox(label="Random Token", value=True) | |
denoise_steps = gr.Slider(label="Denoise Steps", minimum=1, maximum=50, step=1, value=30) | |
is_checked = gr.Checkbox(label="Nyalakan Virtual Try-On", value=True) | |
is_checked_crop = gr.Checkbox(label="Ukuran Disesuaikan", value=True) | |
result_info = gr.Textbox(label="Jawaban CS Kami") | |
# Tombol untuk memulai proses ganti pakaian virtual | |
run_button = gr.Button(value="โญ Mulai Ganti Pakaian โญ", elem_id="run-button") | |
run_button.click( | |
fn=virtual_tryon, | |
inputs=[person_img, garment_img, garment_des, seed, randomize_seed, denoise_steps, is_checked, is_checked_crop], | |
outputs=[result_img, result_info] | |
) | |
# Tambahkan footer di bagian bawah | |
gr.HTML(""" | |
<footer id="footer"> | |
Transfer Energi Semesta Digital ยฉ 2024 __drat. | ๐ฎ๐ฉ Untuk Indonesia Jaya! | |
</footer> | |
""") | |
# Menjalankan aplikasi | |
if __name__ == "__main__": | |
TokoBajuVirtual.queue(api_open=False).launch(show_api=False) | |