Bienvenue

Machine Learning

GestureKey

PythonOpenCVMediaPipeScikit-learnPyQt6

Système de détection des gestes de la main en temps réel qui transforme l'image de la webcam en raccourcis clavier du système. Architecture en couches propre avec un pipeline de ML intégré : des images brutes de la caméra aux actions système, sous forme d'application dans la barre des tâches.

Le problème

Je voulais piloter mon ordinateur pendant des présentations et des enregistrements sans toucher au clavier : une couche de raccourcis par gestes qui tourne en arrière-plan. Le principal défi était une détection assez rapide et stable pour un usage réel : éclairage variable, léger mouvement de la caméra et imprécision naturelle de la position de la main.

Décisions clés

MediaPipe pour détecter les points de repère plutôt qu'un pipeline de vision maison

MediaPipe renvoie 21 points de repère 3D normalisés par main en moins de 10 ms sur CPU. Construire l'équivalent de zéro avec OpenCV aurait pris des mois pour un résultat inférieur. La bonne décision d'ingénierie était de considérer la détection de la main comme un problème résolu et de concentrer le travail original sur le classifieur et le moteur de gestes au-dessus.

Random Forest plutôt qu'un réseau de neurones pour classer les gestes

Un CNN a besoin de milliers d'images et d'un GPU pour s'entraîner en un temps raisonnable. Mais MediaPipe extrait déjà des points de repère sémantiques — les positions relatives de 21 articulations —, donc les pixels bruts n'ont plus d'importance. Sur cette entrée structurée, un Random Forest entraîné avec 200 exemples par geste dépasse 98 % de précision et infère en moins de 2 ms. Un réseau de neurones aurait ajouté de la complexité, du temps d'entraînement et du poids au déploiement sans gain de précision.

Stabilisateur temporel par vote majoritaire sur une fenêtre

Les prédictions image par image sont bruitées : si un doigt bouge d'un pixel, le classifieur peut renvoyer brièvement la mauvaise classe. Déclencher un raccourci système à chaque prédiction brute rendrait l'application inutilisable. Le stabilisateur garde un tampon des N dernières prédictions et n'émet une action que si le même geste remporte le vote sur toute la fenêtre. Cela supprime le scintillement sans latence perceptible.

PyQt6 pour l'application de la barre des tâches plutôt que Tkinter ou Electron

L'application doit tourner discrètement en arrière-plan, intercepter des raccourcis clavier globaux et injecter des événements clavier au niveau du système, ce qui demande un accès natif. PyQt6 s'intègre proprement aux API de la zone de notification et fournit de vrais hooks de raccourcis globaux. Tkinter ne gère pas la zone de notification. Electron aurait été absurde pour un utilitaire d'arrière-plan : une instance Chromium de 150 Mo pour remplacer un binaire natif de 4 Mo.

Résultat

GestureKey tourne de façon stable en arrière-plan sans impact notable sur le CPU ou la mémoire. Le modèle généralise bien à différentes conditions d'éclairage et à des utilisateurs absents du jeu d'entraînement. Le projet a affiné ma compréhension de l'endroit où le ML apporte de la valeur : non pas en remplaçant la vision classique, mais dans la couche de classification, là où des caractéristiques structurées existent déjà.

Points forts

  • —Pipeline modulaire : Caméra → Tracker → Classifieur → Moteur de gestes
  • —Modèle Random Forest entraîné sur 21 points anatomiques de la main
  • —8 gestes distincts : défilement, volume, zoom, capture d'écran, vue des tâches et plus
  • —Stabilisateur temporel qui élimine le bruit des prédictions image par image
  • —Application PyQt6 dans la barre des tâches, discrète en arrière-plan

Pipeline

CaptureOpenCV
→
Points de repèreMediaPipe
→
ClassificationRandom Forest
→
ActionMoteur de gestes

Gestes

TWO_FINGERS → DéfilementTHREE_FINGERS → VolumePINCH → ZoomPALM→FIST → PausePALM×2 → Vue des tâches

Démo

Défilement

Volume

Vue des tâches

Pause

Barre des tâches

Travaillons ensemble