Projet de spécialité FabLab : Gest-art : un avatar pour l’apprentissage du langage via la gestualité

De Ensiwiki
Aller à : navigation, rechercher

Cadre

  • Encadrants : Maisonnasse Jérôme, Dohen Marion, Rochet-Capellan Amélie
  • Elèves : Mathilde André, Alexendre Cukier, Théophile Plancke, Olfa Sejjil
  • Lieu: FabLab Ensimag/MJK

Contexte

Ce projet s’inscrit dans un cadre de recherche sur le rôle du geste dans l’apprentissage de la parole, vers le développement de plateformes pour l’apprentissage et la rééducation de la parole, basées sur le jeu et les technologies immersives

Media

Flyer de présentation : Fichier:FlyerGA.pdf.

Poster de présentation : Fichier:PosterGA.pdf.

Vidéo de présentation : Video de Presentation Gest-Art.

Problématique et objectif global

Quand nous parlons, nous bougeons non seulement notre appareil phonatoire mais aussi très souvent nos mains. La pratique des orthophonistes et de la recherche scientifique suggèrent que les gestes manuels peuvent faciliter l’acquisition du langage par les enfants souffrant de troubles de la parole. Dans ce cadre, notre objectif est de prototyper un outil permettant à l’enfant de développer sa gestualité communicative. L’outil permettra:

  • à l’enfant d’apprendre « sans s’en rendre compte »
  • aux thérapeutes d’avoir des données sur la progression de l’enfant
  • aux chercheurs d’évaluer objectivement le rôle du geste dans l’acquisition du langage et de la parole.
SpeakingKid.jpg

Approche Agile

Lien vers le Manuel Agilité du projet Gest-Art.

Lien vers le ScrumBoard du projet.

Analyse et Diagrammes de Conception

Lien vers le Document d'analyse et conception Gest-Art.

Les Diagrammes ont été faits en ligne sur Lucidchart

Avancement du projet

Installation de la Kinect

KinectASUS-GA.png

Outils utilisables

Choix de l'outil : OpenNI

Nous avions le choix entre deux technologies :

  • OpenNI (OpenNI + NiTE + SensorKinect)
  • OpenKinect (libfreenect)

Nous avons utilisé OpenNI car cet outil était plus documenté. Il contient des applications natives qui nous intéressaient, notamment le suivi du squelette du joueur (ou skeleton tracking), non existant sur OpenKinect.

Pour plus d'informations, se référer à :

Acquisition de PrimeSense par Apple

Microsoft ne fournit que des outils de développement sous Windows. Ayant fait le choix de travailler sous Linux, nous nous sommes tournés vers d'autres outils, les plus avancés étant OpenNI et NiTE, développés par PrimeSense.

Le rachat de PrimeSense par Apple a amené à la fermeture du site le 23 avril 2014 centralisant tous les outils et leur documentation d'installation et d'utilisation. L'ensemble des tutoriels référaient à ce site lorsque nous avons débuté le projet, il nous a donc été très difficile d'installer la Kinect sans quoi ce projet n'aurait pu débuter.

Article complet : Apple fait fermer OpenNI

Flux vidéo et infrarouge avec libfreenect

La seule réussite d'installation a été celle de libfreenect, nous permettant d'afficher les flux de la Kinect (flux RGB et infrarouge).

L'installation est très simple : sudo apt-get install libfreenect

Puis lancer dans un terminal :

  • freenect-glpclview (affiche les deux flux)
  • freenect-cppview (affiche le flux infrarouge)
  • freenect-glview (affiche le flux rdb)

Fonctionne uniquement avec la Kinect de Microsoft.

SimpleOpenNi

Kinect utilisée : ASUS Xtion Pro Live

N'arrivant pas à installer OpenNI, nous avons sollicité l'aide d'un doctorant travaillant à l'UFR Imag et développant des applications sur le matériel.

Il nous avait été confié une Kinect de Microsoft, version développeur (à ne pas confondre avec la version Xbox). Ce modèle ne fonctionnant pas sur une configuration vérifiée, nous avons emprunté une autre Kinect à l'UFR Imag : l'ASUS Xtion Pro Live.

Utilisant Processing et SimpleOpenNi, nous avions une configuration fonctionnelle et nous avons pu commencer le projet Gest-Art 30/05.

Liens utiles

