En utilisant l'API ** ALFaceCharacteristics ** introduite dans Reconnaissance de l'âge à l'aide de l'API de Pepper, des expressions faciales telles que des sourires Vous pouvez le reconnaître. Ici, nous allons essayer deux méthodes, la détection de sourire fournie par l'API et d'autres méthodes de reconnaissance des expressions faciales.
De plus, ** ALFaceCharacteristics API ne dispose pas d'un moyen de vérifier le fonctionnement avec un robot virtuel, et une machine Pepper réelle est requise. ** Je voudrais que vous expérimentiez la machine à poivre à Aldebaran Atelier Akihabara. (URL de réservation: http://pepper.doorkeeper.jp/events)
Le fichier projet de ce didacticiel est disponible sur GitHub https://github.com/Atelier-Akihabara/pepper-face-characteristics-example. Il existe plusieurs façons d'obtenir le code sur GitHub, mais l'un des moyens les plus simples est d'obtenir l'archive à partir du lien Télécharger ZIP. Il existe diverses autres méthodes telles que l'utilisation d'outils liés à git, veuillez donc vérifier en fonction de la situation.
En utilisant l'API ʻALFaceCharacteristics`, il est possible de juger le degré de sourire sur le visage reconnu à partir des caractéristiques de l'image telles que la finesse des yeux et si les coins de la bouche sont surélevés. Cette valeur peut être utilisée pour déterminer si la personne que Pepper reconnaît sourit.
Le moyen le plus simple de vérifier le sourire est d'utiliser l'événement FaceCharacteristics / PersonSmiling
.
Commençons par vérifier le contenu du document.
Plus d'informations sur cet événement peuvent être trouvées dans la documentation Choregraphe sur NAOqi Developer guide> NAOqi Framework> NAOqi API> NAOqi PeoplePerception> ALFaceCharacteristics> ALFaceCharacteristics API. Si vous cliquez sur le lien FaceCharacteristics / PersonSmiling
, vous trouverez l'explication suivante.
Event: "FaceCharacteristics/PersonSmiling" callback(std::string eventName, int id, std::string subscriberIdentifier)
Raised when a person has a smile degree above the current threshold (default = 0.7). Parameters:
- eventName (std::string) – “FaceCharacteristics/PersonSmiling”
- id – ID of the person as defined by the ALPeoplePerception API.
- subscriberIdentifier (std::string) –
Il est expliqué que cet événement se produit lorsqu'il y a une personne dont le degré de sourire (exprimé de 0,0 à 1,0) dépasse le seuil (la valeur par défaut est 0,7).
De plus, la valeur transmise par cet événement est ʻid. Il s'agit de [ALPeoplePerception: Get List of People](http://qiita.com/Atelier-Akihabara/items/4162192129f366da1240#alpeopleperception-%E4%BA%BA%E3%81%AE%E4%B8%80% E8% A6% A7% E3% 81% AE% E5% 8F% 96% E5% BE% 97) C'est l'identifiant de la personne que nous avons déjà vu. En d'autres termes, sur la base de la valeur obtenue à partir de ce
FaceCharacteristics / PersonSmiling, il est possible d'obtenir des informations supplémentaires sur la personne qui a détecté qu'elle sourit en acquérant
PeoplePerception / Person /
Avant de créer l'application, vérifions le comportement de l'événement avec Memory Watcher. Tout d'abord, définissez le contenu de l'événement que vous souhaitez archiver dans l'observateur de mémoire.
Connectez Choregraphe à la machine à poivre réelle
Dans le panneau Memory Watcher, double-cliquez sur **
Tout d'abord, je veux vérifier FaceCharacteristics / PersonSmiling
, alors entrez PersonSmiling dans ** [Filter] [A] **, cochez ** [PersonSmiling] sous FaceCharacteristics
[B] **, puis cliquez sur [ Cliquez sur le bouton OK
Cela ajoutera FaceCharacteristics / PersonSmiling
à votre observateur de mémoire.
![memory-watcher-2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/9c76f6c8-0a07-60f4-243e-400941e3617e.png)
Ensuite, surveillez également PeoplePerception / VisiblePeopleList
pour voir la valeur de l'ID de la personne. De la même manière qu'en 3., entrez VisiblePeopleList dans ** [Filter] [A] **, cochez ** [VisiblePeopleList] sous PeoplePerception
[B] **, puis cliquez sur le bouton [OK].
Assurez-vous que «FaceCharacteristics / PersonSmiling» et «PeoplePerception / VisiblePeopleList» sont ajoutés au panneau Memory Watcher comme indiqué ci-dessous.
![memory-watcher-3.png](https://qiita-image-store.s3.amazonaws.com/0/54394/60017d04-c09f-90ab-9b92-aa9589281c3b.png)
Maintenant, vérifions le fonctionnement de l'événement de mémoire. Lorsque vous vous tenez devant Pepper, vous devriez voir les changements suivants dans le contenu de l'observateur de mémoire.
Le numéro «[6602]» est affiché dans «PeoplePerception / VisiblePeopleList». Cela indique que Pepper reconnaît une personne dans la zone que la caméra peut reconnaître, et que cette personne a l'identifiant «6602». (Cette valeur dépend de l'état interne de Pepper à ce moment-là.) Ensuite, rions devant Pepper. Essayez de lever la bouche, de plisser les yeux et de montrer vos dents pour faire un sourire.
Ensuite, «6602» a été affiché dans «FaceCharacteristics / PersonSmiling». Cela indique que Pepper a déclenché cet événement lorsqu'une personne (l'identification est «6602») avait un niveau de sourire supérieur à 0,7 et que l'identifiant de cette personne était imprimé sur «FaceCharacteristics / PersonSmiling».
Maintenant que vous avez vu le mouvement de FaceCharacteristics / PersonSmiling
, créons une application utilisant cet événement.
Ici, à titre d'exemple, créons une application ** qui dit "Pouvez-vous rire de moi?" Au démarrage, et quand elle reconnaît un sourire, elle dit "(ID) -san, vous avez un joli sourire!" Je vais.
L'exemple de projet est ** subscribe-person-smiling **. Parmi les fichiers obtenus à partir de GitHub, vous pouvez l'ouvrir en double-cliquant sur subscribe-person-smiling.pml
dans le dossier subscribe-person-smiling
.
Il est créé par la procédure suivante.
Cliquez sur le bouton ** Ajouter un événement de mémoire [+] sur le côté gauche du diagramme de flux **, entrez ** PersonSmiling [A] ** dans le filtre et cochez ** FaceCharacteristics / PersonSmiling [B] ** [OK] ] Bouton
Placez les cases suivantes sur le diagramme de flux
Connectez chaque boîte à l'entrée «FaceCharacteristics / PersonSmiling» créée en 1. et définissez le contenu comme suit:
Personnalisez la zone de texte Say (http://qiita.com/Atelier-Akihabara/items/8df3e81d286e2e15d9b6#%E8%A3%9C%E8%B6%B3say-text%E3%83%9C%E3%83] % 83% E3% 82% AF% E3% 82% B9% E3% 81% AE% E3% 82% AB% E3% 82% B9% E3% 82% BF% E3% 83% 9E% E3% 82% A4 % E3% 82% BA) et changez ce que vous dites
sentence += str(p) + "Monsieur, un joli sourire!"
Lorsque vous exécutez cette application et que vous allumez votre sourire, vous dites: "12743-san, vous avez un joli sourire!" Une fois que vous vous éloignez de Pepper et que vous vous approchez à nouveau, ou lorsqu'une autre personne s'approche et sourit, vous pouvez également voir qu'il prononce un autre identifiant, tel que "16234, vous avez un joli sourire!".
Cette fois, je parle de l'identifiant de la personne tel quel pour des raisons d'explication, mais je pense qu'il serait intéressant de simplement prendre une photo avec FaceCharacteristics / PersonSmiling
comme déclencheur sans utiliser cet identifiant. Veuillez en profiter.
Semblable à la reconnaissance de l'âge, vous pouvez obtenir le degré de sourire en utilisant l'identifiant de la personne comme clé. Dans l'exemple précédent, il n'a peut-être pas été reconnu comme un sourire de manière inattendue, mais si vous utilisez cet exemple pour vérifier votre propre niveau de sourire, vous pourrez peut-être voir les caractéristiques du jugement du niveau de sourire dans Pepper.
La structure de base est la [Get Age Box](http://qiita.com/Atelier-Akihabara/items/4162192129f366da1240#alfacecharacteristics-%E5%B9%B4%E9%BD%A2%] introduite dans l'exemple d'acquisition d'âge. Identique à E3% 81% AE% E6% 8E% A8% E5% AE% 9A).
À partir de l'ID de la personne obtenu par la zone Basic Awareness, essayez de faire référence à la valeur de PeoplePerception / Person / <ID> / SmileProperties
.
Ici, à titre d'exemple, faisons en sorte que ** Basic Awareness suive une personne pour obtenir un niveau de sourire à intervalles de 10 secondes et parler de cette valeur **.
L'exemple de projet est ** get-smile **. Parmi les fichiers obtenus à partir de GitHub, vous pouvez l'ouvrir en double-cliquant sur «get-smile.pml» dans le dossier «get-smile». Il est créé par la procédure suivante.
Créez une boîte Get Smile comme une boîte Python vide. Semblable à la boîte Get Age, il a la configuration d'entrée / sortie suivante. Veuillez vous référer au Python Box Concept pour savoir comment le créer.
Double-cliquez sur la case Get Smile pour ouvrir l'éditeur de script et écrire un script Python comme celui ci-dessous.
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
self.memory = ALProxy("ALMemory")
self.faceChar = ALProxy("ALFaceCharacteristics")
def onUnload(self):
pass
def onInput_onPeopleDetected(self, peopleId):
if peopleId < 0:
return
r = self.faceChar.analyzeFaceCharacteristics(peopleId)
if not r:
self.onUnknown()
return
smileData = self.memory.getData("PeoplePerception/Person/%d/SmileProperties" % peopleId)
self.logger.info("Smile Properties: %d => %s" % (peopleId, smileData))
if smileData and len(smileData) == 2:
self.onSmile(smileData[0])
else:
self.onUnknown()
La structure du code est similaire à la zone Obtenir l'âge. La seule différence est que la clé obtenue à partir de ʻALMemory est
SmileProperties au lieu de ʻAgeProperties
.
Reportez-vous au contenu du fichier de projet pour les valeurs de chaque boîte.
Lorsque vous exécutez le projet get-smile et que Pepper peut voir son visage, il parlera de son sourire toutes les 10 secondes, comme indiqué ci-dessous. Si vous essayez de dire la valeur de la virgule décimale telle quelle, ce sera difficile à comprendre car il sera prononcé comme "Zerotenichi", donc je parle une valeur entière multipliée par 100.
Votre sourire a environ 13 ans
Votre sourire a environ 34 ans
Lorsque vous modifiez votre expression faciale, vous pouvez voir que la valeur du niveau de sourire change. Essayez différentes expressions et expérimentez les facteurs que Pepper utilise pour calculer les sourires.
Si vous regardez le panneau Log Viewer, vous pouvez également voir la valeur brute du niveau de sourire et la valeur indiquant la précision.
[INFO ] behavior.box :onInput_onPeopleDetected:20 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1892204656__root__GetSmile_5: Smile Properties: 47915 => [0.12999999523162842, 0.09800000488758087]
[INFO ] behavior.box :onInput_onPeopleDetected:20 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1892204656__root__GetSmile_5: Smile Properties: 47915 => [0.3400000035762787, 0.8450000286102295]
Deux nombres entre «[]» sont affichés, tels que «[0.3400000035762787, 0.8450000286102295]», le premier est le degré de sourire et le second est la précision du degré de sourire. Cette précision est une valeur numérique qui indique le degré de confiance dans la valeur du niveau de sourire défini, et plus elle est proche de 0, moins elle est confiante, et plus elle est proche de 1, plus elle est confiante.
De cette manière, en se référant à PeoplePerception / Person / <ID> / SmileProperties
, des valeurs plus détaillées peuvent être obtenues et un contrôle précis peut être effectué.
Bien que la reconnaissance et le format des sourires soient différents, en utilisant les valeurs de PeoplePerception / Person / <ID> / ExpressionProperties
, les expressions faciales des gens sont sans expression (Neutre), heureux (Heureux), surpris (Surpris) et en colère (Surpris). Il est possible de déterminer si cela ressemble à Angry) ou Sad.
Les informations obtenues par SmileProperties
étaient sous la forme [sourire, précision]
, mais la valeur de ʻExpressionProperties était de l'ordre de
[sans expression, heureux, surprise, colère, tristesse] `, respectivement. Le degré de jugement en tant qu'expression est stocké dans la plage de 0,0 à 1,0. En outre, la somme de ces valeurs est définie sur 1,0.
Un exemple utilisant cette valeur est fourni comme exemple de projet ** get-expression **. Parmi les fichiers obtenus à partir de GitHub, vous pouvez l'ouvrir en double-cliquant sur «get-expression.pml» dans le dossier «get-expression». Il est créé par la procédure suivante.
Créez une boîte Get Expression comme une boîte Python vide
Les valeurs envoyées à la sortie onMax sont 0 ... neutre, 1 ... heureux, 2 ... surpris, 3 ... en colère, 4 ... triste.
Écrivez le code suivant sous la forme d'une zone Get Expression
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
self.memory = ALProxy("ALMemory")
self.faceChar = ALProxy("ALFaceCharacteristics")
def onUnload(self):
pass
def onInput_onPeopleDetected(self, peopleId):
if peopleId < 0:
return
r = self.faceChar.analyzeFaceCharacteristics(peopleId)
if not r:
self.onUnknown()
return
exprData = self.memory.getData("PeoplePerception/Person/%d/ExpressionProperties" % peopleId)
self.logger.info("Expression Properties: %d => %s" % (peopleId, exprData))
if exprData and len(exprData) == 5:
self.onNeutral(exprData[0])
self.onHappy(exprData[1])
self.onSurprised(exprData[2])
self.onAngry(exprData[3])
self.onSad(exprData[4])
self.onMax(exprData.index(max(exprData)))
else:
self.onUnknown()
Pour tester, écrivez le flux suivant, par exemple. Chaque sortie de onNeutral vers onSad est un cas de commutation qui modifie le contenu de la boîte de journal qui génère le journal pour vérifier l'opération, comme "Vous avez l'air heureux" ou "Êtes-vous surpris?" En fonction de la valeur de onMax. Placez la boîte
De cette façon, vous pouvez obtenir chaque valeur de ʻExpressionProperties`, parler en fonction de l'élément avec la valeur la plus élevée, et ainsi de suite.
Par exemple, si vous exécutez un exemple de projet, ouvrez la bouche, ouvrez les yeux et faites un visage surpris, le journal affichera: Vous pouvez voir que l'élément Surpris a une grande valeur.
[INFO ] behavior.box :onInput_onPeopleDetected:20 _Behavior__...: Expression Properties: 60331 => [0.14000000059604645, 0.0, 0.85999995470047, 0.0, 0.0]
[INFO ] behavior.box :onInput_message:27 _Behavior__...: Neutral: 0.140000000596
[INFO ] behavior.box :onInput_message:27 _Behavior__...: Happy: 0.0
[INFO ] behavior.box :onInput_message:27 _Behavior__...: Surprised: 0.8599999547
[INFO ] behavior.box :onInput_message:27 _Behavior__...: Angry: 0.0
[INFO ] behavior.box :onInput_message:27 _Behavior__...: Sad: 0.0
De plus, puisque la troisième valeur de ʻExpressionProperties`, la valeur surprenante, est la valeur maximale, "2" est envoyé à la sortie onMax. Cette valeur est entrée dans la case Switch Case et le processus de dire «Êtes-vous surpris?» Est exécuté.
De cette façon, en utilisant PeoplePerception / Person / <ID> / ExpressionProperties
, il est possible de juger des expressions faciales autres que les sourires. En utilisant les informations faciales telles que les sourires que nous avons vues jusqu'à présent, il est possible de faire bouger Pepper en fonction des émotions de l'utilisateur.
Recommended Posts