Reading Time: 4 minutes

Introduction

Dans le cadre d’un projet, j’ai été challengé pour effectuer de la reconnaissance de main levée à partir d’un flux caméra streaming dans l’objectif que pendant une séance de vote, nous puissions comptabilisé les votes pour, contre et en déduire l’abstention.

Ce projet a utilisé plusieurs technologies AWS et du .NET Core ainsi que du C.

Si vous souhaitez en savoir plus, je vous invite à consulter l’article medium ici: Valentin Lecerf – Medium

Les challenges à relever

Pour vous mettre un peu dans le contexte. Imaginez une salle de réunion remplie, une application web blazor projetée sur un projecteur permettant de diffuser un support et permettant pendant des sessions de vote d’afficher les résultats dans un temps très réduit.

Une caméra de réunion USB qui filme l’ensemble de la scène. Voila alors un peu le contexte de la situation du challenge à relever. Nous avons dans le cadre de se projet surmonter beaucoup de challenge mais je vais me concentrer sur la partie qui fait l’objet de cet article: l’IA.

Nous avons donc un flux vidéo à notre disposition d’un côté et le cloud de l’autre, comment donc s’en sortir et détecter, comptabiliser des votes à main levées? Après énormément de recherche, personne ne c’était jusqu’alors intéressé à ce challenge.

Voici un peu donc les étapes de réflexion pour dépatouiller le problème:

Le traitement du flux vidéo

Pour effectuer du traitement sur ma vidéo et bénéficier de la puissance du cloud, déjà il faut que mon flux vidéo se retrouve dans le cloud justement. AWS Propose un service Kinesis permettant le streaming video bonne nouvelle c’est ce que je recherche! Comment effectuer le stream maintenant? je n’ai qu’a ma disposition un SDK…

Bah on va faire du C++!

Et c’est partie dans la folle aventure d’un développement de petit programme se basant sur le SDK AWS ainsi que gstreamer afin de balancer le flux vidéo sur le kinesis. Premier challenger: Les réglages. Pour rappel ma caméra est en USB, la performance est dépendant de ma machine vu que c’est elle qui traite l’image, l’encode et la balance sur le service Kinesis. Il faut donc trouver le bon réglage entre Qualité & Performance et cela à pris pas mal de temps!

D’une manière évidente, une caméra en RTSP aurait été plus performante dans notre cas mais on fait avec!

La reconnaissance de main levée

Une fois que j’ai mon flux vidéo sur le service Kinesis je n’ai plus qu’a le traiter!

Dans la panoplie des services IA AWS je demande SageMaker 🙂 SageMaker est un service AWS permettant l’implémentation d’algorithme de machine learning, de faire de l’entrainement, etc… plus d’info ici: Amazon SageMaker – Machine Learning – Amazon Web Services

La première idée qui m’est venu à l’esprit était de construire un modèle, l’entraîner avec des images de main et faire de la reconnaissance sur des frame de la vidéo. Alors ok ça marchait par contre pas mal d’erreur et l’entrainement du modèle demande trop de temps. Afin qu’un modèle soit performant et efficace il faut une quantité de données importante et malgré un petit script pour récupérer les images de main sur le web ce n’était pas suffisant. Et puis un jour, pendant un échange avec un mec de chez AWS (dédicace à Benjamin!), il me souffle une autre idée à l’oreille. Utiliser un modèle pré entrainé! Mais quel con, pourquoi j’y ai pas pensé avant au lieu de faire mon galérien à entraîner mon propre modèle!

Et la nous sommes partis sur la mise en place dans sagemaker de notre python pour utiliser MXNet et ModelZoo, ce qui est fabuleux c’est que modelzoo propose un modèle pré-entrainé pour de la position humaine, ben enfin de compte nous on veut avoir la position des bras et main pour en déduire si la main est levée non? donc avec l’aide de Benjamin nous avons fait notre petit script pour utiliser les coordonnées des différents membres de chaque être humain afin de les comparer par exemple aux épaules ou à la tête afin d’en déduire si oui ou non il a levé la main droite ou gauche.

Et voila, Eureka!

L’hébergement des différentes ressources

Je ne me suis pas étalé la dessus dans cet article mais autour de cela nous avions pas mal de composant permettant de remplir le besoin initialement définit dans notre scénario, comme je l’ai dis un site blazor en .net 3.1, une tripoté de lambda, sagemaker, kinesis, dynamoDB, ECS, EKS, Polly,Alexa… bref pas mal de monde!

Principe de fonctionnement de la reconnaissance par vidéo

Et sur Azure, on l’aurait fait comment ?

Mieux bien évidemment 😉 Non je déconne ou pas 😀

Aujourd’hui les cloud providers proposent plus ou moins des services similaires, c’est juste un nom et un principe de fonctionnement qui change potentiellement.

Pour la partie hébergement du site web, je me serais tourné vers un appservice tout simplement, des azure function, du cosmoDB à la place de la dynamoDB d’Amazon, de l’azure service bus et de l’event hub, du cognitive services et puis du media service avec du machine learning et ça devrait faire l’affaire.

Bref, l’expérience dans azure est bien évidemment possible c’est l’intégration qui est juste différente! Mais ça peut être intéressant de reproduire ce scénario dans azure pour comparer les intégrations, les possibilités et les performances!

Conclusion

Rien n’est impossible, tout est faisable et encore plus simplement avec le cloud!

Nous avons réussi à obtenir un bon résultat mais pas mal d’amélioration étaient à noter tout de même:

  • Type de caméra RSTP serait plus performante
  • Des instabilités avec le service kinesis stream
  • L’utilisation de SNS/SQS au lieu du flux dynamoDB pour la remontée d’info vers le site web

Une belle entrée en matière et de bonnes découvertes pour ma part!

Bon l’inconvénient de la reconnaissance du vote à main levé c’est que juridiquement en france…. bah c’est mort… mais bon peut être un jour 🙂

Si vous voulez en savoir plus, je vous invite à consulter:

Article Original en Anglais: Valentin Lecerf – Medium

A bientôt pour le prochain article!