Ci-dessous une liste de tutoriels pour l'installation de la Kinect, pouvant servir ultérieurement :

Robotic Operating System (ROS)

Une autre possibilité pour la Kinect de Microsoft aurait été d'utiliser Robotic Operating System (ROS), implémentant un certains nombre d'applications utiles. Pour plus d'informations, consultez ces liens :

Modélisation 3D

Création d'un modèle 3D sous Blender

Nous avons commencé notre projet en utilisant Blender et Nimate afin d'animer un modèle avec la Kinect. Le logiciel Ni Mate permet de récupérer les données de la Kinect sur Blender.

Au cours de la première semaine, nous avons tout d'abord pris en main l’environnement blender, puis réalisé la connexion entre la Kinect et Blender pour finalement animer un premier modèle 3D. Notre premier résultat a été l'animation temps réel et non temps réel sous Blender. Mais le temps réel était un affichage dans le fenêtre Blender, ce qui était difficilement exploitable.

Notre premier modèle 3D :

Scotty.jpg

Notre première vidéo :

Fichier:Move Kinect.avi

Visualisation d'un mouvement avec OpenGL

Nous nous sommes rapidement rendu compte qu'il serait impossible d'intégrer l'animation temps réel Blender à notre interface C++. Nous avons donc décidé d'utiliser OpenGL.

La première étape consistait à creer un squelette sous OpenGL. A l'aide de processing, nous pouvons récupérer les points d'un mouvement dans un fichier. Nous parsons ensuite ce fichier afin de mettre à jour les coordonnées des membres de notre squelette. Celui-ci est alors animé selon le mouvement.

Une image de notre squelette :

Squelette.png


La seconde étape consistait à charger notre modèle Blender avec openGL. Cela a été effectué en suivant différents tutoriels. Nous avons ensuite essayé d'animer ce nouveau modèle en le liant au squelette. Cette tâche s'est avéré difficile et n'ayant pas eu de résultats convaincants assez rapidement, nous avons du abandonner.

Création de vidéos sous Blender

Au cours de la dernière semaine, nous avons amélioré notre modèle 3D Blender. Ensuite, nous avons réalisé de nombreuses vidéos pour le scénbario final. Celles-ci contiennent un magicien 3D, une scène, du texte, du son et eventuellement une image.

Notre scène finale :

Magicien.png


Notre vidéo :

Fichier:Ralo.avi

Création d'un scénario de jeu

Au cours de la dernière semaine, nous nous sommes concentré sur la réalisation d'un scénario de jeu. Un exemple de scénario de jeu est tel que celui présenté ci-dessous.

Scenario.png

Afin d'intégrer les scénarios dans l'interface C++, nous avons mis en commun nors différentes partie. Nous avons donc intégrer la reconnaissance d'objets et de gestes à l'interface.

Reconnaissance de gestes

Comment l'effectuer

Deux possibilité s'offraient à nous pour la reconnaissance de gestes :

  • récupérer directement le flux vidéo, et faire de la reconnaissance d'image pour identifier les positions des mains
  • utiliser une interface intermédiaire qui récupére et envoie les positions des mains

La solution la plus simple était clairement la seconde. Nous disposions de plus déjà d'un moyen de récupérer les coordonnées des membres du squelette du joueur à l'aide de Processing et SimpleOpenNI.

Choix de la librairie

Librairie choisie : Gesture Recognition Toolkit (GRT)

Après quelques recherches, nous avons trouvé une librairie nommée GRT, spécialement conçue pour la reconnaissance de gestes, et implémentant plusieurs algorithmes adaptés à différentes utilisations :

"The Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, C++ machine learning library that has been specifically designed for real-time gesture recognition."

Une autre possibilité aurait été d'utiliser OpenCV directement avec le flux vidéo, beaucoup plus complexe à mettre en place.

Choix de l'algorithme

Algorithme choisi : Dynamic Time Warping (DTW)

Deux algorithmes ont été envisagés :

  • Hidden Markov Model (HMM)
  • Dynamic Time Warping (DTW)

Pour nous aider dans ce choix, nous avons suivi les indications de Nick Gillian exposées ici : Algorithm Selection et ici : DTW vs HMM

L'algorithme HMM, utilisant des chaînes de Markov pour prédire un mouvement, requiert de fixer certaines variables notamment le nombre d'états de la chaîne. Ses performances dépendent pour beaucoup des valeurs de ces variables. De plus, il fonctionne correctement avec un grand nombre d'échantillons.

