Kinect: un tour d’horizon tout naturellement

le 07/09/2011 par Vincent Guigui
Tags: Software Engineering

"Kinect_Accroche"Kinect par ci, Kinect par là... Vous avez surement tous déjà entendu parler de la Kinect de Microsoft. Mais savez-vous vraiment comment fonctionne ce nouveau type de périphérique entrant dans la catégorie des Interfaces Utilisateurs Naturelles (appelées NUI) ?

Initialement connu sous le nom de "Project Natal", ce périphérique conçu pour la console Microsoft Xbox 360 permet d’interagir avec celle-ci grâce à la reconnaissance de forme, de mouvement et par commandes vocales.

En quelques chiffres

La Kinect a été mise sur le marché par Microsoft en novembre 2010 en tant que nouveau périphérique de jeu (vous avez surement entendu le slogan « La manette c’est vous »). Grâce à celle-ci, les ventes de la division jeux de Microsoft (Entertainment and Devices Division) ont crû d’environ 60%. La Kinect a depuis été élue accessoire d’électronique grand public ayant connu la plus rapide progression de ses ventes par le Guinness World Records avec 8 millions d'unités vendues durant les 60 premiers jours de sa commercialisation.

Si vous souhaitez avoir un panorama plus complet sur la genèse de la Kinect, vous pouvez regarder la vidéo « Kinect, du rêve à la réalité » présentée par David Cohen (Responsable Expérience Numérique Microsoft) lors de l’Université du SI 2011.

En décembre 2010 soit quelques mois après la commercialisation de la Kinect, PrimeSense (la société détentrice du brevet d’un des principaux capteurs) a mis à disposition des développeurs un kit de développement Open-Source (OpenNI/NITE – Natural Interaction) permettant à chacun de tirer partie des capacités du Kinect.

En juin 2011, Microsoft lance son SDK Kinect officiel (en version beta) incluant les pilotes pour PC et des librairies de reconnaissance de forme. Pour l’instant la licence Kinect interdit le développement d’applications commerciales. Cette contrainte pourrait changer prochainement avec notamment l’introduction d’un magasin en ligne (type App Store ou Marketplace) permettant aux utilisateurs de télécharger facilement de nouvelles applications utilisant la Kinect.

PrimeSense collabore actuellement avec Asus pour mettre au point un produit similaire à la Kinect de Microsoft : le Wavi X-tion (dont la sortie est prévue fin 2011). Ce produit sera principalement destiné au monde des PC et potentiellement des TV connectés. Le Wavi profitera du SDK OpenNI de PrimeSense et de l’importante communauté de développeurs qui s’était créée à l’arrivée de la Kinect.

Intérêt des Interfaces Naturelles

J’ai mentionné en introduction l’expression « Interfaces Utilisateurs Naturelles ». Le mot « naturel » désigne les interfaces utilisateurs pouvant s’utiliser sans apprentissage et sans modification du schéma de pensée de l’utilisateur.

Un clavier et une souris peuvent sembler naturels à utiliser mais il faut en réalité un nombre important d’heures de pratique (rappelez-vous vos débuts devant un ordinateur) pour acquérir la dextérité nécessaire à une utilisation facile. Ce type de périphériques requiert l'emploi de symboles et de métaphores (ex: icône d'une disquette pour sauvegarder un fichier) qui détourne l’attention de l’utilisateur du contenu qu'il veut manipuler.

Une interface naturelle se doit donc d’avoir une prise en main immédiate et de pouvoir même s’effacer du point de vue utilisateur au profit de l’interaction en tant que telle.

Plusieurs périphériques plus ou moins récent entrent dans cette définition. Il y a entre autres les interfaces tactiles multi-point (telles que l’iPad ou la table Surface), les interfaces immersives (la Kinect et les lunettes d’immersion 3D) et les logiciels de commande vocale. Il est possible d’étendre la définition pour y inclure les périphériques contenant des capteurs de mouvement (accéléromètre, gyroscope) telle que la manette Nintendo Wii qui permet une compréhension immédiate de son mode d’interaction.

Il est évident que les années qui arrivent verront fleurir de nouveaux périphériques encore plus immersifs et naturels.

Techniquement comment marche la Kinect ?

Laissons les réflexions ergonomiques et concentrons-nous sur la fameuse Kinect.

Composition matérielle de la Kinect

La Kinect est composée de :

  • Un capteur vidéo couleur faisant office de caméra et restituant des images jusqu’en 1280x1024
  • Un capteur de profondeur (émetteur/récepteur infrarouge)
  • Un ensemble de 4 microphones directionnels incluant un système de réduction du bruit et des échos afin de permettre l’identification précise des sources sonores (beam formation) et améliorer la reconnaissance vocale.

Intéraction materiel-logiciel au sein d’une application Kinect

Le capteur de profondeur est le composant principal de la Kinect car il fournit l’essentiel des informations permettant la reconnaissance de formes et mouvements. Voici le résumé du brevet détenu par la société israélienne PrimeSense décrivant la technologie de mesure de profondeur :

