Stable-Grasping / app_old.py
mohsinmubaraksk's picture
Rename app.py to app_old.py
1dd600d verified
import streamlit as st
import pandas as pd
import joblib
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
# Set the title of the app
st.title("Robotic Grasp Robustness Predictor")
st.markdown("""
This application predicts the stability/robustness of a robotic grasp based on sensor data.
You can either upload a CSV file with sensor features or input values manually.
""")
# Display robotics images at the top
# (Ensure that you have internet access for these images, or replace with local image files)
st.image("https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Robotic_arm_by_Robust_automation_in_Australia.jpg/640px-Robotic_arm_by_Robust_automation_in_Australia.jpg", caption="Robotic Arm", use_column_width=True)
st.image("https://upload.wikimedia.org/wikipedia/commons/9/95/Robotic_arm.jpg", caption="Advanced Robotics", use_column_width=True)
# Load the saved model (make sure the model file 'model.pkl' is in the same directory)
@st.cache_resource
def load_model():
model = joblib.load("model.pkl")
return model
model = load_model()
# Sidebar for input selection
st.sidebar.header("Input Options")
input_method = st.sidebar.radio("Choose input method:", ("CSV Upload", "Manual Input"))
# Define the list of features expected by the model.
# Update these names to match your dataset after cleaning.
FEATURES = [
"H1_F1J2_pos", "H1_F1J2_vel", "H1_F1J2_eff",
"H1_F1J3_pos", "H1_F1J3_vel", "H1_F1J3_eff",
"H1_F1J1_pos", "H1_F1J1_vel", "H1_F1J1_eff",
"H1_F3J1_pos", "H1_F3J1_vel", "H1_F3J1_eff",
"H1_F3J2_pos", "H1_F3J2_vel", "H1_F3J2_eff",
"H1_F3J3_pos", "H1_F3J3_vel", "H1_F3J3_eff",
"H1_F2J1_pos", "H1_F2J1_vel", "H1_F2J1_eff",
"H1_F2J3_pos", "H1_F2J3_vel", "H1_F2J3_eff",
"H1_F2J2_pos", "H1_F2J2_vel", "H1_F2J2_eff"
]
# Option 1: CSV Upload
if input_method == "CSV Upload":
st.header("Upload CSV File")
uploaded_file = st.file_uploader("Upload your CSV file", type=["csv"])
if uploaded_file is not None:
try:
input_df = pd.read_csv(uploaded_file)
st.success("CSV file successfully loaded!")
# Clean column names
input_df.columns = input_df.columns.str.strip()
missing_features = [col for col in FEATURES if col not in input_df.columns]
if missing_features:
st.error(f"The following required feature(s) are missing from the file: {', '.join(missing_features)}")
else:
# Make predictions
predictions = model.predict(input_df[FEATURES])
input_df["Predicted Robustness"] = predictions
# Interactive histogram of predictions
fig_hist = px.histogram(input_df, x="Predicted Robustness", nbins=30,
title="Distribution of Predicted Robustness")
st.plotly_chart(fig_hist, use_container_width=True)
st.subheader("Predictions")
st.dataframe(input_df)
except Exception as e:
st.error(f"Error processing file: {e}")
# Option 2: Manual Input
else:
st.header("Manual Input")
st.markdown("Enter the sensor values for prediction:")
# Radio button for input type selection inside manual input
input_type = st.radio("Select input mode:", ("Custom Input", "API Default Values"))
# Define default API values (adjust these as needed)
default_values = {
"H1_F1J2_pos": 0.5, "H1_F1J2_vel": 0.0, "H1_F1J2_eff": 0.1,
"H1_F1J3_pos": 0.5, "H1_F1J3_vel": 0.0, "H1_F1J3_eff": 0.1,
"H1_F1J1_pos": 0.5, "H1_F1J1_vel": 0.0, "H1_F1J1_eff": 0.1,
"H1_F3J1_pos": 1.0, "H1_F3J1_vel": 0.0, "H1_F3J1_eff": 0.2,
"H1_F3J2_pos": 1.0, "H1_F3J2_vel": 0.0, "H1_F3J2_eff": 0.2,
"H1_F3J3_pos": 1.0, "H1_F3J3_vel": 0.0, "H1_F3J3_eff": 0.2,
"H1_F2J1_pos": 0.7, "H1_F2J1_vel": 0.0, "H1_F2J1_eff": 0.15,
"H1_F2J3_pos": 0.7, "H1_F2J3_vel": 0.0, "H1_F2J3_eff": 0.15,
"H1_F2J2_pos": 0.7, "H1_F2J2_vel": 0.0, "H1_F2J2_eff": 0.15,
}
input_data = {}
with st.expander("F1 Joint Sensors"):
st.write("Sensors for Finger 1:")
input_data["H1_F1J2_pos"] = st.number_input("H1_F1J2_pos",
value=default_values["H1_F1J2_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J2_vel"] = st.number_input("H1_F1J2_vel",
value=default_values["H1_F1J2_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J2_eff"] = st.number_input("H1_F1J2_eff",
value=default_values["H1_F1J2_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
st.write("Sensors for Finger 3:")
input_data["H1_F1J3_pos"] = st.number_input("H1_F1J3_pos",
value=default_values["H1_F1J3_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J3_vel"] = st.number_input("H1_F1J3_vel",
value=default_values["H1_F1J3_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J3_eff"] = st.number_input("H1_F1J3_eff",
value=default_values["H1_F1J3_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
st.write("Sensors for Finger 1 (alternate):")
input_data["H1_F1J1_pos"] = st.number_input("H1_F1J1_pos",
value=default_values["H1_F1J1_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J1_vel"] = st.number_input("H1_F1J1_vel",
value=default_values["H1_F1J1_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F1J1_eff"] = st.number_input("H1_F1J1_eff",
value=default_values["H1_F1J1_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
with st.expander("F3 Joint Sensors"):
input_data["H1_F3J1_pos"] = st.number_input("H1_F3J1_pos",
value=default_values["H1_F3J1_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J1_vel"] = st.number_input("H1_F3J1_vel",
value=default_values["H1_F3J1_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J1_eff"] = st.number_input("H1_F3J1_eff",
value=default_values["H1_F3J1_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J2_pos"] = st.number_input("H1_F3J2_pos",
value=default_values["H1_F3J2_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J2_vel"] = st.number_input("H1_F3J2_vel",
value=default_values["H1_F3J2_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J2_eff"] = st.number_input("H1_F3J2_eff",
value=default_values["H1_F3J2_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J3_pos"] = st.number_input("H1_F3J3_pos",
value=default_values["H1_F3J3_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J3_vel"] = st.number_input("H1_F3J3_vel",
value=default_values["H1_F3J3_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F3J3_eff"] = st.number_input("H1_F3J3_eff",
value=default_values["H1_F3J3_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
with st.expander("F2 Joint Sensors"):
input_data["H1_F2J1_pos"] = st.number_input("H1_F2J1_pos",
value=default_values["H1_F2J1_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J1_vel"] = st.number_input("H1_F2J1_vel",
value=default_values["H1_F2J1_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J1_eff"] = st.number_input("H1_F2J1_eff",
value=default_values["H1_F2J1_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J3_pos"] = st.number_input("H1_F2J3_pos",
value=default_values["H1_F2J3_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J3_vel"] = st.number_input("H1_F2J3_vel",
value=default_values["H1_F2J3_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J3_eff"] = st.number_input("H1_F2J3_eff",
value=default_values["H1_F2J3_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J2_pos"] = st.number_input("H1_F2J2_pos",
value=default_values["H1_F2J2_pos"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J2_vel"] = st.number_input("H1_F2J2_vel",
value=default_values["H1_F2J2_vel"] if input_type=="API Default Values" else 0.0,
format="%.5f")
input_data["H1_F2J2_eff"] = st.number_input("H1_F2J2_eff",
value=default_values["H1_F2J2_eff"] if input_type=="API Default Values" else 0.0,
format="%.5f")
# When the "Predict" button is pressed, perform prediction
if st.button("Predict"):
input_df = pd.DataFrame([input_data])
prediction = model.predict(input_df)
st.success(f"The predicted grasp robustness is: {prediction[0]:.3f}")
# Create a gauge chart using Plotly to visualize the prediction.
# The axis range [0, 100] is an example; adjust based on your data.
fig_gauge = go.Figure(go.Indicator(
mode = "gauge+number",
value = prediction[0],
title = {'text': "Grasp Robustness"},
gauge = {'axis': {'range': [0, 100]},
'bar': {'color': "darkblue"},
'steps' : [
{'range': [0, 30], 'color': "red"},
{'range': [30, 70], 'color': "yellow"},
{'range': [70, 100], 'color': "green"}],
}
))
st.plotly_chart(fig_gauge, use_container_width=True)
# If the model supports feature importances, display them.
try:
feature_importances = model.named_steps['model'].feature_importances_
imp_df = pd.DataFrame({
'Feature': FEATURES,
'Importance': feature_importances
}).sort_values(by='Importance', ascending=False)
st.subheader("Feature Importances")
fig_imp = px.bar(imp_df, x='Feature', y='Importance', title="Feature Importances")
st.plotly_chart(fig_imp, use_container_width=True)
except Exception as ex:
st.info("Feature importance is not available for this model.")