Zaiiida's picture
Update app.py
c380ec1 verified
raw
history blame
5.69 kB
import gradio as gr
import tempfile
import os
import numpy as np
import torch
from PIL import Image
from tsr.system import TSR
from tsr.utils import remove_background, resize_foreground, to_gradio_3d_orientation
# Проверяем наличие GPU
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# Загружаем модель
model = TSR.from_pretrained(
"stabilityai/TripoSR",
config_name="config.yaml",
weight_name="model.ckpt",
)
model.renderer.set_chunk_size(131072)
model.to(device)
# Функция для проверки изображения
def check_input_image(input_image):
if input_image is None:
raise gr.Error("No image uploaded!")
# Функция обработки изображения
def preprocess(input_image, do_remove_background, foreground_ratio):
def fill_background(image):
image = np.array(image).astype(np.float32) / 255.0
image = image[:, :, :3] * image[:, :, 3:4] + (1 - image[:, :, 3:4]) * 0.5
image = Image.fromarray((image * 255.0).astype(np.uint8))
return image
if do_remove_background:
image = input_image.convert("RGB")
image = remove_background(image)
image = resize_foreground(image, foreground_ratio)
image = fill_background(image)
else:
image = input_image
if image.mode == "RGBA":
image = fill_background(image)
return image
# Функция генерации 3D модели
def generate(image):
scene_codes = model(image, device=device)
mesh = model.extract_mesh(scene_codes)[0]
mesh = to_gradio_3d_orientation(mesh)
mesh_path2 = tempfile.NamedTemporaryFile(suffix=".glb", delete=False)
mesh.export(mesh_path2.name)
return mesh_path2.name
# Настройка темы и CSS
class CustomTheme(gr.themes.Base):
def __init__(self):
super().__init__()
self.primary_hue = "#191a1e"
self.background_fill_primary = "#191a1e"
self.background_fill_secondary = "#191a1e"
self.background_fill_tertiary = "#191a1e"
self.text_color_primary = "#FFFFFF"
self.text_color_secondary = "#FFFFFF"
self.text_color_tertiary = "#FFFFFF"
self.input_background_fill = "#191a1e"
self.input_text_color = "#FFFFFF"
css = """
footer {
visibility: hidden;
height: 0;
margin: 0;
padding: 0;
overflow: hidden;
}
body, input, button, textarea, select, .gr-button {
font-family: 'Poppins', sans-serif;
background-color: #191a1e !important;
color: #FFFFFF !important;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Poppins', sans-serif;
font-weight: 700;
color: #FFFFFF !important;
}
input[type="text"], textarea {
background-color: #191a1e !important;
color: #FFFFFF !important;
border: 1px solid #FFFFFF !important;
}
.generate-button {
background-color: #5271FF !important;
color: #FFFFFF !important;
border: none !important;
font-weight: bold !important;
}
.generate-button:hover {
background-color: #405BBF !important;
}
gr-image-upload {
background-color: #191a1e !important;
border: 1px dashed #FFFFFF !important;
position: relative;
}
.gr-image-upload .dropzone::before {
content: 'Drop Image Here';
color: #FFFFFF;
font-size: 1rem;
font-weight: bold;
text-align: center;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.drop-image-container {
display: flex;
flex-direction: column;
align-items: center;
}
.drop-image, .processed-image {
margin-bottom: 20px;
background-color: #191a1e !important;
}
.foreground-ratio-container {
margin-top: 20px;
margin-bottom: 20px;
}
.gr-tab {
background-color: #191a1e !important;
border: 1px solid #FFFFFF;
border-radius: 5px;
margin-top: 10px;
}
.gr-tab label {
color: #FFFFFF !important;
font-weight: bold;
}
.gr-button-primary {
background-color: #5271FF !important;
color: #FFFFFF !important;
border: none;
}
.gr-button-primary:hover {
background-color: #405BBF !important;
color: #FFFFFF !important;
}
"""
# Интерфейс
with gr.Blocks(theme=CustomTheme(), css=css) as demo:
with gr.Column():
gr.Markdown("**Upload and Process Your Image**")
with gr.Row():
input_image = gr.Image(
label="Upload Image",
image_mode="RGBA",
sources="upload",
type="pil",
width=400,
height=300,
)
processed_image = gr.Image(
label="Processed Image",
interactive=False,
width=400,
height=300,
)
foreground_ratio = gr.Slider(
label="Foreground Ratio",
minimum=0.5,
maximum=1.0,
value=0.85,
step=0.05,
)
do_remove_background = gr.Checkbox(
label="Remove Background",
value=True,
)
submit = gr.Button("Generate")
output_model = gr.Model3D(label="Generated GLB Model", interactive=False)
# Обработка кликов
submit.click(
fn=check_input_image,
inputs=[input_image],
outputs=[]
).then(
fn=preprocess,
inputs=[input_image, do_remove_background, foreground_ratio],
outputs=[processed_image]
).then(
fn=generate,
inputs=[processed_image],
outputs=[output_model]
)
# Запуск приложения
demo.launch()