Spaces:
Running
Running
import gradio as gr | |
import requests | |
import os | |
import random | |
from io import BytesIO | |
from PIL import Image | |
import base64 | |
# Получение списка API ключей из переменной окружения | |
api_keys = os.getenv("HF_API_KEYS", "").split(",") | |
if not api_keys or not all(api_keys): | |
raise ValueError("HF_API_KEYS environment variable is not set or contains invalid keys.") | |
# Выбор случайного API ключа | |
api_key = random.choice(api_keys) | |
headers = { | |
"Authorization": f"Bearer {api_key}" | |
} | |
# Ссылка на API Hugging Face | |
api_url = "https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-large" | |
# Функция для генерации описания изображения | |
def caption_image(image): | |
if image is None: | |
return "" | |
# Преобразование изображения в байтовый формат | |
buffered = BytesIO() | |
try: | |
image.save(buffered, format="PNG") # Используем PNG | |
except Exception as e: | |
return f"Error: Failed to save image - {str(e)}" | |
image_bytes = buffered.getvalue() | |
# Логирование размера байтового объекта | |
print(f"Image size: {len(image_bytes)} bytes") | |
# Отправка изображения в base64 | |
image_base64 = base64.b64encode(image_bytes).decode('utf-8') | |
data = {"inputs": image_base64} | |
response = requests.post(api_url, headers=headers, json=data, timeout=150) | |
# Логирование ответа | |
if response.status_code == 200: | |
return response.json()[0]['generated_text'] | |
else: | |
print(f"Error: {response.status_code} - {response.text}") | |
return f"Error: {response.status_code} - {response.text}" | |
# Ссылка на файл CSS (опционально) | |
css_url = "https://neurixyufi-aihub.static.hf.space/style.css" | |
try: | |
response = requests.get(css_url) | |
css = response.text + ".gradio-container{max-width: 700px !important} h1{text-align:center}" | |
except requests.exceptions.RequestException as e: | |
print(f"Warning: Could not load CSS from {css_url}: {e}") | |
# Создание интерфейса Gradio | |
with gr.Blocks(css=css) as demo: | |
gr.Markdown("# Описание изображения") | |
with gr.Row(): | |
with gr.Column(): | |
image_input = gr.Image(type="pil", label="Ваше изображение") | |
with gr.Column(): | |
caption_output = gr.Textbox(label="Описание") | |
image_input.change(fn=caption_image, inputs=image_input, outputs=caption_output) | |
# Запуск интерфейса | |
demo.launch(share=False, debug=False, show_error=False, show_api=False).queue(max_size=150) |