Spaces:
Sleeping
Sleeping
import gradio as gr | |
import matplotlib.pyplot as plt | |
from matplotlib.ticker import MaxNLocator | |
from huggingface_hub import InferenceClient | |
from keras.models import load_model | |
from PIL import Image, ImageOps | |
import numpy as np | |
# Initialize Hugging Face Inference Client for climate change and design recommendations | |
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") | |
# Load the pre-trained Keras model for Mazingira 254 (Environmental Theme Detection) | |
model = load_model("keras_model.h5", compile=False) | |
# Load class labels for environmental themes | |
with open("labels.txt", "r") as file: | |
class_names = [line.strip() for line in file.readlines()] | |
# Default parameters for the model | |
DEFAULT_MAX_TOKENS = 1000 | |
DEFAULT_TEMPERATURE = 0.7 | |
DEFAULT_TOP_P = 0.95 | |
DEFAULT_SYSTEM_MESSAGE = "You are an expert in environmental psychology and sustainable design. Provide innovative environmental design ideas to improve the climate and curb climate change, addressing the user directly." | |
DEFAULT_ALIAS = "anon" # Default alias | |
def classify_image(img): | |
# Prepare the image for prediction | |
image = ImageOps.fit(img, (224, 224), Image.Resampling.LANCZOS) | |
image_array = np.asarray(image) | |
normalized_image_array = (image_array.astype(np.float32) / 127.5) - 1 | |
data = normalized_image_array.reshape((1, 224, 224, 3)) | |
# Get the model prediction | |
prediction = model.predict(data) | |
index = np.argmax(prediction) | |
class_name = class_names[index] | |
confidence_score = prediction[0][index] | |
return { | |
"Detected Theme": class_name, | |
"Confidence Score": f"{confidence_score:.2f}" | |
} | |
def generate_design_ideas(comfort, social_interaction, stressors, privacy, open_question, image_info, alias=DEFAULT_ALIAS, max_tokens=DEFAULT_MAX_TOKENS, temperature=DEFAULT_TEMPERATURE, top_p=DEFAULT_TOP_P, system_message=DEFAULT_SYSTEM_MESSAGE): | |
# Construct the input message for the model with context | |
message = ( | |
f"{system_message}\n" | |
f"On a scale of 1-5, with 5 being the most favorable and 1 being the least ideal, {alias} rated the following:\n" | |
f"Comfort and Well-being: {comfort}\n" | |
f"Quality of Social Interaction: {social_interaction}\n" | |
f"Absence of overwhelming Environmental Stressors: {stressors}\n" | |
f"Quality of Personal Spaces: {privacy}\n" | |
f"Open-ended Question: {open_question}\n" | |
f"Detected Image Theme: {image_info['Detected Theme']}\n" | |
f"Confidence Score: {image_info['Confidence Score']}\n" | |
f"Please provide innovative environmental psychology design ideas to improve climate and curb climate change, addressing wellness and sustainability for {alias} directly." | |
) | |
# Generate design ideas using the Hugging Face model | |
response = client.chat_completion( | |
[{"role": "user", "content": message}], | |
max_tokens=max_tokens, | |
temperature=temperature, | |
top_p=top_p | |
) | |
design_ideas = response.choices[0].message['content'] | |
# Convert the recommendations to address the user in first person | |
design_ideas = design_ideas.replace("You should", "I recommend that you") | |
return design_ideas | |
def analyze_environmental_design(comfort, social_interaction, stressors, privacy, open_question, alias, img): | |
# Classify the image for environmental themes | |
image_info = classify_image(img) | |
# Use default alias if none is provided | |
alias = alias or DEFAULT_ALIAS | |
# Generate a bar graph for the input scores with creative theme colors | |
fig, ax = plt.subplots(figsize=(10, 6)) # Increased size for better visibility | |
categories = ["Comfort and Well-being", "Social Interaction", "Environmental Stressors", "Privacy and Personal Space"] | |
values = [comfort, social_interaction, stressors, privacy] | |
bars = ax.bar(categories, values, color=['#4CAF50', '#FFC107', '#2196F3', '#FF5722']) # Green, Amber, Blue, Red | |
# Improve graph display | |
ax.set_ylabel('Score', fontsize=14, color='#333333') | |
ax.set_title(f'Environmental Design Assessment for {alias}', fontsize=16, color='#333333') | |
ax.yaxis.set_major_locator(MaxNLocator(integer=True)) | |
ax.tick_params(axis='y', colors='#333333') | |
ax.tick_params(axis='x', colors='#333333') | |
# Add value labels on the bars | |
for bar in bars: | |
yval = bar.get_height() | |
ax.text(bar.get_x() + bar.get_width()/2, yval, int(yval), va='bottom', ha='center', color='black', fontsize=12) | |
# Generate design ideas using the model, passing the image analysis results | |
design_ideas = generate_design_ideas(comfort, social_interaction, stressors, privacy, open_question, image_info, alias) | |
return fig, design_ideas | |
# Custom CSS for modern design with footer hidden | |
custom_css = """ | |
body { | |
font-family: 'Arial', sans-serif; | |
background-color: #e0f7fa; | |
color: #00695c; | |
} | |
.gradio-container { | |
border-radius: 10px; | |
padding: 20px; | |
background: linear-gradient(135deg, #a5d6a7, #1b5e20); | |
box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.2); | |
} | |
.gradio-container h1 { | |
font-family: 'Arial', sans-serif; | |
font-size: 2.5em; | |
text-align: center; | |
color: #ffffff; | |
} | |
.gradio-button { | |
background-color: #00796b; | |
border: none; | |
color: white; | |
padding: 10px 20px; | |
font-size: 1em; | |
cursor: pointer; | |
border-radius: 5px; | |
} | |
.gradio-button:hover { | |
background-color: #004d40; | |
} | |
/* Hide Gradio footer */ | |
footer { | |
display: none !important; | |
} | |
""" | |
# Disclaimer text to include in the description | |
disclaimer_text = """ | |
**Disclaimer**: | |
1. This solution was built in only 5 hours with a limited dataset during the training of the CNN, so it may have some biases. | |
2. The solution is running on low compute resources, so we recommend using it when there is low traffic to improve performance. | |
""" | |
# Create the Gradio interface with custom CSS | |
inputs = [ | |
gr.Slider(minimum=1, maximum=5, step=1, label="On a scale of 1-5, with 5 being the most favorable and 1 being the least ideal. How would you rate your feelings of Comfort and Well-being?"), | |
gr.Slider(minimum=1, maximum=5, step=1, label="On a scale of 1-5, with 5 being the most favorable and 1 being the least ideal. How would you rate the quality of your Social Interaction?"), | |
gr.Slider(minimum=1, maximum=5, step=1, label="On a scale of 1-5, with 5 being the most favorable and 1 being the least ideal. How would you rate the absence of overwhelming Environmental Stressors like noise in your environment?"), | |
gr.Slider(minimum=1, maximum=5, step=1, label="On a scale of 1-5, with 5 being the most favorable and 1 being the least ideal. How would you rate the quality of your Personal Spaces?"), | |
gr.Textbox(placeholder="Describe any environmental challenges or ideas you have.", label="Open-ended Question", lines=3), | |
gr.Textbox(placeholder="Enter your alias (e.g., anon).", label="Client Alias", lines=1), # New input for alias | |
gr.Image(type="pil", label="Upload an Image for Environmental Theme Detection") # New input for image | |
] | |
outputs = [ | |
gr.Plot(label="Environmental Design Assessment"), | |
gr.Textbox(label="Creative Design Ideas", lines=5) | |
] | |
gr.Interface( | |
fn=analyze_environmental_design, | |
inputs=inputs, | |
outputs=outputs, | |
title="MAZINGIRA 254: Climate-Smart Environmental Psychology Design Ideas", | |
description=f"Input your environmental concerns and ideas in the form of images and personal experiences to receive creative design recommendations and a visual assessment of climate change impact.\n\n{disclaimer_text}", | |
css=custom_css # Apply custom CSS | |
).launch() | |