L'invention concerne un système et une méthode à utiliser pour reconstruire un objet. […] L'unité d'éclairage comprend une source lumineuse cohérente et un générateur de motifs de granulation aléatoire […] projetant sur l'objet le motif de granulation. L'unité d'imagerie de l'invention est conçue pour détecter […] un décalage du motif sur l'objet par rapport à l’image de référence du motif. Ceci permet une reconstruction en temps réel d'une carte tridimensionnelle de l'objet.

En bon français, un émetteur infrarouge projette un motif prédéfini (nuage de points) dans la pièce. Le capteur infrarouge détecte la moindre altération dans la réflexion de ce motif et en déduit la distance des objets de la pièce. Il est ainsi possible d’obtenir une représentation de la position en 3 dimensions des objets dans le champ de vision de la Kinect (60° horizontalement et sur une distance de 1 à 4 mètres).

Capture des flux venant des capteurs
Flux video<br><br>Flux videoFlux profondeur<br><br>Flux profondeur

Il est à noter que le capteur infrarouge est parasité par les rayons du soleil (émettant aussi de l'infrarouge). l'usage de la Kinect en extérieur est donc limité.

Et pour le matériel, c’est tout ! La partie que l’on pourrait appeler « intelligente » (détection des objets et des mouvements) s'exécute au niveau de l’ordinateur.

A partir des informations des capteurs, le kit de développement (SDK) fourni par Microsoft permet de détecter jusqu’à 4formes humaines. 2 types de tracking sont disponibles : le tracking passif et le tracking actif.

  • Le tracking passif analyse rapidement les flux venant des capteurs pour calculer les données générales de forme et de positionnement des 4 personnes.
  • Le tracking actif détermine la position et l’orientation précises des 20 principales articulations du corps humain (formant un squelette). Ce calcul étant consommateur en ressources CPU, la version actuelle du SDK se limite à la reconnaissance du squelette entier des 2 premiers humains détectés.

Liste des articulations principales du squelette humain pour la Kinect

Reconnaissance de squelette
Flux video<br><br>Flux videoSquelette détecté<br><br>Squelette détecté

Le fait d’avoir dissocié les parties capture (matériel) et reconnaissance (logiciel) rend la Kinect très polyvalente et évolutive puisqu’indépendante de l’usage que l’on veut en faire.

Il est ainsi possible de ne pas utiliser la détection de squelettes du SDK et de faire soi-même les algorithmes et traitement d’images permettant la reconnaissance de formes. Certains projets indépendants permettent d’ores et déjà la reconnaissance individuelle des doigts, des traits du visage, d’animaux, d’objets variés.

Développement

Les prérequis pour le développement d’une application utilisant la Kinect sont assez faibles :

  • Un ordinateur sous Windows 7 (x86 ou x64)
  • Une Kinect (il vaut mieux le préciser)
  • Un développeur C# ou C++ (le SDK est fourni pour .Net et C++)

Le reste des compétences requises est directement lié au type d’application que vous souhaitez réaliser. Si l’application doit permettre la manipulation en 3D d’objets, il faudra savoir utiliser des technologies de rendu graphique 3D tels que OpenGL, DirectX ou XNA. Une application de reconnaissance de mouvement nécessitera de maitriser un minimum les algorithmes mathématiques de lissage, interpolation ou traitement du signal.

Techniquement (attention il va y avoir du code C#), le SDK est simple à utiliser.

L’initialisation de la Kinect se fait en quelques lignes :

kinectRuntime = new Runtime();
kinectRuntime.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);

Il faut ensuite indiquer à la Kinect de commencer l’acquisition des flux venant des capteurs :

kinectRuntime.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
kinectRuntime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);

Le SDK fournit 2 méthodes différentes de récupération des informations de la Kinect : par évènement ou à la demande (polling).

Le modèle évènementiel permet de s’abonner à des évènements VideoFrameReady, DepthFrameReady ou SkeletonFrameReady qui seront notifiés dès qu’une « frame » est disponible.

protected override void Initialize()
{
    […]
    kinectRuntime.VideoFrameReady += new EventHandler(kinectRuntime_VideoFrameReady);
    kinectRuntime.SkeletonFrameReady += new EventHandler(kinectRuntime_SkeletonFrameReady);
    […]
}

void kinectRuntime_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
    byte[] bitmapData = e.ImageFrame.Image.Bits;
    RenderToScreen(videoFrame);
    […]
}

void kinectRuntime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    if (e.SkeletonFrame.Skeletons.Count() > 0)
    {
        HandleGestures(skeletonFrame);
        […]
    }
}

Ce modèle est utile pour le traitement asynchrone ou les applications multithread. En pratique, si les traitements que vous souhaitez effectuer pour chaque « frame » sont longs ou complexes, le modèle évènementiel risque de déclencher trop souvent votre algorithme et de provoquer une saturation du CPU.

Le modèle par polling permet d’obtenir sur demande explicite une frame (méthode GetNextFrame) et de passer à la suite si aucune frame n’est disponible dans un délai imparti.

