Spaces:
Sleeping
Sleeping
import requests | |
from PIL import Image | |
from io import BytesIO | |
import base64 | |
import gradio as gr | |
from transformers import CLIPProcessor, CLIPModel | |
import numpy as np | |
import time | |
# Replace with your own API key | |
STABLE_DIFFUSION_API_KEY = "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" | |
# Load the CLIP model and processor | |
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") | |
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") | |
def get_mood_from_image(image: Image.Image): | |
moods = ["scared", "angry", "happy", "sad", "disgusted", "surprised"] | |
# Create unique prompts for each mood | |
prompts = [ | |
"The emotion conveyed by this image is fear. The person looks scared and tense.", | |
"The emotion conveyed by this image is anger. The person looks furious and irritated.", | |
"The emotion conveyed by this image is happy. The person looks happy and cheerful.", | |
"The emotion conveyed by this image is sadness. The person looks unhappy and gloomy.", | |
"The emotion conveyed by this image is disgust. The person looks repulsed and sickened.", | |
"The emotion conveyed by this image is surprise. The person looks astonished and amazed.", | |
] | |
# Prepare the inputs for the model | |
inputs = processor(text=prompts, images=image, return_tensors="pt", padding=True) | |
# Run the model | |
logits = model(**inputs).logits_per_image | |
probs = logits.softmax(dim=-1).tolist() | |
# Calculate the scores for each mood | |
mood_scores = {} | |
for mood, score in zip(moods, probs[0]): | |
mood_scores[mood] = score | |
print("Mood Scores:", mood_scores) | |
# Select the mood with the highest score | |
selected_mood = max(mood_scores, key=mood_scores.get) | |
return selected_mood | |
def is_black_image(image: Image.Image) -> bool: | |
img_array = np.array(image) | |
return np.all(img_array == 0) | |
def generate_art(mood, max_retries=3, request_timeout=30): | |
prompt = f"{mood} generative art with vibrant colors and intricate patterns ({str(np.random.randint(1, 10000))})" | |
headers = { | |
"Authorization": f"Bearer {STABLE_DIFFUSION_API_KEY}", | |
"Accept": "image/jpeg", | |
} | |
json_data = { | |
"inputs": prompt | |
} | |
retries = 0 | |
while retries < max_retries: | |
try: | |
response = requests.post('https://api-inference.huggingface.co/models/runwayml/stable-diffusion-v1-5', headers=headers, json=json_data, timeout=request_timeout) | |
except requests.exceptions.Timeout: | |
print(f"Request timed out after {request_timeout} seconds. Retrying...") | |
retries += 1 | |
continue | |
if response.status_code == 503: | |
print("Model is loading, waiting for 30 seconds before retrying...") | |
time.sleep(30) | |
continue | |
if response.status_code != 200: | |
print(f"Error: API response status code {response.status_code}") | |
print("Response content:") | |
print(response.content) | |
return None | |
image = Image.open(BytesIO(response.content)) | |
if not is_black_image(image): | |
break | |
retries += 1 | |
if retries == max_retries: | |
return None | |
return image | |
def mood_art_generator(image): | |
mood = get_mood_from_image(image) | |
print("Mood:", mood) | |
if mood: | |
art = generate_art(mood) | |
output_text = f"You seem to be {mood}. Here's an artwork representing it!" | |
return art, output_text | |
else: | |
return None, "Failed to generate artwork." | |
iface = gr.Interface( | |
fn=mood_art_generator, | |
inputs=gr.inputs.Image(shape=(224, 224), image_mode="RGB", source="upload"), | |
outputs=[gr.outputs.Image(type="pil"), gr.outputs.Textbox()], | |
title="Mood-based Art Generator", | |
description="Upload an image of yourself and let the AI generate artwork based on your mood.", | |
allow_flagging=False, | |
analytics_enabled=False, | |
share=True | |
) | |
iface.launch() | |