jiehou's picture
Update app.py
dba5aeb verified
import pandas as pd
import gradio as gr
import os
import threading
import time
import random
import datetime
import shutil
import matplotlib.pyplot as plt
import numpy as np
PROJECT_ROOT_DIR='./'
IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "images")
os.makedirs(IMAGES_PATH, exist_ok=True)
def draw_classroom(occupy_list={}, center_list = {}, out_path = "layout.png"):
# Function to draw a trapezoid
def draw_trapezoid(ax, center, width, height, table_color, seat_color, tb_idx):
# Calculate the coordinates of the trapezoid
bottom_width = width / 4
top_width = width / 2
coordinates = np.array([
[center[0] - bottom_width, center[1]],
[center[0] - top_width, center[1] + height],
[center[0] + top_width, center[1] + height],
[center[0] + bottom_width, center[1]],
[center[0] - bottom_width, center[1]] # to close the trapezoid
])
# Draw the trapezoid
ax.plot(coordinates[:,0], coordinates[:,1], color=table_color)
loc_x, loc_y = np.mean(coordinates, axis=0)
if tb_idx < 10:
ax.text(loc_x, loc_y, str(tb_idx), bbox=dict(facecolor='lightgray', edgecolor='none', boxstyle='round'), fontsize=12)
else:
ax.text(loc_x-0.1, loc_y+0.1, str(tb_idx), bbox=dict(facecolor='lightgray', edgecolor='none', boxstyle='round'), fontsize=12)
# Draw circles on each side
for i in range(4):
start, end = coordinates[i], coordinates[i+1]
#ax.plot(start, end, 'o', color=color)
xs = np.linspace(start[0], end[0], 5)[2:3]
ys = np.linspace(start[1], end[1], 5)[2:3]
for x, y in zip(xs, ys):
#print(x, y)
if str(tb_idx)+'_'+str(i+1) in occupy_list:
if str(tb_idx)+'_'+str(i+1) in center_list:
ax.plot(x, y, 's', color= center_list[str(tb_idx)+'_'+str(i+1)][1], markersize=20, markeredgecolor = 'black')
else:
ax.plot(x, y, 'o', color= occupy_list[str(tb_idx)+'_'+str(i+1)][1], markersize=20, markeredgecolor = 'black')
else:
ax.plot(x, y, 'o', color=seat_color, markersize=20, markeredgecolor = 'black')
if i == 0:
ax.text(x-0.4,y, str(i+1), fontsize=12)
elif i == 1:
ax.text(x,y+0.2, str(i+1), fontsize=12)
elif i == 2:
ax.text(x+0.2,y, str(i+1), fontsize=12)
elif i == 3:
ax.text(x,y-0.4, str(i+1), fontsize=12)
# Initialize plot
fig, ax = plt.subplots(figsize=(12,10))
# Define classroom layout parameters
tables_in_row = 5
tables_in_column = 5
table_width = 1.5
table_height = 1.5
horizontal_spacing = 1.5
vertical_spacing = 1
# Generate classroom layout
tb_idx = 0
for i in range(tables_in_column):
for j in range(tables_in_row):
center_x = j * (table_width + horizontal_spacing)
center_y = i * (table_height + vertical_spacing)
draw_trapezoid(ax, (center_x, center_y), table_width, table_height, 'gray', 'white', tb_idx)
tb_idx += 1
# Set the aspect of the plot to be equal
ax.set_aspect('equal')
# Remove axes for better visualization
ax.axis('off')
# Show the plot
#plt.show()
print("Saving figure to ",out_path)
fig_extension = 'png'
plt.tight_layout()
plt.savefig(out_path, format=fig_extension, dpi=100)
#return out_path
# Define a lock
file_lock = threading.Lock()
def data_process(layout, step, desk, seatid, color, instructor):
file_path = "data_statistics.csv"
color_map = {"Black (default)": 'black',
"Red (Group 1)": 'red',
"Green (Group 2)": 'green',
"Yellow (Group 3)": 'yellow'}
if color in color_map:
label_color = color_map[color]
else:
label_color = 'black'
# time_elapsed = current_time - previous_time
if instructor == '4. Clean Data':
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_filename = f'data_statistics_{current_time}.csv'
shutil.move(file_path, backup_filename)
# empty file
temp_stat.to_csv(file_path, index=False)
print("Data removed")
else:
print("Emtpy data")
temp_stat.to_csv(file_path, index=False)
return "Result Updated", img_path, temp_stat
elif instructor == '5. Remove step 2 data from table':
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
raw_data = pd.read_csv(file_path)
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_filename = f'data_statistics_{current_time}.csv'
shutil.move(file_path, backup_filename)
# update file
temp_stat = raw_data[raw_data['step'] != 'Step 2: Update the locations of centroids (only for centroid student to select)']
temp_stat.to_csv(file_path, index=False)
print("Data udpated")
print("temp_stat: ",temp_stat)
raw_data_step1 = temp_stat[temp_stat['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
# Reorganize the columns into a dictionary
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
else:
print("Emtpy data")
temp_stat.to_csv(file_path, index=False)
return "Result Updated", img_path, temp_stat
elif instructor == '6. Remove step 3 data from table':
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
raw_data = pd.read_csv(file_path)
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_filename = f'data_statistics_{current_time}.csv'
shutil.move(file_path, backup_filename)
# update file
temp_stat = raw_data[raw_data['step'] != 'Step 3: Find the closest centroid & update cluster label assignments (for all participator)']
temp_stat.to_csv(file_path, index=False)
print("Data udpated")
print("temp_stat: ",temp_stat)
raw_data_step1 = temp_stat[temp_stat['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
# Reorganize the columns into a dictionary
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
else:
print("Emtpy data")
temp_stat.to_csv(file_path, index=False)
return "Result Updated", img_path, temp_stat
elif instructor == '0. Display Statistics':
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
# Reorganize the columns into a dictionary
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, raw_data
elif instructor == '1a. Display Check-in Data (Step 1)':
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
# Reorganize the columns into a dictionary
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, temp_stat
elif instructor == '1b. Display Centroids Data (Step 2)':
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
raw_data_step2 = raw_data[raw_data['step'] == 'Step 2: Update the locations of centroids (only for centroid student to select)']
raw_data_step2 = raw_data_step2.drop_duplicates(subset=['desk', 'seatid'], keep='last')
raw_data_step2 = raw_data_step2.drop_duplicates(subset='color', keep='last').tail(3) # assume three clusters
if len(raw_data_step2) != 0:
result_step2 = raw_data_step2.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step2 = {}
for d in result_step2:
occupy_list_step2.update(d)
print("occupy_list_step2: ", occupy_list_step2)
for key,val in occupy_list_step2.items():
occupy_list[key] = val
# update the centroid colors
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step2.png")
draw_classroom(occupy_list = occupy_list, center_list = occupy_list_step2, out_path = img_path)
else:
# update the centroid colors
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, raw_data_step2
elif instructor == '2. Display Cluster Centroids (Step 2)':
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
raw_data_step2 = raw_data[raw_data['step'] == 'Step 2: Update the locations of centroids (only for centroid student to select)']
raw_data_step2 = raw_data_step2.drop_duplicates(subset=['desk', 'seatid'], keep='last')
raw_data_step2 = raw_data_step2.drop_duplicates(subset='color', keep='last').tail(3) # assume three clusters
if len(raw_data_step2) != 0:
result_step2 = raw_data_step2.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step2 = {}
for d in result_step2:
occupy_list_step2.update(d)
print("occupy_list_step2: ", occupy_list_step2)
for key,val in occupy_list_step2.items():
occupy_list[key] = val
# update the centroid colors
print("occupy_list: ",occupy_list)
if len(raw_data_step2) != 0:
img_path = os.path.join(IMAGES_PATH, "layout_step2.png")
draw_classroom(occupy_list = occupy_list, center_list = occupy_list_step2, out_path = img_path)
else:
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, temp_stat
elif instructor == '3. Display Updated Cluster Labels (Step 3)':
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
raw_data_step2 = raw_data[raw_data['step'] == 'Step 2: Update the locations of centroids (only for centroid student to select)']
raw_data_step2 = raw_data_step2.drop_duplicates(subset=['desk', 'seatid'], keep='last')
raw_data_step2 = raw_data_step2.drop_duplicates(subset='color', keep='last').tail(3) # assume three clusters
if len(raw_data_step2) != 0:
result_step2 = raw_data_step2.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step2 = {}
for d in result_step2:
occupy_list_step2.update(d)
print("occupy_list_step2: ", occupy_list_step2)
for key,val in occupy_list_step2.items():
occupy_list[key] = val
raw_data_step3 = raw_data[raw_data['step'] == 'Step 3: Find the closest centroid & update cluster label assignments (for all participator)']
if len(raw_data_step3) != 0:
result_step3 = raw_data_step3.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step3 = {}
for d in result_step3:
occupy_list_step3.update(d)
print("occupy_list_step3: ", occupy_list_step3)
for key,val in occupy_list_step3.items():
occupy_list[key] = val
# update the centroid colors
print("occupy_list: ",occupy_list)
if len(raw_data_step2) != 0:
img_path = os.path.join(IMAGES_PATH, "layout_step3.png")
draw_classroom(occupy_list = occupy_list, center_list = occupy_list_step2, out_path = img_path)
else:
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, temp_stat
# Acquire the lock
file_lock.acquire()
try:
if step == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)':
label_color = 'black'
if step == 'Step 2: Update the locations of centroids (only for centroid student to select)':
if label_color == 'black':
print("Black color is not allowed in Step 2, please choose another color...")
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
if not os.path.exists(img_path):
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
return "Result Updated", img_path, temp_stat
current_time = datetime.datetime.now()
temp = {"Time":current_time , "layout": layout, "step": step, "desk": int(desk), "seatid": int(seatid), "color": label_color}
temp_stat = pd.DataFrame(temp, index=[0])
time.sleep(random.uniform(0, 5))
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
raw_data = pd.concat([raw_data, temp_stat], ignore_index=True)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
if step != 'None':
raw_data.to_csv(file_path, index=False)
finally:
# Release the lock
file_lock.release()
if layout:
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
file_path = "data_statistics.csv"
if os.path.exists(file_path):
print("File exists. Loading the data")
raw_data = pd.read_csv(file_path)
else:
print("Creating the data")
raw_data = temp_stat
raw_data = raw_data.dropna()
raw_data_step1 = raw_data[raw_data['step'] == 'Step 1: Check-in if you want to participate (provide desk_id, seat_id below)']
if len(raw_data_step1) == 0:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
else:
# Reorganize the columns into a dictionary
result = raw_data_step1.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list = {}
for d in result:
occupy_list.update(d)
print("occupy_list: ",occupy_list)
img_path = os.path.join(IMAGES_PATH, "layout_step1.png")
raw_data_step2 = raw_data[raw_data['step'] == 'Step 2: Update the locations of centroids (only for centroid student to select)']
raw_data_step2 = raw_data_step2.drop_duplicates(subset=['desk', 'seatid'], keep='last')
raw_data_step2 = raw_data_step2.drop_duplicates(subset='color', keep='last').tail(3) # assume three clusters
if len(raw_data_step2) != 0:
result_step2 = raw_data_step2.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step2 = {}
for d in result_step2:
occupy_list_step2.update(d)
for key,val in occupy_list_step2.items():
occupy_list[key] = val
raw_data_step3 = raw_data[raw_data['step'] == 'Step 3: Find the closest centroid & update cluster label assignments (for all participator)']
if len(raw_data_step3) != 0:
result_step3 = raw_data_step3.apply(lambda row: {f"{int(row['desk'])}_{int(row['seatid'])}": ['A', row['color']]}, axis=1)
# Combine dictionaries into a single dictionary
occupy_list_step3 = {}
for d in result_step3:
occupy_list_step3.update(d)
print("occupy_list_step3: ", occupy_list_step3)
for key,val in occupy_list_step3.items():
occupy_list[key] = val
if len(raw_data_step3) == 0:
img_path = os.path.join(IMAGES_PATH, "layout_step2.png")
else:
img_path = os.path.join(IMAGES_PATH, "layout_step3.png")
draw_classroom(occupy_list = occupy_list, center_list = occupy_list_step2, out_path = img_path)
else:
draw_classroom(occupy_list = occupy_list, out_path = img_path)
print("Saving layout image to ",img_path)
return "Result Updated", img_path, temp_stat
else:
img_path = os.path.join(IMAGES_PATH, "layout.png")
if not os.path.exists(img_path):
draw_classroom(occupy_list = [], out_path = img_path)
print("Saving layout image to ",img_path)
temp = {"Time":[] , "layout": [], "step": [], "desk": [], "seatid": [], "color": []}
temp_stat = pd.DataFrame(temp)
return "Result Updated", img_path, temp_stat
set_layout = gr.Checkbox(label="Show Classroom Layout", value=True, info="Find desk id and seat id in classroom (Check this box, click 'Submit')")
set_step = gr.Dropdown(
["None", "Step 1: Check-in if you want to participate (provide desk_id, seat_id below)",
"Step 2: Update the locations of centroids (only for centroid student to select)",
"Step 3: Find the closest centroid & update cluster label assignments (for all participator)"],
value="None", label="1. Select the algorithm step"
)
set_desk = gr.Dropdown(
[i for i in range(0,25)],
value=0, label="2. Submit your Desk ID (Check Classroom Layout)"
)
set_seatid = gr.Dropdown(
[i for i in range(1,5)],
value=1, label="3. Submit your Seat ID (Check Classroom Layout)"
)
set_color = gr.Dropdown(
["Black (default)",
"Red (Group 1)",
"Green (Group 2)",
"Yellow (Group 3)"],
value="Black (default)", label="4. Pick your seat color (Cluster label)"
)
set_instructor = gr.Dropdown(
["I am student",
"0. Display Statistics",
"1a. Display Check-in Data (Step 1)",
"1b. Display Centroids Data (Step 2)",
"2. Display Cluster Centroids (Step 2)",
"3. Display Updated Cluster Labels (Step 3)",
"4. Clean Data",
"5. Remove step 2 data from table",
"6. Remove step 3 data from table"],
value="I am student", label="5. For instructor use only. For students, please always keep 'I am student'"
)
set_output = gr.Textbox(label="Status")
# define output as the single class text
set_out_images = gr.Image(label="Classroom Layout")
set_output2 = gr.Dataframe(
headers=["Time","layout","step","desk","seatid","color"],
datatype=["str","str", "str", "str", "str", "str"],
label = 'Statistics'
)
### configure gradio, detailed can be found at https://www.gradio.app/docs/#i_slider
interface = gr.Interface(fn=data_process,
inputs=[set_layout, set_step, set_desk, set_seatid, set_color, set_instructor],
outputs=[set_output,set_out_images,set_output2],
title="CSCI4750/5750 Demo 4: In-class Practice for Seat Clustering in BSC 253",
description= "Author: Jie Hou. \nPlease follow instructions in class",
theme = 'huggingface'
)
interface.launch(debug=True)