ai-building-blocks / utils.py
LiKenun's picture
Add image captioning sample
d56b9d9
raw
history blame
1.73 kB
import gradio as gr
from io import BytesIO
from PIL.Image import Image, open as open_image
from os import getenv
import requests
from tempfile import NamedTemporaryFile
import torch
# Try to import spaces decorator (for Hugging Face Spaces), otherwise use no-op decorator.
try:
import spaces
spaces_gpu = spaces.GPU
except ImportError:
# For local development, use a no-op decorator because spaces is not available.
def spaces_gpu(func):
return func
def get_pytorch_device() -> str:
return ("cuda" if torch.cuda.is_available() # Nvidia CUDA and AMD ROCm
else "xpu" if torch.xpu.is_available() # Intel XPU
else "mps" if torch.mps.is_available() # Apple Silicon
else "cpu") # gl bro 🫠
def request_image(url: str) -> Image:
try:
response = requests.get(url, timeout=int(getenv("REQUEST_TIMEOUT")))
response.raise_for_status()
return open_image(BytesIO(response.content))
except requests.HTTPError as e:
raise gr.Error(f"Failed to fetch image from URL because of HTTP error: {e.response.status_code} {e.response.text}")
except requests.Timeout as e:
raise gr.Error(f"Failed to fetch image from URL because the request timed out.")
except requests.RequestException as e:
raise gr.Error(f"Failed to fetch image from URL: {str(e)}")
def save_image_to_temp_file(image: Image) -> str:
image_format = image.format if image.format else 'PNG'
format_extension = image_format.lower() if image_format else 'png'
temp_file = NamedTemporaryFile(delete=False, suffix=f".{format_extension}")
temp_path = temp_file.name
temp_file.close()
image.save(temp_path, format=image_format)
return temp_path