cozmo-sdk-detection-et-reconnaissance-des-visages-feature-image

Cozmo SDK : détection et reconnaissance faciale

This entry was posted in Cozmo, Education, Tutoriels en robotique and tagged on by .

Nous poursuivons la découverte du SDK Cozmo avec la détection de visages et d’émotions, ainsi que la reconnaissance embarquée sur le robot Cozmo.

Cozmo dispose du hardware et software nécessaire à la reconnaissance des visages. Il est capable d’associer un nom à chaque visage (enrollment), mais aussi de percevoir les émotions sur les visages détectés. Cozmo peut également suivre la position d’un visage.

Dans ce TP, vous allez apprendre à utiliser les 4 fonctionnalités suivantes :

  1. Détection des visages
  2. Enregistrement de visages
  3. Reconnaissance de visages
  4. Reconnaissance d’émotion

Objectif : détecter et reconnaître les visages et les émotions

  • Durée : 45 minutes
  • Niveau de difficulté :  intermédiaire
  • Compétence acquises : vision et reconnaissance de visages

Les prérequis

Vous devez avoir acquis les notions abordées dans les tutoriels ci-dessous

Les nouvelles notions que vous allez aborder dans ce TP

  • La fonction cozmo.faces
  • La fonction cozmo.robot.Robot.enable_facial_expression_estimation

Fonction 1 : détection des visages avec Cozmo

Le robot Cozmo embarque dans son SDK le nécessaire pour détecter des visages grâce à sa caméra.

Lorsqu’une personne passe devant la caméra de Cozmo, le SDK déclenche des événements qui retournent des informations sur le visage détecté ou sur un visage qui n’est plus visible.

Les événements en question sont :

  • EvtFaceAppeared : déclenché lorsqu’un visage est détecté pour la première fois
  • EvtFaceObserved : déclenché continuellement lorsqu’un visage est détecté
  • EvtFaceDisappeared : déclenché lorsqu’un visage précédemment observé n’est plus visible

Comme nous l’avons expliqué dans le tutoriel Cozmo SDK : cozmo.world et événements, presque tous les événements émis par le robot peuvent être récupérés par l’objet World. Cet objet World est accessible via l’instance disponible sur le robot auquel vous êtes connecté  cozmo.robot.Robot.world.

Pour détecter un de ces événements vous pouvez utilise la fonction wait_for() sur l’objet World.

[pastacode lang= »python » manual= »robot.world.wait_for(cozmo.faces.EvtFaceObserved) » message= » » highlight= » » provider= »manual »/]

Chaque visage détecté se voit attribuer un objet de typecozmo.robot.Face qui contient plusieurs informations et fonctions. Cet objet déclenche des événements tels que le renouvellement de l’ID, le changement de nom, etc.

Ici, la fonction wait_for retourne une instance de la classe EvtFaceObserved , qui contient un attribut face.

Vous trouverez ci-dessous un exemple simple qui récupère l’événement EvtFaceObserved (événement déclenché continuellement lorsqu’un visage est détecté), qui est capté parcozmo.world.World et qui retourne une instance disposant de l’attribut de type Face et affiche l’id face_id assigné par Cozmo pour le visage reconnu :

[pastacode lang= »python » manual= »%23!%2Fusr%2Fbin%2Fenv%20python3%0A%0Aimport%20cozmo%0Aimport%20asyncio%0A%0Adef%20main_program(robot%3A%20cozmo.robot.Robot)%3A%0A%20%20try%3A%0A%20%20%09e%20%3D%20robot.world.wait_for(cozmo.faces.EvtFaceObserved)%0A%20%20%09print(%22Face%20id%20%3D%20%22%20%2B%20str(e.face.face_id))%0A%0A%20%20except%20asyncio.TimeoutError%3A%0A%20%20%20%20print(%22Timeout%20%C3%A9coul%C3%A9%22)%0A%0Acozmo.run_program(main_program%2C%20use_viewer%3DTrue) » message= »Récupérer l’id du visage reconnu » highlight= » » provider= »manual »/]

Fonction 2 : enregistrement de visages

Le robot Cozmo embarque également dans son SDK le nécessaire pour enregistrer des visages en associant un nom à chaque visage. Il s’agit de l’enrollment.

L’objet cozmo.robot.Face dispose de fonctions pour enregistrer, modifier et supprimer un nom associé à un visage.

  • name_face(name)
  • rename_face(new_name)
  • erase_enrolled_face()

