""" 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("""
Banner
""") # Ganti judul gr.Markdown("

Selamat Datang Pelanggan Tercinta!❤️ Senang dapat melayani Anda..

") # 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(""" """) # Menjalankan aplikasi if __name__ == "__main__": TokoBajuVirtual.queue(api_open=False).launch(show_api=False)