Spaces:
Running
Running
File size: 5,186 Bytes
884e760 6c74fa1 2d8c11a 6c74fa1 6a1229b 2d8c11a a8c40e7 2d8c11a ca9ec31 2d8c11a 75bed3a 2d8c11a c060c17 ff363f9 6a1229b 26f3cbb 2d8c11a 26f3cbb 2d8c11a 94d83be 2d8c11a 6c74fa1 a8c40e7 6529799 a8c40e7 6a1229b bb3e741 6a1229b 2d8c11a 6c74fa1 dcbf369 47009ed c0ddebd 47009ed 1318a4b eaaba91 1318a4b eaaba91 1318a4b dcbf369 6c74fa1 bfd8dab 6c74fa1 17f885f 6c74fa1 45299c9 6c74fa1 2d8c11a 9e2e30b 2d8c11a eaaba91 2d8c11a 45299c9 a8c40e7 6c74fa1 45299c9 |
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 |
import gradio as gr
import numpy as np
import os
from PIL import Image
import requests
from io import BytesIO
import io
import base64
from loadimg import load_img
hf_token = os.environ.get("HF_TOKEN_API_DEMO") # we get it from a secret env variable, such that it's private
auth_headers = {"api_token": hf_token}
def convert_image_to_base64_string(img):
buffer = io.BytesIO()
img.save(buffer, format="PNG") # You can choose the format (e.g., "JPEG", "PNG")
# Encode the buffer in base64
image_base64_string = base64.b64encode(buffer.getvalue()).decode('utf-8')
return f",{image_base64_string}"
def download_image(url):
response = requests.get(url)
img_bytes = BytesIO(response.content)
return Image.open(img_bytes).convert("RGB")
def api_call(image_base64_file):
url = "https://engine.prod.bria-api.com/v1/tailored-gen/restyle_portrait"
payload = {
"id_image_file": image_base64_file,
"tailored_model_id": 598,
}
response = requests.post(url, json=payload, headers=auth_headers)
response = response.json()
res_image = download_image(response["image_res"])
return res_image
def predict(img_input):
img = load_img(img_input)
img = img.convert("RGB")
image_base64_file = convert_image_to_base64_string(img)
gen_img = api_call(image_base64_file)
return gen_img
css = '''
.gradio-container{max-width: 1100px !important}
#image_upload{min-height:400px}
#image_upload [data-testid="image"], #image_upload [data-testid="image"] > div{min-height: 400px}
#mask_radio .gr-form{background:transparent; border: none}
#word_mask{margin-top: .75em !important}
#word_mask textarea:disabled{opacity: 0.3}
.footer {margin-bottom: 45px;margin-top: 35px;text-align: center;border-bottom: 1px solid #e5e5e5}
.footer>p {font-size: .8rem; display: inline-block; padding: 0 10px;transform: translateY(10px);background: white}
.dark .footer {border-color: #303030}
.dark .footer>p {background: #0b0f19}
.acknowledgments h4{margin: 1.25em 0 .25em 0;font-weight: bold;font-size: 115%}
#image_upload .touch-none{display: flex}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#share-btn-container {padding-left: 0.5rem !important; padding-right: 0.5rem !important; background-color: #000000; justify-content: center; align-items: center; border-radius: 9999px !important; max-width: 13rem; margin-left: auto;}
div#share-btn-container > div {flex-direction: row;background: black;align-items: center}
#share-btn-container:hover {background-color: #060606}
#share-btn {all: initial; color: #ffffff;font-weight: 600; cursor:pointer; font-family: 'IBM Plex Sans', sans-serif; margin-left: 0.5rem !important; padding-top: 0.5rem !important; padding-bottom: 0.5rem !important;right:0;}
#share-btn * {all: unset}
#share-btn-container div:nth-child(-n+2){width: auto !important;min-height: 0px !important;}
#share-btn-container .wrap {display: none !important}
#share-btn-container.hidden {display: none!important}
#prompt input{width: calc(100% - 160px);border-top-right-radius: 0px;border-bottom-right-radius: 0px;}
#run_button {
width: 100%;
height: 50px; /* Set a fixed height for the button */
display: flex;
align-items: center;
justify-content: center;
}
#output-img img, #image_upload img {
object-fit: contain; /* Ensure aspect ratio is preserved */
width: 100%;
height: auto; /* Let height adjust automatically */
}
#prompt-container{margin-top:-18px;}
#prompt-container .form{border-top-left-radius: 0;border-top-right-radius: 0}
#image_upload{border-bottom-left-radius: 0px;border-bottom-right-radius: 0px}
'''
image_blocks = gr.Blocks(css=css, elem_id="total-container")
with image_blocks as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown("## BRIA Restyle Portrait API")
gr.HTML('''
<p style="margin-bottom: 10px; font-size: 94%">
This demo showcases the BRIA Restyle Portrait capability, which lets you transform the style of a portrait while preserving the person's facial features using a tailored model and a reference image.<br> ComfyUI Node is available <a href=https://github.com/Bria-AI/ComfyUI-BRIA-API/tree/main?tab=readme-ov-file#tailored-generation-nodes>here</a>
</p>
''')
with gr.Row():
with gr.Column():
image = gr.Image(label="Upload an image")
with gr.Column():
btn = gr.Button("Restyle!", elem_id="run_button")
with gr.Column():
image_out = gr.Image(label="Output", elem_id="output-img")
# Button click will trigger the inpainting function (now with prompt included)
btn.click(fn=predict, inputs=image, outputs=[image_out], api_name='run')
gr.HTML(
"""
<div class="footer">
<p>Model by <a href="https://huggingface.co/diffusers" style="text-decoration: underline;" target="_blank">Diffusers</a> - Gradio Demo by 🤗 Hugging Face
</p>
</div>
"""
)
image_blocks.queue(max_size=25, api_open=False).launch(show_api=False) |