ImageFrame videoFrame = kinectRuntime.VideoStream.GetNextFrame(timeout);
// videoFrame.Image.Bits est un byte[]
RenderToScreen(videoFrame.Image.Bits);

SkeletonFrame skeletonFrame = kinectRuntime.SkeletonEngine.GetNextFrame(timeout);
HandleGestures(skeletonFrame);

Ce modèle peut générer un code très procédurale et monolitique. Il faut donc l’utiliser avec précaution.

A titre d'exemple, j'ai développé  en quelques heures un prototype permettant d'extraire une forme humaine et de l'incruster dans un décor quelconque. Voici une vidéo de démonstration:

<iframe src="http://www.youtube.com/embed/PFbycNdnJW4" frameborder="0" width="420" height="345"></iframe>

En consultant le source complet (disponible sur le site Immersive Virtualpostcard with Kinect, vous verrez que la partie la plus complexe consiste à faire l'incrustation d'image (parcours de tableau d'octets) et non de récupérer les flux du Kinect.

La reconnaissance de mouvements

La reconnaissance de mouvements types (appelés gestures) comme « écarter les bras », « lever la main », « pencher sur la droite » sont à implémenter par le développeur à partir des informations du squelette.

Le SDK fournit jusqu’à 30 fois par seconde une mise à jour des squelettes détectés sous forme d’objet SkeletonFrame.

Cet objet contient les informations de positionnement des squelettes détectés ainsi que des informations sur la qualité de la détection (exacte, inférée…)

public sealed class SkeletonFrame
{
    [...]
    public SkeletonFrameQuality Quality;
    // vecteur indiquant la gravité réelle pour corriger la déformation dûe à l'inclinaison de la Kinect
    public Vector FloorClipPlane;
    // liste de squelettes détectés
    public SkeletonData[] Skeletons = new SkeletonData[6];
}

public sealed class SkeletonData
{
    [...]
    // précision du tracking : None, PositionOnly, Tracked (squelette entier)
    public SkeletonTrackingState TrackingState;
    public int TrackingID;
    // position 3D globale
    public Vector Position;
    // tableau indiquant la position 3D de chaque jointure et la précision (Inferred, Tracked)
    public JointsCollection Joints;
}

A partir de ces informations, il est possible de tester des règles/seuils simples définissant de mouvements, par exemple exécuter une fonction particulière lorsque l'utilisateur a la main sur la tête:

SkeletonFrame skeletonFrame = kinectRuntime.SkeletonEngine.GetNextFrame(timeout);
Vector distance =
    skeletonFrame.Skeletons[0].Joints[JointID.HandRight].Position
    - skeletonFrame.Skeletons[0].Joints[JointID.Head].Position;

// vérification de la position de la main par rapport à la tête
if ( // la main est placée au-dessus du niveau de la tête
    distance.Y > 0
    // la distance latérale entre la main et la tête est inférieure à 10cm
    Math.Abs(distance.X) < 10
    // la distance en profondeur entre la main et la tête est inférieure à 10cm
    Math.Abs(distance.Z) < 10 )
{
    LaunchRocket();
}

Plusieurs frameworks (tels que NITE de PrimeSense, BeTheController) existent pour faciliter cette tâche mais il vous faudra évaluer au cas par cas leur pertinence en fonction de votre besoin (reconnaissance de formes, suivi d’objets, précision, fiabilité…).

Je vous conseille de consulter le blog de David Cahute  de Microsoft et surtout l'article sur la reconnaissance de gestures Kinect basée sur l'apprentissage : Gestures & Kinect. David a publié sous licence MIT le code du projet Kinect Toolbox qui inclut la reconnaissance de gestures, de poses et de la voix.

Pour aller plus loin

Voici une liste (non-exhaustive) de ressources sur la Kinect et les différents projets dans le domaine des NUI :

D'autres articles paraîtront sur le blog Octo sur les usages possibles de la Kinect pour l'entreprise.

Conclusion

Maintenant que le fonctionnement de la Kinect n'a plus de secret pour vous, comment comptez-vous en tirer partie ? La Kinect, la table Surface, l'iPad... forment un ensemble de technologies améliorant l'expérience utilisateur et pouvant décupler la productivité à condition d'être correctement utilisées. Par exemple (et sans vouloir rentrer dans un débat de religion), il est possible de dire que l'iPad a réussi là où les TabletPC des années 2000 ont échoué en ne voulant qu'ajouter un périphérique (écran tactile) aux usages de l'ordinateur. L'iPad s'est basé sur une refonte profonde des paradigmes d'ergonomie (navigation, accès à l'information, présentation...) et a permis l'apparition de nouveaux usages et nouveaux besoins.

De même pour la Kinect ou Surface, plusieurs grandes entreprises parmi nos clients font appel à nous pour notre expertise technologique dans le domaine mais aussi afin de les aider à inventer leurs usages de demain en B2C ou même B2E avec notamment le développement de la gamification (serious gaming pour l'évaluation/monitoring, la formation/training, la prévention...).

N'hésitez pas à partager vos expériences ou vos questions dans les commentaires, nous ne manquerons pas d'y répondre.