Deddy's picture
Update app.py
4d987ff verified
"""
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)