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.
[su_box title=”Live Demo” style=”noise” box_color=”#d2c935″ radius=”4″]
Array delle posizione del corpo ... Attendi un attimo
[/su_box]
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 |

Comments