Omini / app.py
Rooni's picture
Update app.py
aa624da verified
import os
import random
import requests
import tempfile
from deep_translator import GoogleTranslator
from langdetect import detect
from gradio_client import Client, handle_file
import gradio as gr
from PIL import Image
from io import BytesIO
# Функция для получения случайного API ключа
def get_random_api_key():
keys = os.getenv("KEYS", "").split(",")
if keys and keys[0]: # Проверяем, что KEYS установлен и не пуст
return random.choice(keys).strip()
else:
raise ValueError("API ключи не найдены. Пожалуйста, установите переменную окружения KEYS.")
# Ссылка на файл CSS
css_url = "https://neurixyufi-aihub.static.hf.space/style.css"
# Получение CSS по ссылке (с обработкой ошибок)
try:
response = requests.get(css_url, timeout=10) # Добавлено timeout
response.raise_for_status()
css = response.text + " h1{text-align:center}"
except requests.exceptions.RequestException as e:
print(f"Ошибка при загрузке CSS: {e}")
css = " h1{text-align:center}" # Используем базовый стиль
# Функция для обработки изображения и текста через API
def process_image_and_text(image, text):
try:
# Проверка и перевод текста на английский, если необходимо
language = detect(text)
if language != 'en':
text = GoogleTranslator(source=language, target='en').translate(text)
# Сохранение изображения во временный файл
with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as temp_file:
image.save(temp_file.name)
image_path = temp_file.name
# Загрузка изображения в кеш и получение ссылки
image_url = handle_file(image_path)
# Получение случайного API ключа
api_key = get_random_api_key()
# Инициализация клиента (обработка ошибок)
client = Client("Yuanshi/OminiControl", hf_token=api_key)
result = client.predict(image=image_url, text=text, api_name="/predict")
if result is None:
return None
elif isinstance(result, Image.Image):
return result
elif isinstance(result, str) and result.startswith("/tmp"):
try:
return Image.open(result)
except FileNotFoundError:
print(f"Файл не найден: {result}")
return None
except Exception as e:
print(f"Ошибка при открытии файла: {e}, путь: {result}")
return None
else:
print(f"Неизвестный тип результата: {type(result)}, данные: {result}")
return None
except Exception as e:
print(f"Ошибка при обработке: {e}")
return None
# Функция для загрузки изображения из URL
def load_image_from_url(url):
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
image = Image.open(BytesIO(response.content))
return image
except Exception as e:
print(f"Ошибка при загрузке изображения из URL {url}: {e}")
return None
# Функция для получения примеров
def get_samples():
sample_list = [
{
"image": "https://huggingface.co./spaces/NeurixYUFI/Omini/resolve/main/img/pear.png",
"text": "Луна, данный предмет лежит на поверхности луны — груша. На заднем плане Земля возвышается на переднем плане, ультра реализм",
},
{
"image": "https://huggingface.co./spaces/NeurixYUFI/Omini/resolve/main/img/oranges.jpg",
"text": "Очень крупный план этого предмета. Он размещен на деревянном столе. Фон — темная комната, включен телевизор, на экране кулинарное шоу. На экране надпись: «Neurix»",
},
{
"image": "https://huggingface.co./spaces/NeurixYUFI/Omini/resolve/main/img/rc_car.jpg",
"text": "Кинематографичный кадр. На Луне эта вещь едет по лунной поверхности. На заднем плане видна гигантская Земля",
},
]
samples_with_images = []
for sample in sample_list:
image_url = sample["image"]
image = load_image_from_url(image_url)
if image:
samples_with_images.append([image, sample["text"]])
return samples_with_images
# Интерфейс Gradio с использованием gr.Blocks
with gr.Blocks(css=css) as demo:
gr.Markdown("# Замена фона")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="pil", label="Входное изображение")
text_input = gr.Textbox(lines=2, label="Описание")
submit_button = gr.Button("Обработать", variant="primary") # Добавили variant='primary'
with gr.Column():
output_image = gr.Image(type="pil", label="Результат", show_share_button=False)
submit_button.click(
fn=process_image_and_text,
inputs=[image_input, text_input],
outputs=output_image,
concurrency_limit=250
)
# Добавление примеров
examples = get_samples()
if examples:
with gr.Row():
gr.Examples(label="Примеры", examples=examples, fn=process_image_and_text, inputs=[image_input, text_input], outputs=output_image)
# Запуск интерфейса
if __name__ == "__main__":
demo.launch(
show_api=False,
share=False
)