Pour continuer à rendre le robot plus intelligent (enfin surtout moins bête), et étant donné qu’il est doté d’une caméra, il est évident qu’il doit avoir la capacité de reconnaître les personnes et les objets qui l’entourent. Cela permet de rendre ses interactions plus vivantes et plus « magiques ».
La reconnaissance faciale et la reconnaissance d’objets sont deux domaines importants de la vision artificielle. Les capacités de calculs actuelles associées à des algorithmes de plus en plus performants (notamment ceux du deep-learning) permettent de faire de la reconnaissance en temps réel, chose essentielle pour avoir des échanges fluides avec le robot.
Reconnaissance faciale
Il y a quelques années, j’avais déjà testé des systèmes de reconnaissance faciale à l’aide de la librairie OpenImaj et les algorithmes de Eigenface, FisherFace ou LBPH. Mais ces différents algorithmes ont besoin d’un nombre assez important de photos du visage à reconnaître pour être entraînés et pouvoir différencier un visage connu d’un autre visage connu. Or, dans le cas du robot, il n’est pas forcément facile d’obtenir un nombre suffisant d’images de la personne qui parle en face de lui. En effet, il est difficile d’envisager un système demandant à l’interlocuteur de prendre la pose pendant plusieurs secondes afin de capturer assez de photos de son visage pour qu’il puisse être reconnu.
En cherchant les autres algorithmes de reconnaissance faciale existant, je suis tombé sur une librairie Python hallucinante, face_recognition, qui fait la combinaison entre plusieurs librairies, algorithmes et concepts récents de détection et de reconnaissance de visages (dlib, OpenFace). Il ne suffit que d’une seule image d’entrainement par personne pour qu’elle puisse être reconnue en temps réel avec un taux de 99.38% ! Rapidité et efficacité ! Tout cela, grâce au deep-learning.
Sans rentrer dans les détails, un réseau de neurones a été entraîné pour calculer une « signature » comprenant 128 mesures pour chaque visage qui lui est passé en entrée : pour 2 images d’une même personne, les « signatures » calculées doivent être très proches, tandis que si ce sont 2 images de 2 personnes différentes, les « signatures » doivent être très éloignées. Apprendre un nouveau visage consiste donc à utiliser ce réseau pour calculer sa « signature » et l’enregistrer (pas besoin de ré-entraîner le réseau), alors qu’identifier un visage consiste également à calculer sa « signature » puis la comparer avec les « signatures » connues : si la distance est proche (selon un certain seuil), on considère que c’est la même personne.
Pour plus de détails, voici un article de l’auteur de la librairie qui décrit assez simplement les différentes étapes de détection et de reconnaissance : Modern Face Recognition with Deep Learning
Reconnaissance d’objets
Pour la reconnaissance d’objets, j’utilise Python avec le réseau de neurones YOLO version 3 par l’intermédiaire d’OpenCV (YOLO = You Only Look Once). Ce réseau permet de reconnaître environ 80 « objets », en passant des personnes aux véhicules, des animaux aux couverts, … Avec une très bonne machine et la carte graphique appropriée, il est capable de traiter 240 images par seconde (au-delà du temps réel !). En effet, sa rapidité est due au fait que le réseau n’a besoin de « voir » (traiter) l’image d’entrée qu’une seule fois contrairement à d’autres réseaux de reconnaissance.
Plutôt que m’étendre sur le sujet, voici une vidéo de présentation faite par l’un de ses créateurs lors d’une conférence TED :
Voici également un article un peu technique présentant ce qui se cache derrière ce réseau : YOLO v3 theory explained
Pour finir
J’ai combiné ces 2 librairies au sein d’une API Rest en Python que j’appelle pour analyser chacune des images provenant de la webcam en alternant la détection et la reconnaissance de visages et d’objets. Sur ma machine, je tourne aux alentours de 100 ms pour détecter les visages, 300 ms pour reconnaître un visage et 200 ms pour reconnaître l’ensemble des objets. Je ne suis pas encore sur du temps réel, mais je m’y approche. Avec une machine plus puissante (avec une carte graphique) et un peu d’optimisation, on devrait y arriver !
Sources de l’API Python que j’ai développée (fortement inspirée de celle de face_recognition)
Bonjour,
Je suis intéressé à ce que vous avait fait mais je n’arrive pas à accéder à votre code source.
Bav
Bonjour,
Il y a eu beaucoup de modifications depuis que j’ai écrit cet article. Je viens de corriger le lien. https://github.com/peltiern/robot/blob/master/robot-raspi/installation/Robot/Programme/reconnaissance-visage/python-server/robot_ai_api.py
Nicolas