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

Cozmo SDK : détection et reconnaissance faciale

Cette entrée a été publiée dans Cozmo, Education, Tutoriels en robotique, et marquée avec , , , , , , , le par .

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.

robot.world.wait_for(cozmo.faces.EvtFaceObserved)

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 :

Récupérer l'id du visage reconnu
#!/usr/bin/env python3

import cozmo
import asyncio

def main_program(robot: cozmo.robot.Robot):
  try:
  	e = robot.world.wait_for(cozmo.faces.EvtFaceObserved)
  	print("Face id = " + str(e.face.face_id))

  except asyncio.TimeoutError:
    print("Timeout écoulé")

cozmo.run_program(main_program, use_viewer=True)

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 ».

Assigner un nom à un visage
#!/usr/bin/env python3

import cozmo
import asyncio

def main_program(robot: cozmo.robot.Robot):
  try:
  	e = robot.world.wait_for(cozmo.faces.EvtFaceObserved)
  	e.face.rename_face("humain")

  except asyncio.TimeoutError:
    print("Timeout écoulé")

cozmo.run_program(main_program, use_viewer=True)

 

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.

Prononcer le nom associé à un visage
#!/usr/bin/env python3

import cozmo
import asyncio

def main_program(robot: cozmo.robot.Robot):
  try:
  	e = robot.world.wait_for(cozmo.faces.EvtFaceObserved)
  	robot.say_text("Bonjour" + e.face.name).wait_for_completed()

  except asyncio.TimeoutError:
    print("Timeout écoulé")

cozmo.run_program(main_program, use_viewer=True)

 

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.

		# Activer la reconnaissance d'expression
		robot.enable_facial_expression_estimation(True)

 

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 :

			# l'événement renvoi un objet
			e = robot.world.wait_for(cozmo.faces.EvtFaceObserved)

			# on récupère l'objet Face
			face = e.face

			# on filtre sur un seuil de reconnaisance minimal de l'expression détectée
			if face.expression_score > 60:
				# on affiche Face.face_id, Face.know_expression, Face.expression_score et Face.name
				print("Visage ", str(face.face_id), " : ", face.known_expression, "(", str(face.expression_score), "%)")
		

 

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