Come usare una posenet con tensorflow.js per valutare il movimento del corpo
In questo articolo voglio lasciarvi un esempio su come sia possibile intercettare la posizione del corpo attraverso l’uso di una rete neurale preaddestrata chiamata posenet rilasciata da google. PoseNet è, infatti, un modello di visione che può essere utilizzato per stimare la posizione/postura di una persona. Ho riscritto un esempio in javascript nella sua forma più elementare/essenziale per una maggiore comprensione del contesto. Riporto l’esempio e lo commenterò di seguito. Potete, nel frattempo, osservare il risultato direttamente attraverso l’esempio live. Non vi preoccupate, non verrà conservata alcuna informazione provenientte dalla webcam, potete,quindi, tranquillamente attivarla. Per comodità lascio qui il codice di esempio.
Array delle posizione del corpo ... Attendi un attimo
Il codice html è veramente minimale, dovrete inserire le istruzioni per caricare il modello e tensorflow e preparare il canvas per la gestione delle immagini/frames catturate dalla webcam.
<html> <head> <!-- Load TensorFlow.js --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>che <!-- Load Posenet --> <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/posenet"></script> </head> <body> <div id="Container"> <video autoplay="true" width="640" height="480" id="videoElement"></video> <canvas id="myCanvas" width="640" height="480"></canvas> <p><span id ="poseElementId">Array delle posizione del corpo ... Attendi un attimo</span></p> </div> </body> </html>
var imageElement; var c; var ctx; setTimeout(function(){ startVideo(); c = document.getElementById("myCanvas"); ctx = c.getContext("2d"); }, 3000);
Questa funzione provvederà ad avviare le webcam ed a richiamare la funzione di inferenza (getSinglePose) per il calcolo delle posizione del corpo
function startVideo() { var video = document.querySelector('video'),canvas; imageElement=video; console.log("navigator " + navigator.mediaDevices) if (navigator.mediaDevices) { // access the web cam navigator.mediaDevices.getUserMedia({ video: true }) // permission granted: .then(function(stream) { //video.src = window.URL.createObjectURL(stream); video.srcObject = stream; getSinglePose(imageElement); }) // permission denied: .catch(function(error) { document.body.textContent = 'Could not access the camera.Error:' + error.name; }); return imageElement; }
Lo script che esegue la prediction e la stima delle posizioni è altrettanto semplice da leggere:
function getSinglePose(imageElement) { posenet.load().then(function(net) { const pose = net.estimateSinglePose(imageElement); return pose; }).then(function(pose){ var keypoints = new Array(); keypoints=pose.keypoints; var poseElement = document.getElementById('poseElementId'); poseElement.innerHTML=""; for (index=0;index<17;index++) { poseElement.innerHTML += keypoints[index].part + " " + keypoints[index].position.x + " " + keypoints[index].position.y + "<br>"; } getSinglePose(imageElement); }) }
La stima della posizione (estimateSinglePose) usa tecniche di visione artificiale in grado di rilevare figure umane in immagini e video, in modo da poter determinare, ad esempio, dove si trovano il gomito, gli occhi, il naso etc. Per essere chiari, con questo modello non si fa riconoscimento della persona ma solo tracciamento dei movimenti posturali. L’algoritmo individua semplicemente dove si trovano le articolazioni del corpo i punti chiave (keypoints) indicizzati ed identificabili con un id “ID”. Il risultato della stima restituisce anche un punteggio di confidenza compreso tra 0,0 e 1,0, 1,0. Di seguito La label map utilizzata nella addestramento del modello :
Id | Parte del corpo riconosciuta |
---|---|
0 | nose |
1 | leftEye |
2 | rightEye |
3 | leftEar |
4 | rightEar |
5 | leftShoulder |
6 | rightShoulder |
7 | leftElbow |
8 | rightElbow |
9 | leftWrist |
10 | rightWrist |
11 | leftHip |
12 | rightHip |
13 | leftKnee |
14 | rightKnee |
15 | leftAnkle |
16 | rightAnkle |
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments