C'est quoi "le reste" pour un problème de classification par un modèle d'IA ?

Tout ce qui n'est pas l'une des 2 classes apprises par le modèles

a marqué ce sujet comme résolu.

Bonjour ! J’ai utilisé un algorithme ("de" ?) SVM pour entraîner un modèle à classer 2 mouvements de main (bien assez pour apprendre.) Le modèle "fonctionne" : Sur un dataset créé le même jour au même endroit par la même personne (donc arrière plan, vêtements, couleurs identiques sur chaque échantillon), j’ai une précision de 90% !
Cependant, quand j’exporte le modèle pour le réutiliser ailleurs, dans d’autres conditions… patatra ! - prévisible. Il y a 2 choses qui ne vont pas.

1.j’ai changé de vêtements. Les carreaux de ma chemise de la veille, présents sur tous les échantillons, ne sont plus là, donc le modèle est paumé.
2.Absolument tout et n’importe quoi peut-être reconnu comme un de mes 2 mouvements de main, comme ma tête qui rentre dans le champ !

pour le premier problème, je pense ne rien pouvoir y faire dans l’immédiat : l’info des carreaux sera diluée dans la masse des échantillons, quand il y en aura assez pour que la seule constante récurrente entre les échantillons soit les mains qui bougent.
j’espère ?
C’est le second problème qui m’ennuie… Ma tête n’est pas une main enfin ! Mon problème vient de mon modèle exporté… C’est une fonction qui donne la distance de l’échantillon à l’hyperplan… Mais je ne sais pas où est l’hyperplan exactement (toutes les distances sont négatives) mais surtout tout et n’importe quoi a une distance à cet hyperplan, et si j’essaie d’encadrer l’hyperplan (genre à telle distance de l’hyperplan, je considère que c’est autre chose) je perds beaucoup de mouvements correct.

Au final, j’ai un modèle précis dans un contexte contrôlé, mais avec aussi robuste que du cristal. :( Comment puis-je améliorer cette robustesse ? Comment adapter le modèle pour ignorer ce qui n’est pas un de mes 2 mouvements, donc "le reste" ? Comment définir ce reste d’ailleurs ? c’est bien trop large !

Salut,

La reconnaissance de gestes de la main est assez complexe. Il y a beaucoup de méthodes pour le faire à partir d’images (voir par exemple cette revue assez récente, qui montre un panorama assez large, il y en a peut-être de meilleurs).

Pour ton problème de vêtements qui changent, ça pourrait être intéressant de faire des prétraitements sur l’image, pour extraire l’information la plus utile (en faisant de la détection d’avant-plan, de la segmentation, etc.).

Pour le deuxième problème, ça peut être compliqué. Tu entraînes directement sur les pixels ?

Coucou !

Merci pour la revue, ça me fera ma lecture du jour. Actuellement,(je débute en ML depuis 8 semaines) je n’ai encore rien lu sur la détection d’avant-plan ou la segmentation, donc je devrai prendre un peu de temps pour me renseigner dessus. Est-ce que ces prétraitements dont tu parles incluent de la détection d’objet pour isoler les mains ? je pense au module Object Detector de ml5.js mais je ne sais pas si ce modèle a été entraîner à identifier des mains, où si il les ignores pour ce concentrer sur l’objet tenu.

J’ai essayé d’entraîner directement sur les pixels (vidéo en niveaux de gris.) Le résultat a été un modèle avec une précision de 48% avec 172*172*5 = 147920 paramètres (pixels hauteur largeur nombre de frames) : tellement complexe qu’il était inutilisable et impossible à exporter.
Du coup j’ai changé d’approche. Je garde la vidéo en niveau de gris, mais j’ai fait de l’extraction de caractéristique. La première cible les formes (utilisation d’un filtre de Sobel pour voir les différents angles et construire un histogramme) ce qui génère la sensibilité aux motifs sur les vêtements, comme les rayures ou les carreaux. La seconde cible le mouvement (moyenne des différences d’intensité de pixels entre 2 frames sur toute la surface de l’image.) Ca me donne un modèle à 24 paramètres. Il a 90% de précision, mais uniquement sur des échantillons "parfaits" : bien découpés, même fringues… mais sa robustesse est ridicule, je ne peux même pas la quantifier. :(

Update

J’ai continué un peu ma réflexion, histoire de ne pas attendre que la réponse tombe du ciel.

Si on pense de manière mathématique, je comprends que je ne peux pas définir "le reste". C’est le reste de quoi ?
Si je prends l’ensemble R, et dans cet ensemble je prends l’ensemble {1, 2}. "le reste" ici, c’est R{1, 2}, donc "le reste" est infini. Dans mon cas c’est pareil, "le reste", tout ce qui n’est pas "geste 1 ou geste 2", c’est infini, donc je ne peux pas le définir pour mon modèle, donc je dois abandonner cette notion.

Je viens de découvrir un concept en fouillant la doc SciKitLearn : les seuils de décision. Je peux dire "en dessous de ce niveau de certitude, le résultat est faux". Si le résultat est faux pour mes 2 classes, alors ce n’est ni mon geste 1, ni mon geste 2. Je ne peux pas faire ça, car mon modèle est entraîné en python, et exporté avec m2cgen vers JavaScript. Ca me génère simplement une fonction linéaire définie sur un espace à 24 dimensions (le nombre de paramètres après l’extraction des caractéristiques) à valeur dans R. Et encore, les valeurs fournies sont systématiquement négatives. je peux mettre des seuils sur ces valeurs, mais comme je disais, impossible d’être précis avec ces seuils : ma tête est le geste 1, parfois le geste 1 devient le geste 2 et inversement.

Si je cherche un peu du côté de l’extraction de premier plan, ça me donne des solutions à base d’entraînement de CNN. Interdit pour moi, je suis en stage et mon sujet me contraint de rester dans l’apprentissage supervisé et les SVM. C’est embêtant mais bon vu comment je galère déjà, aller jouer avec l’apprentissage profond me paraît prématuré.

J’ai fini par tomber sur les travaux de Victor Dibia qui permet d’isoler les mains dans un quadrilatère. Il est possible d’extraire mes caractéristiques uniquement à l’intérieur de ces régions : d’une part ça me donne un résultat seulement s’il y a des mains, donc adieu ma tête. Et ensuite, ça réduit fortement la région où j’extraie mes caractéristiques. Je vais négocier avec mon tuteur pour utiliser ça : Ca utilise TensorFlow, que je suis incapable d’utiliser pour l’instant, donc je vais avoir besoin d’aide. Est-ce que vous pensez que ça aura les effets auxquels je pense, ou je réfléchit mal ? Est-ce que ça peut me créer d’autres problèmes ?

+0 -0

C’est un stage dans quel cadre exactement ? Parce que la détection de mouvement de mains, ce n’est pas un problème facile (cf. la littérature) et ça ne sert à rien de réinventer des choses qui ne marchent pas vraiment, sauf contraintes très spécifiques. Quel est l’objectif exact (et les motivations derrière) ?

Je connais une solution clés-en-main ou presque (il y en a peut-être d’autres). C’est un exemple fournit avec le SDK de Luxonis (ils font des caméras RGB-D avec des accélérateurs matériels) : https://github.com/geaxgx/depthai_hand_tracker. Ça intègre une brique de chez Google (Mediapipe) qui identifie la posture de la main.

+0 -0

Parce que la détection de mouvement de mains, ce n’est pas un problème facile (cf. la littérature) […]

Aabu

Je m’en rends bien compte : C’est une chose d’avoir un modèle qui fonctionne dans un environnement aseptisé, c’en est une autre de le déployer et de le rendre robuste ! :-O

Quel est l’objectif exact (et les motivations derrières) ?

Aabu

L’objectif est de faire un modèle capable de reconnaître les mouvements d’un lavage de main selon les recommandations de l’OMS. Le rendu final doit tourner sur le navigateur, côté client uniquement, d’où m2cgen pour passer de Python à JS. C’est aussi pour ça que finalement le travail de Victor Dibia ne me sert pas : Le modèle a beaucoup de mal avec les mains jointes.
J’étudie les systèmes embarqués à la base, donc absolument rien à voir avec ma formation. C’est pour ça qu’on m’impose l’algorithme SVM et qu’on m’interdit l’apprentissage profond. (J’ai quand même essayé, mais je me suis cassé les dents sur TensorFlow. :’D ) Mais je pense que ce décalage entre ma formation et le sujet est bien compris : De ce que j’ai déduit, le résultat du projet ne sera pas exploité, il n’est même pas considéré comme confidentiel (le patron est OK pour que j’utilise GitHub et mon PC perso au lieu du serveur Git et du PC de l’entreprise). Je pense que c’est un prétexte pour me faire apprendre une compétence hors formation mais très utile quand-même, c’est pour ça que ça ne le dérange pas de me faire réinventer une roue carrée. C’est pour ça aussi que le projet est de créer le modèle moi-même, pas de juste appliquer un modèle existant : En ce sens mon tuteur est content car j’ai créé le modèle et bien identifié toutes les limites. Mais je ne peux pas considérer que c’est "réussi" vu tout les défauts qu’il y a.

Je viens de jeter un œil et dépôt que tu as linké. Je suis content : C’est ce que fait le module Handpose de ml5.js, mais cette fois il prend en charge les deux mains ! Je peux m’en servir pour cadrer la zone à traiter, en me servant des 2 points les plus éloignés parmi les 42. Il doit aussi sûrement être possible d’extraire une autre caractéristique pertinente avec un tel repérage dans l’espace, pour distinguer mes 2 gestes.
Cependant, je vois que ça tourne avec python et un modèle TF. Je vais essayer de trouver un moyen de porter ce modèle vers ml5.js, seule chose que j’arrive à utiliser pour l’apprentissage profond.

Merci !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte