En but de créer des jeux en utilisant les mouvements et gestes du corps, nous avons choisis de développer avec MediaPipe des outils permettant d’avoir la base de ce que l’on pourra utiliser pour les jeux.
Pour l’instant il est à noter que nous ne pouvons ne nous référer qu’à des jeux 2D et de positions, le mouvement étant la transition entre deux positions dans une intervalle t, et la 3D n’étant pas disponibles avec la caméra actuelle.
Ce projet a pu répondre aux compétences :
Organiser son développement professionnel
Travailler en mode projet
Travailler en mode projet
Le projet permettant d'estimer les temps de réalisations, les coûts matériels et humains possible, il entre dans le cadre"Analyser les objectifs et les modalités d’organisation d’un projet" et "Évaluer les indicateurs de suivi d’un projet et analyser les écarts".
Le projet permet aussi de répondre à la compétence d'organisation de son développement pro puisqu'elle répond à "Mettre en place son environnement d’apprentissage personnel" et "Mettre en œuvre des outils et stratégies de veille informationnelle" puisque c'est une veille technologique en vue de débuter un projet.
Organiser son développement professionnel
Pourquoi faire ?
Il y a différentes technologies utilisables afin de capter le mouvement, la première et la plus simple est directement l’intégration de la vue caméra sur Unity, en effet en prenant un segment de la caméra, en prenant une moyenne de sa colorimétrie (moyenne de tout les pixels) et en la comparant tout le temps à l’instant t, lorsqu’il y aura une entrée d’un objet quelconque, par exemple, une main, il y aura un changement significatif de la colorimétrie. Cependant, cela impose des contraintes demandant de ne pas avoir d’objet en mouvement devant la caméra autre que le joueur, notamment si l’on demande des mouvements aux jambes (beaucoup de faux positif possible).
Il serait aussi possible de recalculer la position d’un objet x en calibrant au début la personne, cherchant dans un cadrillage prédéfinis les endroits où la couleur et la même afin de traquer les mouvements. Et des suites de couleurs (par exemple bleu à marrons) pour un passage de tee-shirt à la peau de la personne, et ainsi diminuer les faux positif. malheureusement ils sont encore très nombreux, surtout si les objets bougent à côté de la personne et sont d’une couleur semblable aux couleurs du joueur (tee-shirt, peau, pantalon). Ce qui fait que les jeux utilisant cette techniques ne pourraient pas être joué par tous dans des conditions similaires. Ou qu’il faudrait un calibrage précis avant de pouvoir jouer.
Outils utilisé :
Cependant des technologies de tracking de corps existent déjà, notamment MediaPipe, un projet d’IA porté par google pour ses projets d’intelligence artificielles et de deepLearning.
Cependant, il a été ressorti, depuis la recherche d’outils ci jointe (‣) faites par Rhudy DinaHarison et Olivier Sacré, d’autres outils. Tel que OpenCV, qui a l’avantage d’être complètement Open Source, mais ne procure pas d’avance une gestion des mains et des poses par des points articulaires & le face tracking et qui, en plus, est payant.
Nous pouvons aussi compter Nuitrack qui porpose, les mêmes services que MediaPipe en meilleur qualité, notamment sur la normalisation des points, il est donc plus précis. Cependant il faut payer un coup (50€ par ans pour un usage standard, à voir avec eux pour un usage professionnel). (étude de précision menée par biorxiv, considérant aussi la caméra https://www.stereolabs.com/en-fr/store/products/zed-2i comme la plus performante pour avoir le tracking d’humain, offrant notamment la 3D sans passer par mediaPipe mais en passant par leur propre software + “argument” c’est français donc soumis à la RGPD si transfert de donnée et a une intégration directe à Unity mais, elles sont chères (500 à 600€))
Ainsi, pour l’instant afin de pouvoir créer directement les tests et faire une Proof Of Concept, nous avons décidé d’utiliser MediaPipe, gratuit et efficace, il est la solution de test la plus optimale pour éviter d’avoir un coût de test.
De plus, il permet déjà précisément d’avoir le tracking, autant des mains que du corps permettant d’avoir la détection des gestes (décris plus bas dans la zone technique), et des positions.
Explications techniques :
Pour commencer il faut comprendre l’utilisation de ce dernier. La documentation mediaPipe est déjà très précise mais je tiens à revenir dessus:
Comment sont constitué les squelettes
Ce qu’offre directement MediaPipe sur unity
Constitution du code
et ce pour les mains et pour le corps.
Nous commencerons tout d’abord pour les mains ayant moins de points d’articulation que le corps ou la face.
Comment est constitué le squelette de la main:
Chaque main est constitué de points nommés comme ci dessus, bien qu’il faut préciser les abréviations MCP = Articulation Métacarpo-Phalangienne ; PIP = Articulation Inter Phalangienne Proximale (IPP en français) ; PID = Articulation Inter Phalangienne Distale (IPD en français) ; TIP = Bout du doigt (TIP est un terme anglais désignant le bout du doigt).
Comment est constitué le squelette du corps :
Les points de 0 à 10 détermines les points de la tête (position du nez, des yeux (en trois points) des oreilles et de la bouche)
Les points du reste du corps sont déjà divisé en deux parties, les impairs et les pairs, l’un du côté gauche et l’autre du côté droit respectivement.
Les points 11, 12, 23 et 24 sont les points déterminant les épaules et les hanches.
De 12 à 22 (que les pairs) sont les points du bras droit, de 11 à 21 ceux du bras gauche (uniquement les impairs).
21 et 22 déterminent la position du pouce, 17 et 18 la position de l’auriculaire et 19 et 21 la position de l’index
Enfin, de 24 à 32 (uniquement les pairs) la jambe droite et de 23 à 21 la jambe gauche (uniquement les impairs)
Les points 31 et 32 définissent la pointe du pied, 29 et 30 le talon.
Pourquoi passer par Unity ?
Afin de pouvoir développer des jeux, il vaut mieux passer, afin de se simplifier la tâche, par des Framework, des environnements de développements. Ainsi, Unity permettra d’effectuer une interaction plus rapidement qu’avec l’utilisation de python, d’Android ou du web. Il est a noter que nous passons donc par une library open source permettant d’intégrer MediaPipe à unity.
Certaines fonctions n’ont donc pas été transmise (Elles n’étaient déjà pas toutes présentes entre les différentes versions (par exemple le tracking des gestes, la génération d’images, la classification audio, la détection de language, la reconnaissance de texte et d’images, …)
Code de base fournis
Ils nous fournissent ici, le package à intégrer à Untiy sous formes de packages, nous allons surtout nous fier aux assets, ce que l’on va modifier afin de comprendre comment interagir avec l’API.
Donc, le code que nous allons voir est dans MediaPipe/Assets/MediaPipeUnity/Samples (Nous allons voir les examples utilisés pour interagir avec l’api.)
Nous allons donc prendre l’example de l’utilisation du logiciel pour la détection des mains.
Ci dessus, la scène Unity fournis par MediaPipe
Ci dessus, les fichiers constitutif des samples, les endroits nous intéressant étant Common et Scenes. (Mais surtout scenes, il suffit normalement uniquement de déplacer les fichiers autre que scenes afin d’avoir mediaPipe fonctionnel.)
Parlons tout d’abord de la scène. Dedans il y a trois fichiers de script “HandLandMarkerRunner.cs” ; “HandLandMarkDetectionConfig” et “HandLandMarkDetectionConfigWindow” servant respectivement à communiquer avec l’API et afficher le résultat obtenu (Le runner), avoir une configuration de base et modifiable dans unity et dans le jeu, et la config window permet que les modifications apportées par le joueurs soient prises en compte dans la configuration (en gros il ne fait que récupérer et changer les données rentrées par le joueur).
Ensuite, le common a un ensemble de scripts utilisé par les différentes options (détections des mains, de la face, d’objets, …) (Les dossiers materials sont des materiaux utilisés par tous aussi, Resources, pareils mais pour les ressources, l’ui, pareil, et external mène à la library FontAwasome.)
Le dossier common comprends donc les fichiers “AppSettings” ayant les paramètres communs entre toutes les applications (résolution de l’écran, source de la vidéo, source de la webcam, source de l’image, le taux de log), assetLoader.cs load… les assets 🧠 plus précisément il les load de manière asyncrone afin d’éviter la surcharge. Un fichier Bootstrap.cs permettant le démarrage de l’application ainsi que son extinction propre. EnumExtension.cs sert à faciliter la compréhension des enum. GraphRunner permet d’afficher des graphiques de statistiques. ImageSourceProvider permet de récupérer la source des images à analyser (notamment de renvoyer une erreur s’ils ne sont pas supportés). InterferenceMode est une enum des périphériques utilisables pour le calcul (GPU ou CPU). LegacySolutionRunner est le runner le plus simple, sans rien invoquer de MediaPipe, il affiche l’image. RunningMode est encore une enum des mode possible de fonctionnement (Syncrone ou Asyncrone), Screen affiche l’image en raw récupéré par mediaPipe (celle sur laquelle l’on vient ajouter ensuite les points). TaskApiRunner, instancie uniquement le bootstrap et permet de pause, play, resume et stop ainsi que d’avoir une donnée de temps d’utilisation. VisionTaskApiRunner fait la même chose mais ne démarre pas le bootstrap, il démarre la vue de la caméra. Et enfin WaitForResult qui permet d’attendre le résultat de l’api MediaPipe.