L'algorithme DTW, de son côté, ne demande aucune information si ce n'est le seuil de tolérance à la reconnaissance des gestes. Plus simple à implémenter, notre choix s'est porté dessus. Il fonctionne assez bien avec un faible nombre d'échantillons. Cependant, ses performances ne seront pas améliorées avec un grand nombre d'entre eux.

D'autres algorithmes étaient possibles, notamment les algorithmes K-Nearest Neighbor Classifier (KNN), Adaptive Naive Bayes Classifier (ANBC), et Support Vector Machine (SVM). Se référer au site de Nick Gillian pour plus d'informations à leur sujet.

Implémentation

  • Phase 3 : Reconnaissance de gestes en temps réels avec la Kinect
    • Algorithme utilisé : Dynamic Time Warping (DTW)
    • Avancement : terminé le 03/06
Récupération des coordonnées des mains du joueur

Dans le tutoriel utilisant la Kinect, Nick Gillian utilise un logiciel nommé Synapse, non mis à jour et utilisant des librairies anciennes et non compatibles.

Après lui avoir demandé directement, il nous a conseillé d'utiliser Open Sounc Control (OSC) pour effectuer la communication entre OpenFrameworks et OpenNI.

Sous Processing, il existe une librairie l'implémentant nommée oscP5. Et sous OpenFrameworks, un addon nommé ofxOsc. La mise en place de la communication a été assez rapide, facilité par ces outils.

Intégration

Nous utilisions déjà deux programmes distincts, communiquant avec OSC :

  • Processing : récupération des données du joueur, communication avec oscP5
  • OpenFrameworks : reconnaissance des gestes, communication avec ofxOsc

Nous voulions intégrer OpenFrameworks à notre application pour ne pas ajouter d'intermédiaire supplémentaire. Sans succès, nous avons décidé de conserver OpenFrameworks et de le faire communiquer avec notre application, en utilisant oscpack.

Architecture

Archi-GA-RecoGeste.png

Reconnaissance d'objet

Comment l'effectuer

Pour l'identification d'objet physique plusieurs approches étaient possibles:

  • identification avec matrice 3x3 de points.
  • identification avec un qr-code.

Nous avons choisi la deuxième possibilité parce que des librairies étaient implémentées et simples à utiliser. Chaque objet est identifié par son nom, nous avons donc décidé de se baser là dessus pour la génération du qr-code.

Concernant les tailles, nous avons trouvé que : distance minimale de détection = taille qr-code * 10, nous avons donc estimé qu'une taille de 5X5cm est suffisante.

Choix de librairies

  • pour l'encodage : Nous avons utilisé la commande qrencode de la librairie libqrencode pour générer des Qr-codes à partir du nom de chaque objet.
  • pour le décodage : Nous avons utilisé la libraire Zbar pour détecter un Qr-code à partir de la webcam. [1]

Intégration

Nous n'avons pas réussi à intégrer la librairie Zbar directement dans notres programme C++. Vu que la durée du projet est assez limitée, nous avons utilisé des appels systèmes pour exécuter la commande zbarcam (du paquet zbar-tools sous ubuntu) . Celle-ci identifie un qr-code à partir de la webcam.

GitHub ZBar

Architecture

Archi-ZBar.png

Autres possibilites

Nous avons aussi essayé d'utiliser la librairie Zxing [2] qui pourrait remplacer les deux précédente et fournir un moyen de détecter le Qr-code à partir de la Kinect. Finalement nous avons décidé de garder les librairies initiales parce que nous avions un temps limité.

Pistes pour développement futur

  • Intégration
    • Suppression d'OpenFrameworks, et intégration de GRT à l'application
    • Intégration du code de ZBar (nécessite de récupérer le flux vidéo de la Kinect)
    • Suppression de Processing, et intégration de l'exemple UserTracker de OpenNI (situé dans le dossier OpenNI d'installation)
  • Fonctionnalités
    • Création et animation de l'avatar en temps réel (créer une connexion entre OpenGL et OSC)
    • Enregistrement des données du joueur

Ressources

Git

Manuels

Autres documents

Remerciements

  • à l'UFR Imag pour nous avoir prêté son materiel
  • à Quentin Fombaron pour les prises vidéos