File size: 6,268 Bytes
8bf60b6
 
 
5741612
8bf60b6
 
 
 
5741612
0561887
8bf60b6
 
 
 
 
 
 
 
 
 
 
 
594642f
8bf60b6
594642f
 
51fcd64
8bf60b6
 
594642f
8bf60b6
 
 
594642f
 
 
 
 
8bf60b6
594642f
 
 
 
 
 
 
 
 
 
 
 
 
 
97b24be
594642f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0561887
 
 
 
 
 
 
 
 
 
 
594642f
 
 
 
c4745ec
594642f
2e0cfc4
3d96341
c4745ec
aa624da
3d96341
 
c4745ec
aa624da
3d96341
594642f
 
 
 
0561887
 
 
 
594642f
 
8bf60b6
52c5bd8
 
 
 
 
 
 
97b24be
52c5bd8
 
 
 
 
 
 
 
 
8bf60b6
594642f
 
 
2e0cfc4
3d96341
594642f
8bf60b6
 
 
 
 
3d96341
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
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
    )