Neurasense / app.py
Sephfox's picture
Update app.py
a750190 verified
raw
history blame
7.86 kB
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw
import time
from transformers import AutoModelForCausalLM, AutoTokenizer
# Constants
AVATAR_WIDTH, AVATAR_HEIGHT = 400, 600
# Set up DialoGPT model
@st.cache_resource
def load_model():
tokenizer = AutoTokenizer.from_pretrained("microsoft/DialoGPT-medium")
model = AutoModelForCausalLM.from_pretrained("microsoft/DialoGPT-medium")
return tokenizer, model
tokenizer, model = load_model()
# Simulated Sensor Classes
class Sensors:
@staticmethod
def measure_pressure(base_sensitivity, duration):
return base_sensitivity * (1 - np.exp(-duration / 2))
@staticmethod
def measure_temperature(base_temp, duration):
return base_temp + 5 * (1 - np.exp(-duration / 3))
@staticmethod
def measure_texture(x, y):
textures = ["smooth", "rough", "bumpy", "silky", "grainy"]
return textures[hash((x, y)) % len(textures)]
@staticmethod
def measure_em_field(x, y):
return np.sin(x/50) * np.cos(y/50) * 10
# Create more detailed sensation map for the avatar
def create_sensation_map(width, height):
sensation_map = np.zeros((height, width, 7)) # pain, pleasure, pressure, temp, texture, em, tickle
for y in range(height):
for x in range(width):
# Head
if 150 < x < 250 and 50 < y < 150:
sensation_map[y, x] = [0.7, 0.5, 0.8, 0.6, 0.9, 0.9, 0.3]
# Torso
elif 175 < x < 225 and 150 < y < 400:
sensation_map[y, x] = [0.5, 0.6, 0.7, 0.8, 0.6, 0.7, 0.5]
# Arms
elif (125 < x < 175 or 225 < x < 275) and 150 < y < 350:
sensation_map[y, x] = [0.6, 0.5, 0.9, 0.7, 0.8, 0.6, 0.7]
# Hands
elif (100 < x < 150 or 250 < x < 300) and 300 < y < 350:
sensation_map[y, x] = [0.8, 0.7, 1.0, 0.9, 1.0, 0.8, 0.9]
# Legs
elif 175 < x < 225 and 400 < y < 550:
sensation_map[y, x] = [0.7, 0.4, 0.8, 0.6, 0.7, 0.5, 0.6]
# Feet
elif 175 < x < 225 and 550 < y < 600:
sensation_map[y, x] = [0.9, 0.6, 1.0, 0.8, 0.9, 0.7, 1.0]
else:
sensation_map[y, x] = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
return sensation_map
avatar_sensation_map = create_sensation_map(AVATAR_WIDTH, AVATAR_HEIGHT)
# Create more detailed human-like avatar
def create_avatar():
img = Image.new('RGB', (AVATAR_WIDTH, AVATAR_HEIGHT), color='white')
draw = ImageDraw.Draw(img)
# Head
draw.ellipse([150, 50, 250, 150], fill='beige', outline='black')
# Eyes
draw.ellipse([175, 80, 190, 95], fill='white', outline='black')
draw.ellipse([210, 80, 225, 95], fill='white', outline='black')
draw.ellipse([180, 85, 185, 90], fill='black')
draw.ellipse([215, 85, 220, 90], fill='black')
# Mouth
draw.arc([185, 110, 215, 130], start=0, end=180, fill='black')
# Body
draw.rectangle([175, 150, 225, 400], fill='beige', outline='black')
# Arms
draw.rectangle([125, 150, 175, 350], fill='beige', outline='black')
draw.rectangle([225, 150, 275, 350], fill='beige', outline='black')
# Hands
draw.ellipse([100, 300, 150, 350], fill='beige', outline='black')
draw.ellipse([250, 300, 300, 350], fill='beige', outline='black')
# Legs
draw.rectangle([175, 400, 200, 550], fill='beige', outline='black')
draw.rectangle([200, 400, 225, 550], fill='beige', outline='black')
# Feet
draw.ellipse([165, 550, 210, 600], fill='beige', outline='black')
draw.ellipse([190, 550, 235, 600], fill='beige', outline='black')
return img
avatar_image = create_avatar()
# Streamlit app
st.title("Advanced Humanoid Techno-Sensory Simulation")
# Display avatar
st.image(avatar_image, use_column_width=True)
# Touch input
touch_x = st.slider("Touch X coordinate", 0, AVATAR_WIDTH, AVATAR_WIDTH // 2)
touch_y = st.slider("Touch Y coordinate", 0, AVATAR_HEIGHT, AVATAR_HEIGHT // 2)
# Touch duration
touch_duration = st.slider("Touch duration (seconds)", 0.1, 5.0, 1.0, 0.1)
if st.button("Apply Touch"):
sensation = avatar_sensation_map[touch_y, touch_x]
pain, pleasure, pressure_sens, temp_sens, texture_sens, em_sens, tickle_sens = sensation
measured_pressure = Sensors.measure_pressure(pressure_sens, touch_duration)
measured_temp = Sensors.measure_temperature(37, touch_duration)
measured_texture = Sensors.measure_texture(touch_x, touch_y)
measured_em = Sensors.measure_em_field(touch_x, touch_y) * em_sens
# Calculate overall sensation
pain_level = pain * measured_pressure
pleasure_level = pleasure * (measured_temp - 37) / 5
tickle_level = tickle_sens * (1 - np.exp(-touch_duration / 0.5))
st.write(f"Touch applied at ({touch_x}, {touch_y}) for {touch_duration:.1f} seconds")
st.write(f"Pressure: {measured_pressure:.2f}")
st.write(f"Temperature: {measured_temp:.2f}°C")
st.write(f"Texture: {measured_texture}")
st.write(f"Electromagnetic field: {measured_em:.2f}")
st.write(f"Pain level: {pain_level:.2f}")
st.write(f"Pleasure level: {pleasure_level:.2f}")
st.write(f"Tickle level: {tickle_level:.2f}")
# Generate description
prompt = f"""Human: Describe the sensation when touched at ({touch_x}, {touch_y}) for {touch_duration:.1f} seconds with these measurements:
Pressure: {measured_pressure:.2f}
Temperature: {measured_temp:.2f}°C
Texture: {measured_texture}
Electromagnetic field: {measured_em:.2f}
Resulting in:
Pain: {pain_level:.2f}, Pleasure: {pleasure_level:.2f}, Tickle: {tickle_level:.2f}
Avatar:"""
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=200, num_return_sequences=1, no_repeat_ngram_size=2, top_k=50, top_p=0.95, temperature=0.7)
response = tokenizer.decode(output[0], skip_special_tokens=True).split("Avatar: ")[-1].strip()
st.write("Avatar's response:")
st.write(response)
# Visualize sensation map
st.subheader("Sensation Map Visualization")
fig, axs = plt.subplots(2, 4, figsize=(20, 10))
titles = ['Pain', 'Pleasure', 'Pressure', 'Temperature', 'Texture', 'EM Field', 'Tickle']
for i, title in enumerate(titles):
ax = axs[i // 4, i % 4]
im = ax.imshow(avatar_sensation_map[:, :, i], cmap='viridis')
ax.set_title(title)
fig.colorbar(im, ax=ax)
axs[1, 3].axis('off') # Turn off the last unused subplot
plt.tight_layout()
st.pyplot(fig)
st.write("The sensation map shows the sensitivity of different body parts to various stimuli. Brighter colors indicate higher sensitivity.")
# Add some context about the avatar's sensory capabilities
st.subheader("Avatar Sensory Capabilities")
st.write("""
This advanced humanoid avatar is equipped with cutting-edge sensory technology:
1. Pressure Sensors: Highly sensitive to touch, with increased sensitivity in hands and feet.
2. Temperature Sensors: Can detect slight changes in temperature, simulating human thermal perception.
3. Texture Analysis: Capable of distinguishing between various textures, from smooth to rough.
4. Electromagnetic Field Detection: Mimics the subtle EM sensitivity some humans report.
5. Pain and Pleasure Processing: Simulates the complex interplay of pain and pleasure responses.
6. Tickle Sensation: Replicates the unique tickle response, which can be pleasurable or uncomfortable.
The avatar's responses are generated using an advanced language model, attempting to describe the sensations in human-like terms.
""")
# Footer
st.write("---")
st.write("Advanced Humanoid Techno-Sensory Simulation v1.0")
st.write("Disclaimer: This is a simulation and does not represent actual human sensory experiences.")