Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -25,21 +25,21 @@ tokenizer, model = load_model()
|
|
25 |
class PressureSensor:
|
26 |
def __init__(self, sensitivity=1.0):
|
27 |
self.sensitivity = sensitivity
|
28 |
-
|
29 |
def measure(self, pressure):
|
30 |
return pressure * self.sensitivity
|
31 |
|
32 |
class TemperatureSensor:
|
33 |
def __init__(self, base_temp=37.0):
|
34 |
self.base_temp = base_temp
|
35 |
-
|
36 |
def measure(self, touch_temp):
|
37 |
return self.base_temp + (touch_temp - self.base_temp) * 0.1
|
38 |
|
39 |
class TextureSensor:
|
40 |
def __init__(self):
|
41 |
self.textures = ["smooth", "rough", "bumpy", "silky", "grainy"]
|
42 |
-
|
43 |
def measure(self, x, y):
|
44 |
return self.textures[hash((x, y)) % len(self.textures)]
|
45 |
|
@@ -52,17 +52,17 @@ def create_sensation_map(width, height):
|
|
52 |
sensation_map = np.zeros((height, width, 7)) # RGBPVTE channels for pain, pleasure, neutral, pressure, velocity, temperature, and EM sensitivity
|
53 |
for y in range(height):
|
54 |
for x in range(width):
|
55 |
-
pain = np.exp(-((x - 100)
|
56 |
-
pleasure = np.exp(-((x - 200)
|
57 |
neutral = 1 - (pain + pleasure)
|
58 |
-
pressure = np.exp(-((x - 50)
|
59 |
-
|
60 |
-
velocity = np.exp(-((x - 200)
|
61 |
-
temperature = np.exp(-((x - 200)
|
62 |
-
em_sensitivity = np.exp(-((x - 200)
|
63 |
-
|
64 |
sensation_map[y, x] = [pain, pleasure, neutral, pressure, velocity, temperature, em_sensitivity]
|
65 |
-
|
66 |
return sensation_map
|
67 |
|
68 |
avatar_sensation_map = create_sensation_map(AVATAR_WIDTH, AVATAR_HEIGHT)
|
@@ -77,21 +77,21 @@ em_sensor = EMFieldSensor()
|
|
77 |
def create_avatar():
|
78 |
img = Image.new('RGB', (AVATAR_WIDTH, AVATAR_HEIGHT), color='white')
|
79 |
draw = ImageDraw.Draw(img)
|
80 |
-
|
81 |
# Head
|
82 |
draw.ellipse([150, 50, 250, 150], fill='beige', outline='black')
|
83 |
-
|
84 |
# Body
|
85 |
draw.rectangle([175, 150, 225, 400], fill='beige', outline='black')
|
86 |
-
|
87 |
# Arms
|
88 |
draw.rectangle([125, 150, 175, 350], fill='beige', outline='black')
|
89 |
draw.rectangle([225, 150, 275, 350], fill='beige', outline='black')
|
90 |
-
|
91 |
# Legs
|
92 |
draw.rectangle([175, 400, 200, 550], fill='beige', outline='black')
|
93 |
draw.rectangle([200, 400, 225, 550], fill='beige', outline='black')
|
94 |
-
|
95 |
return img
|
96 |
|
97 |
avatar_image = create_avatar()
|
@@ -126,16 +126,16 @@ with col2:
|
|
126 |
def calculate_sensation(x, y, pressure, velocity):
|
127 |
sensation = avatar_sensation_map[int(y), int(x)]
|
128 |
pain, pleasure, neutral, pressure_sensitivity, velocity_sensitivity, temp_sensitivity, em_sensitivity = sensation
|
129 |
-
|
130 |
measured_pressure = pressure_sensor.measure(pressure * pressure_sensitivity)
|
131 |
measured_temp = temp_sensor.measure(37 + pressure * 5) # Simulating temperature increase with pressure
|
132 |
measured_texture = texture_sensor.measure(x, y)
|
133 |
measured_em = em_sensor.measure(x, y) * em_sensitivity
|
134 |
-
|
135 |
modified_pain = pain * measured_pressure / 10
|
136 |
modified_pleasure = pleasure * velocity * velocity_sensitivity
|
137 |
modified_neutral = neutral * (1 - (measured_pressure + velocity) / 2)
|
138 |
-
|
139 |
return modified_pain, modified_pleasure, modified_neutral, measured_pressure, measured_temp, measured_texture, measured_em
|
140 |
|
141 |
def generate_description(x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em):
|
@@ -147,10 +147,10 @@ def generate_description(x, y, pressure, velocity, pain, pleasure, neutral, meas
|
|
147 |
Resulting in:
|
148 |
Pain: {pain:.2f}, Pleasure: {pleasure:.2f}, Neutral: {neutral:.2f}
|
149 |
Avatar:"""
|
150 |
-
|
151 |
input_ids = tokenizer.encode(prompt, return_tensors="pt")
|
152 |
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)
|
153 |
-
|
154 |
return tokenizer.decode(output[0], skip_special_tokens=True).split("Avatar: ")[-1].strip()
|
155 |
|
156 |
# Initialize session state
|
@@ -164,24 +164,24 @@ if canvas_result.json_data is not None:
|
|
164 |
new_points = objects[-1].get("points", [])
|
165 |
if new_points:
|
166 |
for i in range(1, len(new_points)):
|
167 |
-
x1, y1 = new_points[i
|
168 |
x2, y2 = new_points[i]["x"], new_points[i]["y"]
|
169 |
-
|
170 |
# Calculate pressure and velocity
|
171 |
-
distance = np.sqrt((x2 - x1)
|
172 |
velocity = distance / 0.01 # Assuming 10ms between points
|
173 |
pressure = 1 + velocity / 100 # Simple pressure model
|
174 |
-
|
175 |
x, y = (x1 + x2) / 2, (y1 + y2) / 2
|
176 |
pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em = calculate_sensation(x, y, pressure, velocity)
|
177 |
-
|
178 |
st.session_state.touch_history.append((x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em))
|
179 |
|
180 |
# Display touch history and generate descriptions
|
181 |
if st.session_state.touch_history:
|
182 |
st.subheader("Touch History and Sensations")
|
183 |
-
for x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em in
|
184 |
-
|
185 |
st.write(f"Touch at ({x:.1f}, {y:.1f})")
|
186 |
st.write(f"Pressure: {measured_pressure:.2f}, Temperature: {measured_temp:.2f}°C")
|
187 |
st.write(f"Texture: {measured_texture}, EM Field: {measured_em:.2f}")
|
|
|
25 |
class PressureSensor:
|
26 |
def __init__(self, sensitivity=1.0):
|
27 |
self.sensitivity = sensitivity
|
28 |
+
|
29 |
def measure(self, pressure):
|
30 |
return pressure * self.sensitivity
|
31 |
|
32 |
class TemperatureSensor:
|
33 |
def __init__(self, base_temp=37.0):
|
34 |
self.base_temp = base_temp
|
35 |
+
|
36 |
def measure(self, touch_temp):
|
37 |
return self.base_temp + (touch_temp - self.base_temp) * 0.1
|
38 |
|
39 |
class TextureSensor:
|
40 |
def __init__(self):
|
41 |
self.textures = ["smooth", "rough", "bumpy", "silky", "grainy"]
|
42 |
+
|
43 |
def measure(self, x, y):
|
44 |
return self.textures[hash((x, y)) % len(self.textures)]
|
45 |
|
|
|
52 |
sensation_map = np.zeros((height, width, 7)) # RGBPVTE channels for pain, pleasure, neutral, pressure, velocity, temperature, and EM sensitivity
|
53 |
for y in range(height):
|
54 |
for x in range(width):
|
55 |
+
pain = np.exp(-((x - 100)**2 + (y - 150)**2) / 5000) + np.exp(-((x - 300)**2 + (y - 450)**2) / 5000)
|
56 |
+
pleasure = np.exp(-((x - 200)**2 + (y - 300)**2) / 5000) + np.exp(-((x - 100)**2 + (y - 500)**2) / 5000)
|
57 |
neutral = 1 - (pain + pleasure)
|
58 |
+
pressure = (np.exp(-((x - 50)**2 + (y - 150)**2) / 2000) + np.exp(-((x - 350)**2 + (y - 150)**2) / 2000) +
|
59 |
+
np.exp(-((x - 100)**2 + (y - 550)**2) / 2000) + np.exp(-((x - 300)**2 + (y - 550)**2) / 2000))
|
60 |
+
velocity = np.exp(-((x - 200)**2 + (y - 100)**2) / 5000) + np.exp(-((x - 200)**2 + (y - 300)**2) / 5000)
|
61 |
+
temperature = np.exp(-((x - 200)**2 + (y - 200)**2) / 10000) # more sensitive in the core
|
62 |
+
em_sensitivity = np.exp(-((x - 200)**2 + (y - 100)**2) / 8000) # more sensitive in the head
|
63 |
+
|
64 |
sensation_map[y, x] = [pain, pleasure, neutral, pressure, velocity, temperature, em_sensitivity]
|
65 |
+
|
66 |
return sensation_map
|
67 |
|
68 |
avatar_sensation_map = create_sensation_map(AVATAR_WIDTH, AVATAR_HEIGHT)
|
|
|
77 |
def create_avatar():
|
78 |
img = Image.new('RGB', (AVATAR_WIDTH, AVATAR_HEIGHT), color='white')
|
79 |
draw = ImageDraw.Draw(img)
|
80 |
+
|
81 |
# Head
|
82 |
draw.ellipse([150, 50, 250, 150], fill='beige', outline='black')
|
83 |
+
|
84 |
# Body
|
85 |
draw.rectangle([175, 150, 225, 400], fill='beige', outline='black')
|
86 |
+
|
87 |
# Arms
|
88 |
draw.rectangle([125, 150, 175, 350], fill='beige', outline='black')
|
89 |
draw.rectangle([225, 150, 275, 350], fill='beige', outline='black')
|
90 |
+
|
91 |
# Legs
|
92 |
draw.rectangle([175, 400, 200, 550], fill='beige', outline='black')
|
93 |
draw.rectangle([200, 400, 225, 550], fill='beige', outline='black')
|
94 |
+
|
95 |
return img
|
96 |
|
97 |
avatar_image = create_avatar()
|
|
|
126 |
def calculate_sensation(x, y, pressure, velocity):
|
127 |
sensation = avatar_sensation_map[int(y), int(x)]
|
128 |
pain, pleasure, neutral, pressure_sensitivity, velocity_sensitivity, temp_sensitivity, em_sensitivity = sensation
|
129 |
+
|
130 |
measured_pressure = pressure_sensor.measure(pressure * pressure_sensitivity)
|
131 |
measured_temp = temp_sensor.measure(37 + pressure * 5) # Simulating temperature increase with pressure
|
132 |
measured_texture = texture_sensor.measure(x, y)
|
133 |
measured_em = em_sensor.measure(x, y) * em_sensitivity
|
134 |
+
|
135 |
modified_pain = pain * measured_pressure / 10
|
136 |
modified_pleasure = pleasure * velocity * velocity_sensitivity
|
137 |
modified_neutral = neutral * (1 - (measured_pressure + velocity) / 2)
|
138 |
+
|
139 |
return modified_pain, modified_pleasure, modified_neutral, measured_pressure, measured_temp, measured_texture, measured_em
|
140 |
|
141 |
def generate_description(x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em):
|
|
|
147 |
Resulting in:
|
148 |
Pain: {pain:.2f}, Pleasure: {pleasure:.2f}, Neutral: {neutral:.2f}
|
149 |
Avatar:"""
|
150 |
+
|
151 |
input_ids = tokenizer.encode(prompt, return_tensors="pt")
|
152 |
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)
|
153 |
+
|
154 |
return tokenizer.decode(output[0], skip_special_tokens=True).split("Avatar: ")[-1].strip()
|
155 |
|
156 |
# Initialize session state
|
|
|
164 |
new_points = objects[-1].get("points", [])
|
165 |
if new_points:
|
166 |
for i in range(1, len(new_points)):
|
167 |
+
x1, y1 = new_points[i-1]["x"], new_points[i-1]["y"]
|
168 |
x2, y2 = new_points[i]["x"], new_points[i]["y"]
|
169 |
+
|
170 |
# Calculate pressure and velocity
|
171 |
+
distance = np.sqrt((x2 - x1)**2 + (y2 - y1)**2)
|
172 |
velocity = distance / 0.01 # Assuming 10ms between points
|
173 |
pressure = 1 + velocity / 100 # Simple pressure model
|
174 |
+
|
175 |
x, y = (x1 + x2) / 2, (y1 + y2) / 2
|
176 |
pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em = calculate_sensation(x, y, pressure, velocity)
|
177 |
+
|
178 |
st.session_state.touch_history.append((x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em))
|
179 |
|
180 |
# Display touch history and generate descriptions
|
181 |
if st.session_state.touch_history:
|
182 |
st.subheader("Touch History and Sensations")
|
183 |
+
for (x, y, pressure, velocity, pain, pleasure, neutral, measured_pressure, measured_temp, measured_texture, measured_em) in \
|
184 |
+
st.session_state.touch_history[-5:]:
|
185 |
st.write(f"Touch at ({x:.1f}, {y:.1f})")
|
186 |
st.write(f"Pressure: {measured_pressure:.2f}, Temperature: {measured_temp:.2f}°C")
|
187 |
st.write(f"Texture: {measured_texture}, EM Field: {measured_em:.2f}")
|