Réseaux de neurones en temps réel pour le suivi des mains

Récemment, les chercheurs de GoogleAI ont montré leur approche de la tâche de suivi des mains et de détermination des gestes en temps réel. J'étais engagé dans une tâche similaire et j'ai donc décidé de comprendre comment ils abordaient la décision, quelles technologies ils utilisaient et comment ils avaient atteint une bonne précision lors d'un travail en temps réel sur un appareil mobile. A également lancé le modèle sur Android et testé en conditions réelles.


Pourquoi est-ce important?


La reconnaissance des mains est une tâche plutôt simple, qui est en même temps largement demandée. Cette technologie peut être utilisée dans des applications de réalité supplémentaire pour l'interaction avec des objets virtuels. Il peut également servir de base à la compréhension du langage des signes ou à la création d'interfaces de contrôle basées sur les gestes.

image

Quelle est la difficulté?


La perception naturelle des mains en temps réel est un véritable défi pour la vision par ordinateur, les mains se chevauchent souvent entre elles (doigts croisés ou serrant la main). Alors que les visages ont des motifs très contrastés, par exemple, dans la zone des yeux et de la bouche, l'absence de tels signes dans les mains ne rend la détection fiable que par leurs signes visuels.

Les mains sont constamment en mouvement, changent d'angle d'inclinaison et se chevauchent. Pour une expérience utilisateur acceptable, la reconnaissance doit fonctionner avec un FPS élevé (25+). De plus, tout cela devrait fonctionner sur les appareils mobiles, ce qui augmente les exigences de vitesse, ainsi que les limites de ressources.

Qu'est-ce que GoogleAI a fait?


Ils ont mis en œuvre une technologie de suivi précis des mains et des doigts à l'aide de l'apprentissage automatique (ML). Le programme détermine 21 points clés de la main dans l'espace 3D (hauteur, longueur et profondeur) et, sur la base de ces données, classe les gestes que la main montre. Tout cela sur la base d'une seule image vidéo, fonctionne en temps réel sur les appareils mobiles et évolue à plusieurs mains.

Comment l'ont-ils fait?


L'approche est mise en œuvre à l'aide de MediaPipe , un framework multiplateforme open source pour la construction de pipelines de traitement de données (vidéo, audio, séries temporelles). Quelque chose comme Deepstream de Nvidia, mais avec un tas de fonctionnalités et multiplateforme.

La solution se compose de 3 modèles principaux fonctionnant ensemble:

Détecteur de paume (BlazePalm)

  • prend la pleine image de la vidĂ©o
  • renvoie une boĂ®te englobante orientĂ©e (boĂ®te englobante)

Modèle pour déterminer les points clés de la main

  • prend une photo recadrĂ©e d'une main
  • renvoie 21 points clĂ©s d'une main dans l'espace 3D + indicateur de confiance (plus de dĂ©tails plus loin dans l'article)

Algorithme de reconnaissance des gestes

  • prend les points clĂ©s de la main
  • renvoie le nom du geste que la main montre

L'architecture est similaire à celle utilisée dans la tâche d' estimation de pose . En fournissant une image de la main recadrée et alignée avec précision, le besoin d'augmentation des données (rotations, translation et mise à l'échelle) est considérablement réduit, et le modèle peut plutôt se concentrer sur la précision de la prédiction des coordonnées.

Détecteur de paume


Pour trouver la paume, un modèle appelé BlazePalm est utilisé - un modèle de détecteur à un coup (SSD) optimisé pour travailler sur un appareil mobile en temps réel.

Une étude GoogleAI a formé un détecteur de paume au lieu d'un détecteur de bras entier (la paume est la base d'une paume sans doigts). L'avantage de cette approche est qu'il est plus facile de reconnaître une paume ou un poing que toute la main avec des doigts gesticulant, et la paume peut également être sélectionnée en utilisant des boîtes de délimitation carrées (ancres), en ignorant les rapports d'aspect, et en réduisant ainsi le nombre d'ancres requis de 3 à 5 fois

L' extracteur de fonctionnalités FPN ( Feature Pyramid Networks for Object Detection ) a également été utilisé pour mieux comprendre le contexte de l'image, même pour les petits objets.

En tant que fonction de perte, une perte focale a été prise, ce qui résout bien le déséquilibre des classes qui se produit lors de la génération d'un grand nombre d'ancres.

Entropie croisée classique: CE (pt) = -log (pt)
Perte focale: FL (pt) = - (1-pt) log (pt)

Plus d'informations sur la perte de Focall peuvent être trouvées dans l'excellent téléavertisseur de Facebook AI Research (lecture recommandée)

En utilisant les techniques ci-dessus, une précision moyenne de 95,7% a été atteinte. Lors de l'utilisation d'une entropie croisée simple et sans FPN - 86,22%.

Définition des points clés


Une fois que le détecteur de paume a déterminé la position de la paume sur toute l'image, la région augmente d'un certain facteur et s'étend pour couvrir toute la main. Plus loin sur l'image recadrée, le problème de régression est résolu - la position exacte de 21 points dans l'espace 3D est déterminée.

Pour la formation, 30 000 images réelles ont été marquées manuellement. Un modèle 3D réaliste de la main a également été réalisé à l'aide duquel des exemples plus artificiels ont été générés sur différents fonds.


Ci-dessus: images réelles de la main avec des points clés marqués. Ci-dessous: images artificielles de la main réalisées à l'aide d'un modèle 3D

Reconnaissance des gestes


Pour la reconnaissance des gestes, un algorithme simple a été utilisé qui détermine l'état de chaque doigt (par exemple, courbé ou droit) par les points clés de la main. Ensuite, toutes ces conditions sont comparées à l'ensemble de gestes existant. Cette méthode simple mais efficace vous permet de reconnaître les gestes de base avec une bonne qualité.

Optimisations


Le principal secret de l'inférence rapide en temps réel est caché dans une optimisation importante. Le détecteur de paume, qui prend le plus de temps, ne démarre que lorsque cela est nécessaire (assez rarement). Ceci est réalisé en calculant la position de la main dans l'image suivante sur la base des points clés précédents de la main.

Pour la durabilité de cette approche, une autre sortie a été ajoutée au modèle pour déterminer les points clés - un scalaire, qui montre à quel point le modèle est sûr que la main est présente sur l'image recadrée et qu'elle est correctement déployée. Lorsque la valeur de confiance tombe en dessous d'un certain seuil, le détecteur de palme est lancé et appliqué à l'ensemble du cadre.


Test de réalité


J'ai lancé cette solution sur un appareil Android (Xiaomi Redmi Note 5) pour un test en conditions réelles. Le modèle se comporte bien, cartographie correctement le squelette de la main et calcule la profondeur avec un nombre décent d'images par seconde.


Parmi les inconvénients, il est possible de noter comment la précision et la vitesse commencent à descendre avec un mouvement constant de la main le long du cadre. Cela est dû au fait que le modèle doit constamment redémarrer le détecteur, car il perd la position de la main lors du déplacement. Si la vitesse pour trouver une main en mouvement est plus importante pour vous que la définition des gestes, vous devriez chercher d'autres approches.


Certains problèmes surviennent également lorsque la main croise le visage ou des arrière-plans complexes similaires. Sinon, un excellent travail de GoogleAI, c'est une grande contribution au développement futur de la technologie.

Article de blog GoogleAI
Github mediapipe hand tracking

Source: https://habr.com/ru/post/fr466781/


All Articles