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:
Il funzionamento dellâintero sistema è descritto graficamente nel diagramma seguente:
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:
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:
In questa sezione viene illustrato il diagramma dei casi d'uso e i diagrammi di sequenza:
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.
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:
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.
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.
POST /auth/register
POST /auth/login
POST /auth/reset-password
Tutte le richieste successive richiedono il token nel formato: Authorization: Bearer <token>
POST /workout/save
GET /workout/history
DELETE /workout/deleteByDate?date=YYYY-MM-DD
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:
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:
Il modello ha ottenuto prestazioni elevate:
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.