detection et suivi de blob a l`aide de la kinect
Transcription
detection et suivi de blob a l`aide de la kinect
DETECTION ET SUIVI DE BLOB A L’AIDE DE LA KINECT Auteur1 Adresse électronique Marie-Anne Pungu Mwange [email protected] Auteur3 Adresse électronique RÉSUMÉ L’objectif de ce travail était, dans un premier temps, de détecter une personne dans une partie de pièce et de suivre ses déplacements dans celle-ci. Cela devait se faire sur base des informations fournies par une Kinect fixée au plafond et reliée à un ordinateur de traitement. Une fois cet objectif atteint, il a fallu transmettre la position de l’individu à un avatar virtuel installé sur un ordinateur dédié: MARC du LIMSI (unité de recherche du CNRS pour l’informatique dans la mécanique et les sciences de l’ingénieur). Le but ultime étant de permettre à ce dernier d’interagir avec la personne détectée. Ces interactions se font par les mouvements de tête de MARC et ses expressions faciales. Les détails concernant le logiciel d’animation de MARC et la manière dont sont créées ses expressions faciales et ses mouvements font l’objet d’un autre rapport, celui de Florian Mottay (projet DARWIN). MOTS-CLES Traitement de l’image, Kinect, détection de blob, tracking, interaction virtuelle, MARC, Processing, OpenNI 1. 1.2. Le projet KIT Étant donné que le potentiel de la Kinect n’est pas encore pleinement utilisé dans les jeux actuellement proposés [3], les développeurs se sont rués sur cet appareil pour proposer des projets aussi originaux les uns que les autres. Dans ce cadre, le laboratoire LARAS de l’ISIB tenait à apporter sa pierre à l’édifice en proposant le projet KIT (Kinect Tracking) dont il est question dans ce document. Ce projet consiste à traiter la carte de profondeur fournie par la Kinect pour y faire de la détection et du traçage de blob et à utiliser les résultats de ces manipulations pour créer de l’interaction avec un avatar virtuel. Au-delà du but susmentionné, ce projet sert à introduire la Kinect et son fonctionnement interne. Il servira de base aux futurs projets qui exploiteront cet accessoire. 2. DESCRIPTIONS DES PARTIES DU PROJET Le projet est purement informatique. Sa composante principale est le traitement de l’image. INTRODUCTION La Kinect est une véritable révolution dans le monde du jeu vidéo. En effet, d’après le livre Guiness des records, c’est « l’accessoire high-tech le plus vendu dans un court laps de temps », avec une moyenne de plus de 100 000 unités vendues quotidiennement de par le monde. La raison principale de ce succès est que, pour la première fois, plusieurs technologies sophistiquées sont réunies dans un appareil abordable. 1.1. La technologie de la Kinect La Kinect est motorisée pour suivre les déplacements des joueurs et contient 4 microphones, une caméra RGB de 640x480 pixels qui filme 30 images à la seconde et un capteur de profondeur. Ce dernier est composé d’un laser infrarouge et d’un capteur CMOS monochrome. Il est codé sur 11 bits et fournit une carte de profondeur de 640x480 pixels détaillant 2048 niveaux de sensibilité. Son champ de vision est de 57° horizontalement et 43° verticalement [1] [2]. 3. MATERIEL ET METHODES 3.1. Outils Les outils matériels fournis: La Kinect, périphérique de jeu créé au départ pour la console XBOX 360 Un ordinateur standard sur lequel est installé le système d’exploitation Windows 7 Edition familiale Premium dans sa version 64 bits. Les outils logiciels utilisés : Sensor Kinect, pilote semi officiel pour la Kinect, développé par la société PrimeSense qui est à la base de la technologie utilisée dans l’appareil OpenNi, framework multi-langage et multiplateforme qui traite les informations brutes venant des différents capteurs de la Kinect et les rend exploitable Processing, langage de programmation basé sur Java 3.2. Les différentes étapes et techniques Dans un premier temps, il a fallu recenser les différents outils permettant de récupérer les données fournies par la Kinect sur l’ordinateur. Au moment où cette étape a été faite, il existait deux pilotes permettant d’utiliser la Kinect sur Windows : Open Kinect et Sensor Kinect. Pour chacun d’entre eux, il existe des outils qui traitent les données brutes et les rendent exploitables. Pour Open Kinect, qui est un driver pirate, il existe la plateforme CL NUI et le framework Libfreenect. Sensor Kinect est associé à OpenNi. Il faut noter que depuis lors, Microsoft a publié un pilote et une plateforme de développement officiels. Ensuite, a fallu choisir parmi les différents outils recensés, ceux qui ont été utilisé pour la suite du projet. Le choix s’est porté sur Sensor Kinect et OpenNi. Ils ont été choisis car ils étaient les mieux documentés et plus simple d’utilisation pour un développeur novice. L’étape suivante a été l’utilisation des instruments sélectionnés pour faire de la détection de blob et le tracking de ceux-ci à partir des données fournies par la Kinect dans une configuration particulière : la Kinect accrochée au plafond. Cette étape a été réalisée à l’aide du langage Processing car il est doté d’une librairie permettant d’utiliser OpenNi et de plusieurs détecteurs de blobs. Processing est un langage spécial. Par défaut, chaque programme Processing est constitué de deux classes : la classe setup() qui est exécutée une fois seulement au lancement du programme et la classe draw() qui est une boucle infinie, exécutée 30 fois par seconde. La librairie utilisée pour la détection de blob est flob car elle met en œuvre la détection et le suivi de blob [4]. La technique utilisée est la suivante : 1) On récupère la carte de profondeur de la Kinect. OpenNi l’affiche en niveaux de gris. Plus un point est proche de la Kinect, plus il est clair. Les objets qui sont trop près (à une distance inférieure à 60 cm) apparaissent complètement noirs. Mais le placement de la Kinect au plafond empêche de cette situation d’arriver. De plus, le sol de la pièce se situe dans la portée de détection de la Kinect. 2) La carte de profondeur est binarisée selon un seuil de clarté. Tous les points plus clairs que ce seuil sont mis en blancs et les autres sont mis en noirs. 3) On détecte les amas de points blancs et ils sont trackés d’image en image. La dernière étape a été la mise en place de l’interaction avec l’avatar virtuel MARC. C’est une partie qui a été faite en collaboration avec Florian Mottay qui a travaillé avec le logiciel de l’avatar virtuel dans le cadre de son projet DARWIN. Pour cette étape, il a fallu d’abord mettre le seuil à 254 de façon à ne prendre que le blob le plus clair. Ensuite, il a fallu diminuer le bruit afin que MARC n’ai pas le regard qui saute. Pour ce faire, les déplacements de blob inférieurs à 10 pixels ont été négligés. Après cela, une correspondance entre le coefficient de la rotation de la tête de MARC et la position du blob a été établie. Elle a été faite comme suit : une personne a pris place dans le champ visuel de la Kinect, on a relevé la position du centre du blob associé à cette personne sur la carte de profondeur. Cette position est exprimée en pixels. On a fait bouger la tête de MARC jusqu’à ce que la personne ait l’impression que l’avatar la regarde et on a noté le coefficient qui y était associé. Les points obtenus sont donnés dans le tableau1 suivante. Notons que le déplacement en x correspond au déplacement latéral en face de MARC. Position en x du blob 16 310 615 Coefficient de MARC 0.6 0 -0.6 Tableau 1. Points établis pour le mouvement de tête de l'avatar virtuel Sur base de ces points, une régression linéaire a été faite pour calculer le coefficient à donner à MARC en fonction de l’abscisse du blob. L’équation obtenue est : (1) Le résultat de cette opération doit être envoyé à l’avatar virtuel dans un message BML (langage basé sur XML). Ce message est le suivant (à la place du « y » gras doit être mise la valeur du résultat) : "<bml id=\"Track_0\">"+ "<marc:fork id=\"Track_0_fork_1\">"+ “<wait duration=\"0.0\" />"+ "<face id=\"bml_item_1_au51\" type=\"FACS\" side=\"BOTH\" amount=\""+y+"\" au=\"52\" marc:interpolate=\"0.1\" marc:interpolation_type=\"linear\" />"+ "<face id=\"bml_item_1_au52\" type=\"FACS\" side=\"BOTH\" amount=\""+heigh+"\" au=\"53\" marc:interpolate=\"1.0\" marc:interpolation_type=\"linear\" />"+ "</marc:fork>"+ "</bml>"; Figure 1. Tag BML pour que MARC tourne la tête Il est envoyé via UDP grâce à la librairie hypermedia.net. Enfin, il a fallu gérer le déplacement en « y » de la personne dans la pièce. Il a été décidé que l’avatar virtuel changerait d’expression faciale si le blob associé à la personne se trouve à une ordonnée inférieure à 60. La figure 2 suivante montre les tags BML envoyés à MARC pour qu’il sourie ou qu’il montre de l’agacement. //agacement "<bml id=\"Track_0\">"+ "<marc:fork id=\"Track_0_fork_1\">"+ "<wait duration=\"0.0\" />"+ "<face id=\"bml_item_1\" >"+ "<description level=\"1\" type=\"marcbml\">"+ "<mpeg4_expressions expressions=\"EkmanColere\" intensities=\"1.0\" interpolate=\"1.0\" />"+ "</description>"+ "</face>"+ "</marc:fork>"+ "</bml>"; //sourire "<bml id=\"Track_0\">"+ "<marc:fork id=\"Track_0_fork_1\"><wait duration=\"0.0\" />"+ "<face id=\"bml_item_1\" >"+ "<description level=\"1\" type=\"marcbml\">" + "<mpeg4_expressions expressions=\"Bouche Sourir Leger\" intensities=\"0.4\" interpolate=\"1.0\" />"+ "</description>" + "</face>" + "</marc:fork>"+ " </bml>"; Figure 2. Tags BML pour les expressions faciales Une attention toute particulière a été portée à ce niveau-là car, le même message d’expression faciale ne doit pas être envoyé deux fois consécutivement. C’est pourquoi chaque expression faciale a été placée dans sa propre méthode et que des variables booléennes ont été créées, comme le montrent les figures suivantes. Figure 5. Le tracker définitif suit le blob le plus proche de la Kinect (en rouge ici) En ce qui concerne l’interaction entre une personne et l’avatar virtuel, lorsque la personne se déplace dans le champ de vision de la Kinect, MARC suit son mouvement avec la tête. De même, celui-ci modifie ses expressions faciales en fonction de la position envoyée. Il sourit la plupart du temps mais « tique » quand on s’approche trop de lui. Figure 3. Variables booléennes à l'initiation Figure 4. Utilisation des variables pour déclencher les fonctions qui envoient les tags d'expression faciale 4. RESULTATS FINAUX Au niveau du tracker, il suit le blob le plus près de la Kinect. Figure 6. Visage de Marc agacé 5. CONCLUSIONS ET AMELIORATIONS POSSIBLES Toute cette expérience constitue une base qui peut encore être développée. En effet, la sortie récente du pilote homologué par Microsoft et de l’environnement de développement officiel permettront surement d’améliorer les résultats obtenus de façon significative. Parmi les ajouts les plus pertinents il y a le remplacement de la détection de blob par la détection de personne. Au lieu de faire un traçage basé sur la couleur du blob, il serait intéressant de suivre les formes qui correspondent à des êtres humains vus de haut. Cette amélioration risque cependant d’être fort complexe étant donné la diversité des coiffures et les formes différentes que peuvent présenter les gens selon qu’ils se présentent de face, de dos, de profile ou de biais. Un autre approfondissement utile serait la gestion de la taille des personnes détectées. Cela permettrait à MARC de lever ou d’abaisser le visage vers les personnes avec il interagit. Une autre source d’amélioration serait l’exploitation des microphones pour coupler la reconnaissance d’une personne et l’identification de cette dernière par sa voix. Une dernière modification est la gestion par l’avatar de plusieurs individus en face de lui. Néanmoins, c’est un travail qui mérite d’être développé car il est unique (il n’existe, à la connaissance de l’auteure aucun autre projet qui utilise une Kinect fixée au plafond) et qu’il est applicable à énormément de domaines différents. Le plus évident étant celui des jeux vidéo. Ce n’est pourtant pas le seul : on pourrait imaginer, par exemple une borne informative ou publicitaire où à la place d’avoir un texte sans vie, on aurait un avatar virtuel qui délivrerait son message aux passants en leur parlant de façon naturelle. 6. REFERENCES [1] MSN divertissement. Dix choses à savoir sur le Kinect, juin 2011. http://divertissements.fr.be.msn.com/games/kinect/ar ticle.aspx?cp-documentid=154685543&page=2 [2] Wikipedia. Kinect, juin 2011. http://en.wikipedia.org/wiki/Kinect [3] Eurogamer. Today’s game use 20-30 percent of Kinect, juin 2011. http://www.eurogamer.net/articles/2010-11-11todays-games-use-20-30-percent-of-kinect [4] s373.net. flob // multi blob tracker for processing, juin 2011. http://s373.net/code/flob/flob.html