img2txt / app.py
Rooni's picture
Update app.py
2e4a93b verified
raw
history blame contribute delete
2.74 kB
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)