Les deux premières fonctions prennent une chaîne de caractère (string) comme paramètre. La chaîne doit être une string non vide de caractères ASCII string et composée de caractères alphabétiques uniquement (pas d’espace ni d’accents…).

Nous allons ajouter la deuxième fonction (rename_face) au code de l’exemple précédent. Ci-dessous, un nom a été associé au visage reconnu de manière arbitraire : « Marc ».

[pastacode lang= »python » manual= »%23!%2Fusr%2Fbin%2Fenv%20python3%0A%0Aimport%20cozmo%0Aimport%20asyncio%0A%0Adef%20main_program(robot%3A%20cozmo.robot.Robot)%3A%0A%20%20try%3A%0A%20%20%09e%20%3D%20robot.world.wait_for(cozmo.faces.EvtFaceObserved)%0A%20%20%09e.face.rename_face(%22humain%22)%0A%0A%20%20except%20asyncio.TimeoutError%3A%0A%20%20%20%20print(%22Timeout%20%C3%A9coul%C3%A9%22)%0A%0Acozmo.run_program(main_program%2C%20use_viewer%3DTrue) » message= »Assigner un nom à un visage » highlight= » » provider= »manual »/]

Dans l’exemple suivant, Cozmo voit un visage qu’il connaît (s’il y en a un) et dit à voix haute le nom qui y est associé. Consultez notre TP Cozmo SDK : faire parler Cozmo si vous avez besoin de conseils pour la gestion de la parole avec Cozmo SDK.

[pastacode lang= »python » manual= »%23!%2Fusr%2Fbin%2Fenv%20python3%0A%0Aimport%20cozmo%0Aimport%20asyncio%0A%0Adef%20main_program(robot%3A%20cozmo.robot.Robot)%3A%0A%20%20try%3A%0A%20%20%09e%20%3D%20robot.world.wait_for(cozmo.faces.EvtFaceObserved)%0A%20%20%09robot.say_text(%22Bonjour%22%20%2B%20e.face.name).wait_for_completed()%0A%0A%20%20except%20asyncio.TimeoutError%3A%0A%20%20%20%20print(%22Timeout%20%C3%A9coul%C3%A9%22)%0A%0Acozmo.run_program(main_program%2C%20use_viewer%3DTrue) » message= »Prononcer le nom associé à un visage » highlight= » » provider= »manual »/]

Attention, si le nom associé à un visage est modifié ou supprimé, cela va déclencher des événements. Ces événements sont :

  • EvtErasedEnrolledFace : déclenché lorsque un enregistrement est supprimé de la base de visages
  • EvtFaceRenamed : déclenché lorsque un enregistrement est modifié dans la base

Nous aurons l’occasion d’y revenir plus en détails dans un prochain TP.

Fonction 3 : reconnaissance de visages

Une fois que vous avez compris comment fonctionne la détection et l’enregistrement de visages, la reconnaissance des visages est très simple, car la reconnaissance de visage s’opère constamment grâce au logiciel de Cozmo.

Les instances de l’objet Face disposent d’un attribut name. Cet attribut est une string qui contient le nom de la personne reconnue. Si le champ est vide, c’est qu’il n’y a pas eu de reconnaissance.

Tuto 4 : reconnaissance d’émotion

Le robot Cozmo embarque dans son SDK le nécessaire pour détecter les émotions sur les visages. Il peut reconnaître les expressions faciales suivantes : neutre, joie, surprise, tristesse et colère.

Pour activer cette reconnaissance d’émotion il faut activer enable_facial_expression_estimation.

[pastacode lang= »python » user= »generationrobots-lab » repos= »cozmo-examples » path_id= »vision_simple_face_emotion.py » revision= » » highlight= »35″ lines= »34-35″ provider= »github »/]

L’objet Face dispose des attributs known_expression, expression_score. Ces valeurs sont calculées constamment sur le visage détecté par la caméra. Vous pouvez y accéder de la façon suivante :

[pastacode lang= »python » user= »generationrobots-lab » repos= »cozmo-examples » path_id= »vision_simple_face_emotion.py » revision= » » highlight= »50″ lines= »41-51″ provider= »github »/]

Vous pouvez télécharger et tester le code vision_simple_face_emotion.py disponible sur notre repository. Il affichera l’expression reconnue et le score dans votre terminal de commande.

Les 5 expressions faciales suivantes sont reconnue par cozmo :

  • neutre ( neutral )
  • joie ( happy ) 
  • surprise ( surprised )
  • tristesse ( sad ) 
  • colère (angry ) 

Vous pouvez consulter la documentation de Anki sur les expressions reconnues par Cozmo et le score de reconnaissance