File size: 7,573 Bytes
d79f802
 
 
 
 
 
 
 
 
 
 
 
 
 
f1c6bef
 
0449d4e
ebcd661
cca5ceb
0449d4e
 
cca5ceb
 
aff15d6
5373c11
0449d4e
5373c11
 
 
 
 
 
 
 
 
 
f1c6bef
 
aff15d6
 
f1c6bef
aff15d6
 
f1c6bef
 
0449d4e
ecafc46
 
 
0449d4e
f1c6bef
aff15d6
 
 
d79f802
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cca5ceb
d79f802
 
 
 
 
 
 
 
 
 
 
 
 
cca5ceb
 
d79f802
 
0f1a7d7
cca5ceb
 
 
 
 
 
 
 
 
 
 
f1c6bef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0449d4e
f1c6bef
 
 
 
 
 
 
 
 
 
 
 
 
 
0449d4e
 
 
f1c6bef
 
 
 
 
0449d4e
f1c6bef
 
5373c11
f1c6bef
0449d4e
f1c6bef
0449d4e
 
 
f1c6bef
0449d4e
 
f1c6bef
0449d4e
 
 
5373c11
 
f1c6bef
 
 
 
 
 
 
 
 
 
0449d4e
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
"""
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)