MAZINGIRA254 / app.py
ANON-STUDIOS-254's picture
Update app.py
b74c10d verified
raw
history blame
6.68 kB
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
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
# Load the pre-trained Keras model for Mazingira 254
model = load_model("/content/keras_model.h5", compile=False)
# Load class labels for environmental themes
with open("/content/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. Provide expert recommendations 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_recommendations(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 highest and 1 being the least ideal, {alias} rated the following:\n"
f"Comfort and Well-being: {comfort}\n"
f"Social Interaction: {social_interaction}\n"
f"Environmental Stressors: {stressors}\n"
f"Privacy and Personal Space: {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 personalized recommendations for {alias}, addressing them directly."
)
# Generate recommendations using the Hugging Face model
response = client.chat_completion(
[{"role": "user", "content": message}],
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p
)
recommendations = response.choices[0].message['content']
# Convert the recommendations to address the user in first person
recommendations = recommendations.replace("You should", "I recommend that you")
return recommendations
def analyze_environmental_concerns(comfort, social_interaction, stressors, privacy, open_question, alias, img):
# Classify the image
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 Ukiyo-e 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=['#F08080', '#90EE90', '#000000', '#FFD700']) # Light red, light green, black, gold
# Improve graph display
ax.set_ylabel('Score', fontsize=14, color='#333333')
ax.set_title(f'Environmental Psychology Concerns 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 recommendations using the model, passing the image analysis results
recommendations = generate_recommendations(comfort, social_interaction, stressors, privacy, open_question, image_info, alias)
return fig, recommendations
# Custom CSS for Ukiyo-e theme
custom_css = """
body {
font-family: 'Garamond', serif;
background-color: #FAF3F3; /* Light background color */
}
.container {
border: 2px solid #F08080; /* Light red border */
border-radius: 10px;
padding: 20px;
background-color: #FFFFFF; /* White background for content */
}
h1 {
color: #F08080; /* Light red */
}
h2, h3, h4 {
color: #333333; /* Dark grey for headings */
}
.gradio-slider .slider .slider-handle {
background-color: #90EE90; /* Light green slider handle */
}
.gradio-slider .slider .slider-track {
background-color: #F08080; /* Light red track */
}
.gradio-textbox input, .gradio-textbox textarea {
border: 2px solid #000000; /* Black border for inputs */
}
.gradio-button {
background-color: #FFD700; /* Gold background for buttons */
color: #000000; /* Black text for buttons */
}
"""
# Create the Gradio interface with custom CSS
inputs = [
gr.Slider(minimum=1, maximum=5, step=1, label="How would you rate Comfort and Well-being?"),
gr.Slider(minimum=1, maximum=5, step=1, label="How would you rate Social Interaction?"),
gr.Slider(minimum=1, maximum=5, step=1, label="How would you rate Environmental Stressors?"),
gr.Slider(minimum=1, maximum=5, step=1, label="How would you rate Privacy and Personal Space?"),
gr.Textbox(placeholder="Describe any additional concerns or suggestions you have.", label="Open-ended Question", lines=3),
gr.Textbox(placeholder="Enter a single-word alias (e.g., anon).", label="Client Alias", lines=1), # New input for alias
gr.Image(type="pil", label="Upload an Image for Theme Detection") # New input for image
]
outputs = [
gr.Plot(label="Concerns Graph"),
gr.Textbox(label="Recommendations", lines=5)
]
gr.Interface(
fn=analyze_environmental_concerns,
inputs=inputs,
outputs=outputs,
title="Mazingira: Environmental Psychology Concerns Analyzer",
description="Input your environmental psychology concerns to receive personalized recommendations and a visual graph, along with image-based analysis.",
css=custom_css # Apply custom CSS
).launch()