Deddy's picture
Update app.py
16b0f5d verified
from gradio_client import Client, handle_file
import gradio as gr
import concurrent.futures
import tempfile
import os
from PIL import Image
# Impor tema custom dari themes.py
from themes import IndonesiaTheme
# Siapkan URL dan header untuk permintaan API
url_api1 = os.environ['url_api1']
url_api2 = os.environ['url_api2']
# Fungsi untuk FLUX Std
def infer_image(prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, progress=gr.Progress()):
client = Client(url_api1)
try:
progress(0, "Memulai proses...")
result = client.predict(
prompt=prompt,
seed=seed,
randomize_seed=randomize_seed,
width=width,
height=height,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
api_name="/infer"
)
progress(1, "Proses selesai.")
return result[0], seed if not randomize_seed else result[1]
except concurrent.futures.CancelledError:
return None, "Request was cancelled. Please try again."
# Fungsi untuk FLUX Inpainting
def inpainting_process(input_image_editor, input_text, seed_slicer, randomize_seed_checkbox, strength_slider, num_inference_steps_slider, progress=gr.Progress()):
client = Client(url_api2)
try:
progress(0, "Memulai proses inpainting...")
# Simpan gambar sementara ke file
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp:
input_image_editor["composite"].save(temp.name)
temp_image_path = temp.name
# Tutup file setelah penulisan selesai
temp.close()
# Gunakan handle_file untuk memproses gambar dari jalur file sementara
input_image_editor = {"background": handle_file(temp_image_path)}
result = client.predict(
input_image_editor=input_image_editor,
input_text=input_text,
seed_slicer=seed_slicer,
randomize_seed_checkbox=randomize_seed_checkbox,
strength_slider=strength_slider,
num_inference_steps_slider=num_inference_steps_slider,
api_name="/process"
)
progress(1, "Proses inpainting selesai.")
return result[0], result[1]
except concurrent.futures.CancelledError:
return None, "Request was cancelled. Please try again."
finally:
# Hapus file sementara setelah selesai digunakan
import os
os.remove(temp_image_path)
# 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;
}
"""
# Interface Gradio
with gr.Blocks(css=css, theme=IndonesiaTheme()) as app:
# Tambahkan banner
gr.HTML("""
<div style='text-align: center;'>
<img src='https://i.postimg.cc/ZYFNKrjK/banner.jpg' alt='Banner' style='width: 100%; height: auto;'/>
</div>
""")
# Ganti judul
gr.Markdown("<h2 style='text-align: center;'>FLUX.1 Untuk membuat gambar terbaik di dunia.</h2>")
gr.HTML("""
<h4 style='text-align: center;'>
<a href="https://huggingface.co/sayakpaul/FLUX.1-merged">FLUX.1 [merged]</a> Merge by
<a href="https://huggingface.co/sayakpaul">Sayak Paul</a> of 2 of the 12B param rectified flow transformers
<a href="https://huggingface.co/black-forest-labs/FLUX.1-dev">FLUX.1 [dev]</a> and
<a href="https://huggingface.co/black-forest-labs/FLUX.1-schnell">FLUX.1 [schnell]</a> by
<a href="https://blackforestlabs.ai/">Black Forest Labs</a>, created by
<a href="https://github.com/drat">Deddy</a>
</h4>
""")
with gr.Tabs():
with gr.TabItem("FLUX Std"):
with gr.Row():
with gr.Column():
prompt_input = gr.Textbox(label="Prompt", placeholder="Ceritakan tentang image apa yang ingin dibuat...")
seed_slider = gr.Slider(label="Seed", minimum=0, maximum=10000, step=1, value=0)
randomize_seed_checkbox = gr.Checkbox(label="Randomize Seed", value=True)
width_slider = gr.Slider(label="Lebar", minimum=512, maximum=2048, step=64, value=1024)
height_slider = gr.Slider(label="Tinggi", minimum=512, maximum=2048, step=64, value=1024)
guidance_scale_slider = gr.Slider(label="Guidance Scale", minimum=1.0, maximum=20.0, step=0.5, value=3.5)
inference_steps_slider = gr.Slider(label="Jumlah Inference Steps", minimum=1, maximum=50, step=1, value=8)
submit_button = gr.Button("Mulai Membuat Gambar", elem_id="run-button")
with gr.Column():
result_image = gr.Image(label="Result")
seed_output = gr.Number(label="Seed Digunakan")
submit_button.click(
infer_image,
inputs=[prompt_input, seed_slider, randomize_seed_checkbox, width_slider, height_slider, guidance_scale_slider, inference_steps_slider],
outputs=[result_image, seed_output],
show_progress=True # Menampilkan progress bar
)
with gr.TabItem("FLUX Inpainting"):
with gr.Row():
with gr.Column():
input_image_editor = gr.ImageEditor(
label='Image',
type='pil',
sources=["upload", "webcam"],
image_mode='RGB',
layers=False,
brush=gr.Brush(colors=["#FFFFFF"], color_mode="fixed"))
input_text = gr.Textbox(label="Prompt", placeholder="Deskripsi untuk inpainting...")
seed_slicer = gr.Slider(label="Seed", minimum=0, maximum=10000, step=1, value=42)
randomize_seed_checkbox = gr.Checkbox(label="Randomize Seed", value=True)
strength_slider = gr.Slider(label="Strength", minimum=0.0, maximum=1.0, step=0.01, value=0.85)
num_inference_steps_slider = gr.Slider(label="Number of Inference Steps", minimum=1, maximum=50, step=1, value=20)
inpainting_button = gr.Button("Mulai Proses Inpainting", elem_id="run-button")
with gr.Column():
generated_image = gr.Image(label="Generated Image")
input_mask = gr.Image(label="Input Mask")
inpainting_button.click(
inpainting_process,
inputs=[input_image_editor, input_text, seed_slicer, randomize_seed_checkbox, strength_slider, num_inference_steps_slider],
outputs=[generated_image, input_mask],
show_progress=True # Menampilkan progress bar
)
# Tambahkan footer di bagian bawah
gr.HTML("""
<footer id="footer">
Transfer Energi Semesta Digital © 2024 __drat. | 🇮🇩 Untuk Indonesia Jaya!
</footer>
""")
# Meluncurkan aplikasi
if __name__ == "__main__":
app.launch()