🏠

GymTrackerAI

Allenati. Monitorati.

Presentazione

GymTrackerAI è un'applicazione progettata per offrire un sistema completo di monitoraggio delle attività fisiche, pensato per l’allenamento in palestra. Si basa sull’uso del dispositivo SensorTile.box PRO di STMicroelectronics per la raccolta dei dati biometrici e prevede l’utilizzo di due modelli di Machine Learning: uno eseguito direttamente sulla board e uno integrato nello smartphone.

Grazie alla SensorTile.box PRO, che include sensori avanzati come accelerometro, giroscopio e magnetometro, l’app è in grado di acquisire dati relativi ai movimenti dell’utente e all’ambiente in cui si allena.

GymTrackerAI sfrutta al massimo queste tecnologie per riconoscere e classificare esercizi fitness come Plank, JumpingJack e SquatJack, garantendo un monitoraggio accurato e in tempo reale.

Il progetto segue un approccio basato su Edge Computing, elaborando i dati direttamente sul dispositivo per offrire risposte immediate e rendere il riconoscimento delle attivitĂ  autonomo tramite connessione internet.


GitHub Complete Project:

SensorTile.box PRO

FunzionalitĂ 

FunzionalitĂ  App

Architettura

Il funzionamento dell’intero sistema è descritto graficamente nel diagramma seguente:


Architettura GymTrackerAI

Il sistema GymTrackerAI si basa su un’architettura composta da tre componenti principali: app Android, servizio backend e modello di Machine Learning esterno.

Il processo inizia con la raccolta dei dati dal sensore SensorTile.box PRO, tramite connessione Bluetooth Low Energy (BLE) realizzata usando lo ST BlueST SDK. L’app Android (scritta in Kotlin e Jetpack Compose) riceve i dati grezzi dell’accelerometro e li invia in tempo reale al backend per essere classificati tramite un modello di Machine Learning.

Il modello ML, un Random Forest Classifier pre-addestrato in Python, è convertito in .onnx e servito tramite un microservizio Python Dockerizzato. I dati vengono prima pre-elaborati tramite preprocessing.py, usando scikit-learn, pandas e NumPy, e successivamente classificati.

Dopo la classificazione, le attivitĂ  riconosciute vengono inviate al backend Java Spring Boot, che gestisce due funzionalitĂ  principali:

  • Autenticazione: gestione di login, registrazione e aggiornamento password tramite JWT.
  • Gestione sessioni: salvataggio, storico ed eliminazione delle sessioni di allenamento. I dati vengono archiviati su MySQL.

Tutti i componenti sono containerizzati tramite Docker, garantendo isolamento e semplicitĂ  di esecuzione. Il frontend comunica via HTTP con backend e servizio ML esterno.

Al termine di ogni sessione, l’utente può visualizzare:

  • Il tipo di esercizio svolto
  • Il numero di ripetizioni
  • La durata totale
  • Lo storico completo sincronizzato con il backend

Casi d'uso e di Sequenza

In questa sezione viene illustrato il diagramma dei casi d'uso e i diagrammi di sequenza:


Diagramma Casi d’Uso GymTrackerAI

Registrazione
L'utente può registrarsi inserendo nome, cognome, email e password. Dopo la registrazione, può accedere all’app.


Login
L’utente inserisce email e password per accedere. Se corrette, viene reindirizzato alla dashboard per consultare dati e statistiche.


Modifica Dati Utente
Prima del login, l’utente può aggiornare i propri dati personali (password).


Collegamento Bluetooth SensorTile.box PRO
L’utente può connettere la SensorTile.box PRO tramite Bluetooth allo smartphone per iniziare la raccolta dei dati sensoriali.


Visualizzazione Dati Sensori
Una volta connessa la board, l’utente può visualizzare in tempo reale i dati provenienti da accelerometro, giroscopio e magnetometro.


Visualizzazione Riconoscimento SensorTile.box PRO
L’utente può vedere le attività riconosciute in tempo reale dal modello Decision Tree eseguito direttamente sulla board.


Visualizzazione Riconoscimento Smartphone
Le attività rilevate dal Random Forest in esecuzione sullo smartphone sono mostrate all’utente e inviate al backend per salvataggio.


Visualizzazione Stima AttivitĂ  e Durata Giornaliera
L’utente ha accesso alla stima della durata degli esercizi giornalieri e al confronto con i giorni precedenti.


Visualizzazione Storico AttivitĂ 
È possibile consultare lo storico delle attività svolte ogni giorno, con durata aggregata per esercizio, registrate nel backend.

Sviluppo

Il progetto GymTrackerAI è stato sviluppato integrando diverse tecnologie e linguaggi di programmazione per garantire un sistema robusto, scalabile e interattivo. Di seguito sono elencati i principali strumenti utilizzati:

Front-end

