Spaces:
Sleeping
Sleeping
import numpy as np | |
import pandas as pd | |
import gradio as gr | |
import plotly.graph_objs as go | |
from plotly.subplots import make_subplots | |
import datetime | |
# Function to load data from a text file into a numpy array of the right format | |
def load_data(filename): | |
with open(filename, 'r') as file: | |
data = [int(line.strip()) for line in file] | |
data = np.array(data, dtype=int) | |
data[data == -100] = -1 | |
return data.reshape((-1, 1)) | |
def process_csv(file): | |
if file is None: | |
gr.Warning("No file uploaded") | |
# Load the data | |
acc_data = np.load(file) | |
predicted_labels = load_data('003_1_R.txt') | |
# Append the new columns | |
complete_array = np.hstack((acc_data, predicted_labels)) | |
# Define the time axis | |
duration = 33.333333 # milliseconds | |
num_samples = complete_array.shape[0] | |
time_axis = np.arange(0, num_samples * duration, duration) | |
# Convert time axis to datetime objects | |
start_time = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) | |
time_axis_datetime = [start_time + datetime.timedelta(milliseconds=int(t)) for t in time_axis] | |
# Convert datetime objects to formatted strings | |
time_axis_labels = [t.strftime('%H:%M:%S.%f')[:-3] for t in time_axis_datetime] | |
# Calculate the total number of predicted functional and non-functional activity | |
total_predicted_functional = np.sum(complete_array[:, 3] != 0) | |
total_predicted_non_functional = np.sum(complete_array[:, 3] == 0) | |
# Calculate percentages | |
predicted_functional_percentage = (total_predicted_functional / len(complete_array)) * 100 | |
predicted_non_functional_percentage = (total_predicted_non_functional / len(complete_array)) * 100 | |
# Formulate return string | |
return_string = f"Percentage of predicted functional activity: {predicted_functional_percentage:.2f}%\nPercentage of predicted non-functional activity: {predicted_non_functional_percentage:.2f}%" | |
# Create subplots | |
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_heights=[0.6, 0.4], specs=[[{"type": "scatter"}], [{"type": "scatter"}]]) | |
# Add traces to the subplots | |
fig.add_trace(go.Scatter(x=time_axis_labels, y=complete_array[:, 0], mode='lines', name='Acc X', line=dict(width=0.75)), row=1, col=1) | |
fig.add_trace(go.Scatter(x=time_axis_labels, y=complete_array[:, 1], mode='lines', name='Acc Y', line=dict(width=0.75)), row=1, col=1) | |
fig.add_trace(go.Scatter(x=time_axis_labels, y=complete_array[:, 2], mode='lines', name='Acc Z', line=dict(width=0.75)), row=1, col=1) | |
fig.add_trace(go.Scatter(x=time_axis_labels, y=complete_array[:, 3], mode='lines', name='Predicted labels', line=dict(width=1)), row=2, col=1) | |
# Update layout | |
fig.update_layout( | |
title='Accelerometer Data with Annotated Labels', | |
xaxis=dict(title='Time (milliseconds)'), | |
yaxis=dict(title='Accelerometer Data'), | |
yaxis2=dict(title='Predicted'), | |
showlegend=True, | |
height=600 | |
) | |
return return_string, fig | |
with gr.Blocks(theme=gr.themes.Base()) as demo: | |
gr.Markdown( | |
""" | |
# Functional Upper Limb Activity Recognition Model | |
Upload your csv file containing accelerometer data to obtain a prediction on the amount of functional activity of the upper limbs. | |
""") | |
with gr.Row(equal_height=True): | |
with gr.Column(): | |
input_file = gr.File(label="Upload CSV file") | |
with gr.Row(): | |
submit_btn = gr.Button("Submit", variant='primary') | |
clear_btn = gr.ClearButton(input_file, variant='secondary') | |
output_text = gr.Textbox(label="Prediction statistics") | |
output_plot = gr.Plot(label="CSV Plot") | |
submit_btn.click(fn=process_csv, inputs=input_file, outputs=[output_text, output_plot]) | |
clear_btn.click(fn=lambda: input_file.reinit()) | |
demo.launch() | |