L’applicazione GymTrackerAI è stata sviluppata in Kotlin utilizzando Jetpack Compose per la realizzazione della UI e lo ST BlueST SDK per la gestione della comunicazione Bluetooth Low Energy con il dispositivo SensorTile.box PRO.

Il flusso utente è strutturato in più sezioni: l’utente può registrarsi, effettuare il login e recuperare la password tramite API REST, con autenticazione gestita via token JWT. Una volta autenticato, può accedere alla sezione allenamento e avviare la scansione e connessione BLE alla SensorTile.box PRO.

Durante l’allenamento, l’app riceve in tempo reale i dati dell’accelerometro dal sensore, li aggrega e li invia al backend, che si occupa di inoltrarli al servizio ML per la classificazione. Il tipo di esercizio riconosciuto viene mostrato dinamicamente all’utente, insieme al tempo e al conteggio delle ripetizioni.

Al termine della sessione, l’utente può visualizzare un resoconto dettagliato dell’allenamento, che viene automaticamente salvato nel database remoto e aggregato con lo storico.

La sezione storico permette di consultare i workout passati (data, tipo di esercizio, durata, ripetizioni), sincronizzati con il backend. Il frontend si interfaccia in modo completo anche con il servizio esterno di ML e garantisce fluiditĂ  e continuitĂ  nella gestione del sensore durante l'intero flusso utente.

Back-end

Il backend è stato sviluppato utilizzando il framework Spring Boot in modalità monolitica, senza microservizi separati. Tutti i controller e i servizi sono contenuti all’interno dello stesso progetto. Il backend è containerizzato con Docker ed è progettato per integrarsi con il frontend Android e con il modello di Machine Learning.

Le API RESTful gestiscono l’autenticazione, la gestione degli utenti e la registrazione/storico delle sessioni di allenamento.


API di Autenticazione e Utente

  • POST /auth/register
    Registra un nuovo utente nel sistema.
  • POST /auth/login
    Esegue il login restituendo un JWT token per l’autenticazione.
  • POST /auth/reset-password
    Aggiorna la password dell’utente tramite email e nuova password.

Tutte le richieste successive richiedono il token nel formato: Authorization: Bearer <token>


API Sessioni di Allenamento

  • POST /workout/save
    Salva o aggiorna una sessione di allenamento per l’utente autenticato. Se una sessione per lo stesso esercizio e data esiste, somma tempo e ripetizioni.
  • GET /workout/history
    Restituisce lo storico aggregato delle sessioni dell’utente, ordinate per data decrescente. Ogni giorno contiene al massimo una riga per ogni esercizio.
  • DELETE /workout/deleteByDate?date=YYYY-MM-DD
    Elimina tutte le sessioni dell’utente per una determinata data.





Architettura backend GymTrackerAI

Training

Il dataset di GymTrackerAI è stato ottenuto raggruppando i dati dell’accelerometro in finestre temporali di 60 campioni, corrispondenti a circa 2 secondi di movimento a 30 Hz. Questo approccio permette di estrarre informazioni significative per la classificazione degli esercizi. I dati sono etichettati per le classi Plank, JumpingJack e SquatJack, e salvati nel file dataset_index.csv, con un totale di 2.590 istanze.

Per ogni finestra, sono state estratte 12 caratteristiche statistiche su ciascun asse X, Y e Z:

  • Media
  • Varianza
  • Peak to Peak
  • Zero Crossings
L’intero processo di estrazione è stato realizzato nello script preprocessing.py, che gestisce la lettura, segmentazione e normalizzazione dei dati.

Il modello è stato sviluppato usando Random Forest (implementato in random_forest.py), con 500 alberi e una profondità massima di 10. È stato addestrato con uno split 80/20 e valutato anche tramite Leave-One-Out Cross Validation (LOOCV).

Le metriche di valutazione analizzate includono:

  • Accuracy: Percentuale di istanze classificate correttamente
  • Precision: Quanto il modello è affidabile nel riconoscere correttamente una classe
  • Recall: Quanto il modello riesce a identificare tutte le istanze reali di una classe
  • F1-Score: Media armonica tra Precision e Recall
  • Support: Numero di istanze reali per ogni classe nel test set

Il modello ha ottenuto prestazioni elevate:

  • Accuracy test set: 92.6%
  • LOOCV Accuracy: 92.9%
  • LOOCV Varianza: 0.0661

Le classi Plank e SquatJack sono state riconosciute con alta precisione e recall, mentre JumpingJack ha presentato alcune confusioni, soprattutto con SquatJack. Questo è visibile anche nella matrice di confusione generata.

Al termine della fase di training, il modello è stato esportato in formato .onnx tramite la libreria skl2onnx, salvato come random_forest.onnx e integrato nel sistema GymTrackerAI per l’inferenza real-time.






Report di classificazione


Matrice di confusione


Cross Validation

Demo

Team

Foto Pierluigi Causio

Pierluigi Causio

Matricola: 20105455

Foto Davide Rizzo

Davide Rizzo

Matricola: 20105670

đŸ