IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Traquage oculaire ?


Sujet :

OpenCV

  1. #1
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut Traquage oculaire ?
    Bonjour à tous !

    Je suis en train de me lancer dans la programmation d'un traqueur oculaire ayant pour but de pouvoir placer sur l'écran un curseur/pointeur à l'endroit regardé par l'utilisateur (ou tout du moins d'en retenir une trace).

    Je souhaiterai évidemment que ma solution coûte le moins cher possible aussi bien au niveau logiciel (d'où le choix OpenCV) que matériel (j'ai une vieille logitech pourrie, mais je peux envisager d'acheter quelque chose de mieux et/ou de bidouiller). Il va aussi de soi que je compte faire du temps réel

    A ce titre je me demandais si certains d'entre vous s'étaient déjà lancé dans ce genre de développement et sauraient répondre aux questions suivantes :
    - quel matériel vaut-il mieux choisir (camera montée sur lunette (+ frontal), webcam, ...) ?
    - quel(s) algorithme(s) et méthode(s) utiliser (s'ils sont déjà implémentés dans OpenCV c'est encore mieux) ?
    - quels sont les pièges à éviter ? autres remarques ?

    Merci d'avance pour vos éclairages
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 39
    Points
    39
    Par défaut
    @TheGzD : tu fais ton doctorat sur le sujet ?
    J'ai dû moi-même développer quelque chose de similaire à l'époque, dans mon DEA.

    Plusieurs techniques, tout en restant low-cost :
    - prendre une webcam, virer le filtre IR, et fonctionner avec des images en proches infrarouge. L'ITU GazeTracker (http://www.gazegroup.org/downloads/23-gazetracker, avec support de la part du COGAIN, etc...) fonctionne très bien dans ce cas. Par contre, tu devras désolidariser l'objectif/la CM de la webcam, pour la monter sur un support type lunettes, et ajouter une diode infrarouge. Sur ebay, tu peux trouver des webcam avec diodes infrarouges prémontées (matériel chinois), bien suffisant pour ça. Il faudra juste forcer les LEDs IR à rester allumées en scotchant un bout de papier opaque sur le détecteur de luminosité. C'est le plus efficace, mais aussi le plus contraignant (il faut porter les lunettes en continu). L'avantage : image de grande taille, de qualité (pas de problèmes de luminosité), pas de parallaxe quand le visage bouge.
    - si tu veux garder une webcam en lumière visible classique, c'est plus compliqué. Soit tu travailles toujours avec une webcam montée sur des lunettes (plus facile), ou tu travailles avec une webcam montée au-dessus de l'écran de l'utilisateur (plus compliqué).
    En effet, il te faut obtenir l'image de l'iris (pour savoir où l'utilisateur regarde), mais aussi la position de la tête en 3D, pour compenser les effets de parallaxe par rapport à l'image de l'oeil (tu as donc une composition de translations, réductions, homothéties, etc...)
    Obtenir la position de la tête dans l'espace est compliqué. Il existe des frameworks tout fait (mais pas forcément libres/gratuits/open source) : FaceApi, face.com, etc...
    L'idée reste toujours la-même : estimer la déformation de ce ressemble à un visage dans l'image par rapport à une image de référence.
    J'avais utilisé les AAM à l'époque, pour calculer la position de la tête (pitch, yaw, roll), afin d'avoir des degrés de déviation par rapport à un visage qui regarde de face (avec un peu de trigo).
    Moins complexe, mais moins robuste : calculer la position de 4 points sur le visage (minimum) qui ne sont pas coplanaires, afin d'utiliser un algorithme comme le POSIT : http://www.cfar.umd.edu/~daniel/Site_2/Code.html (on va considérer que la tête n'est pas un corps déformable ).
    Ainsi, tu as la position dans l'espace de la tête. Pour calculer ces 4 points, tu peux faire une recherche, avec cvTemplate d'OpenCV, par exemple, de la zone des narines ("2 points noirs sombres"), des 2 coins des yeux/sourcils, et d'un des coins de la bouche (soit 4 points). Cela ne va pas fonctionner, évidemment, si la tête ne dévie pas trop de l'axe principal.
    Pour la recherche de Template, les infos que j'ai donné dans un des fils précédents, pour quelqu'un qui veut aussi faire une recherche de l'oeil sont pratiques pour normaliser cette recherche (http://www.developpez.net/forums/d12...re-image-oeil/).
    Tu peux ainsi cherche le déplacement de l'iris sur le "plan" de l'oeil (la sclère est courbe, mais tu n'as pas trop les moyens, à cette résolution, de connaître ce rayon de courbure).

    Une fois connues le mouvement de la tête par rapport à la position centrale, et le mouvement de l'iris sur le plan de l'oeil, tu peux composer les deux, pour ramener le mouvement de l'oeil face à l'écran.

    Pour déplacer le curseur, il faut ensuite proposer une étape de calibration à l'utilisateur. Tu présentes une série de points dont la position est connue à l'avance, à l'écran (9 points, c'est une bonne base) : 1 dans chaque coin, et un au milieu de chaque axe.
    Tu vas ensuite demander à l'utilisateur de regarder chacun de ces points. Tu enregistre la position (x,y) du centre de l'iris que tu auras détecté.

    Tu peux alors construire 2 fonctions de mise en correspondance, une pour les x et une pour les y, qui réalise un mapping (non-linéaire, c'est plus précis dans ce cas précis que linéaire, mais c'est plus compliqué à construire) entre la position (x,y) de l'iris détectée, et la position (x,y) du curseur à l'écran (et là, un simple SetCursorPos() devrait t'aider).

    A cette étape, il te faudra ensuite un gros filtrage sur la position détectée pour annuler le jitter, qui sera très présent (rien qu'avec la différence de résolution entre ta webcam et ton écran, tu vas avoir des sauts importants).

    Je pense que ça peut te servir de bonne base . N'hésite pas à poser des questions si je n'ai pas été clair.
    C'est pour la rédaction d'un papier ?

  3. #3
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Salut Pseudopode et merci pour ta réponse !

    Citation Envoyé par Pseudopode Voir le message
    @TheGzD : tu fais ton doctorat sur le sujet ?
    J'ai dû moi-même développer quelque chose de similaire à l'époque, dans mon DEA.
    Non pas exactement sur ce sujet mais j'ai besoin de pouvoir faire, entre autre, l'acquisition de ce genre de données.
    Ces acquisitions requièrent d'être faites en parallèle et temps réel, donc j'exclue de facto les langages lents et à fortes dépendances tels que Java.

    Citation Envoyé par Pseudopode Voir le message
    Plusieurs techniques, tout en restant low-cost :
    - prendre une webcam, virer le filtre IR, et fonctionner avec des images en proches infrarouge. L'ITU GazeTracker (http://www.gazegroup.org/downloads/23-gazetracker, avec support de la part du COGAIN, etc...) fonctionne très bien dans ce cas. Par contre, tu devras désolidariser l'objectif/la CM de la webcam, pour la monter sur un support type lunettes, et ajouter une diode infrarouge. Sur ebay, tu peux trouver des webcam avec diodes infrarouges prémontées (matériel chinois), bien suffisant pour ça. Il faudra juste forcer les LEDs IR à rester allumées en scotchant un bout de papier opaque sur le détecteur de luminosité. C'est le plus efficace, mais aussi le plus contraignant (il faut porter les lunettes en continu). L'avantage : image de grande taille, de qualité (pas de problèmes de luminosité), pas de parallaxe quand le visage bouge.
    - si tu veux garder une webcam en lumière visible classique, c'est plus compliqué. Soit tu travailles toujours avec une webcam montée sur des lunettes (plus facile), ou tu travailles avec une webcam montée au-dessus de l'écran de l'utilisateur (plus compliqué).
    Ok je connaissais ITU GazeTracker, mais rien que sa licence fait que je ne peux pas l'utiliser. Par contre c'est globalement ce que je veux faire, sauf que je ne vois pas comment ça pourrait marcher avec 1 seule caméra : certes je connais la position de l'iris de l'utilisateur, mais on peut regarder un point sur un écran avec un grand nombre de positions de tête différentes et donc autant de positions d'iris différentes. Je présume donc qu'il faut soit rajouter un caméra frontale (et il faudra s'amuser à reconnaitre l'écran filmé par cette dernière ... c'est pas terrible mais ça peut marcher avec autre chose qu'un écran) soit une caméra montée sur l'écran pour repérer la position de la tête. La première caméra (IR de préférence) étant montée sur des lunettes, je pense que je peux très bien faire la reconnaissance de la tête de l'utilisateur en reconnaissant les lunettes (sur lesquelles des repaires peuvent être mis).

    Citation Envoyé par Pseudopode Voir le message
    En effet, il te faut obtenir l'image de l'iris (pour savoir où l'utilisateur regarde), mais aussi la position de la tête en 3D, pour compenser les effets de parallaxe par rapport à l'image de l'oeil (tu as donc une composition de translations, réductions, homothéties, etc...)
    Obtenir la position de la tête dans l'espace est compliqué. Il existe des frameworks tout fait (mais pas forcément libres/gratuits/open source) : FaceApi, face.com, etc...
    L'idée reste toujours la-même : estimer la déformation de ce ressemble à un visage dans l'image par rapport à une image de référence.
    J'avais utilisé les AAM à l'époque, pour calculer la position de la tête (pitch, yaw, roll), afin d'avoir des degrés de déviation par rapport à un visage qui regarde de face (avec un peu de trigo).
    Moins complexe, mais moins robuste : calculer la position de 4 points sur le visage (minimum) qui ne sont pas coplanaires, afin d'utiliser un algorithme comme le POSIT : http://www.cfar.umd.edu/~daniel/Site_2/Code.html (on va considérer que la tête n'est pas un corps déformable ).
    Ainsi, tu as la position dans l'espace de la tête. Pour calculer ces 4 points, tu peux faire une recherche, avec cvTemplate d'OpenCV, par exemple, de la zone des narines ("2 points noirs sombres"), des 2 coins des yeux/sourcils, et d'un des coins de la bouche (soit 4 points). Cela ne va pas fonctionner, évidemment, si la tête ne dévie pas trop de l'axe principal.
    Pour la recherche de Template, les infos que j'ai donné dans un des fils précédents, pour quelqu'un qui veut aussi faire une recherche de l'oeil sont pratiques pour normaliser cette recherche (http://www.developpez.net/forums/d12...re-image-oeil/).
    Tu peux ainsi cherche le déplacement de l'iris sur le "plan" de l'oeil (la sclère est courbe, mais tu n'as pas trop les moyens, à cette résolution, de connaître ce rayon de courbure).

    Une fois connues le mouvement de la tête par rapport à la position centrale, et le mouvement de l'iris sur le plan de l'oeil, tu peux composer les deux, pour ramener le mouvement de l'oeil face à l'écran.

    Pour déplacer le curseur, il faut ensuite proposer une étape de calibration à l'utilisateur. Tu présentes une série de points dont la position est connue à l'avance, à l'écran (9 points, c'est une bonne base) : 1 dans chaque coin, et un au milieu de chaque axe.
    Tu vas ensuite demander à l'utilisateur de regarder chacun de ces points. Tu enregistre la position (x,y) du centre de l'iris que tu auras détecté.

    Tu peux alors construire 2 fonctions de mise en correspondance, une pour les x et une pour les y, qui réalise un mapping (non-linéaire, c'est plus précis dans ce cas précis que linéaire, mais c'est plus compliqué à construire) entre la position (x,y) de l'iris détectée, et la position (x,y) du curseur à l'écran (et là, un simple SetCursorPos() devrait t'aider).

    A cette étape, il te faudra ensuite un gros filtrage sur la position détectée pour annuler le jitter, qui sera très présent (rien qu'avec la différence de résolution entre ta webcam et ton écran, tu vas avoir des sauts importants).
    Bon là y a un bon paquet de termes qui m'échappent
    Je pense comprends le fond mais n'y a-t-il dans OpenCV un moyen simple de faire tout ça ? Parce que là je dois t'avouer que si ce n'est pas le cas je me demande vraiment ce que fait l'API
    Après le choix d'OpenCV n'est peut-être pas le bon, je ne sais pas ...

    Niveau matériel et contraintes techniques je pense que tu m'as bien répondu, par contre niveau méthodes et algorithmes j'aimerai si possible des informations plus concrètes et surtout plus relatives à OpenCV si c'est possible comme par exemple les noms de méthodes. En effet leur doc est tellement mal faite que je ne m'en sors pas, tout est quasi faux, les chemins n'existent pas, il font référence à des fichiers de versions précédentes, ...

    En tout cas merci encore et à bientôt
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 39
    Points
    39
    Par défaut
    @TheGzD : en fait tu ne vas pas trouver de lib facile à utiliser (ou même plus complète) pour faire du tracking oculaire pour le moment.

    Avec OpenCV, tu peux déjà tenter d'utiliser les fonctions proches de cvMatchTemplate() (même si la doc est incomplète, tu peux trouver des choses dans les dossier samples/).

    Le truc suivant à faire, une fois que tu as des templates (tu peux par exemple demander à l'utilisateur de cliquer sur 4 points de l'image du visage fournie par la webcam, et de prendre une image de 15x15 autour de ce point pour faire un template), tu peux tenter de faire un POSIT avec le centre de chacun de ces 4 templates, et ainsi avoir l'orintation de la tête.

  5. #5
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Merci pour ta réponse.
    Par contre tu me parles de choses, en l’occurrence la comparaison avec des templates, qui a mon sens relèvent déjà de la méthode choisie et je n'ai pas encore statué la dessus ni trouvé de véritable revue de la littérature ou autre état de l'art à ce sujet.
    De plus je n'ai pas l'impression que ce genre d'approche soit optimisée ni très fiable. Sans parler d'une calibration "manuel" avant chaque usage ... enfin c'est peut-être ce qu'on fait de mieux mais je n'en sais rien (voir plus haut ^^).

    Tout ça pour dire que j'aime bien savoir ce que je fais (et que c'est la bonne façon de faire) avant d'attaquer l'implémentation en tant que telle
    Aurais-tu des informations pour m'éclairer sur ces différents points ?
    Je continue bien sûr de chercher de mon côté.

    PS : après peut-être que le choix d'OpenCV n'est pas le bon ... mais il me semble qu'au contraire si la bibliothèque est assez bas niveau ça laisse plus de latitude quant à l'implémentation d'une méthode.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 39
    Points
    39
    Par défaut
    Déjà, avant de faire le choix logiciel, il faut faire un choix matériel. De quel budget disposes-tu ? Veux tu rester en lumière visible (moins cher mais moins stable) ou travailler en IR (plus robuste, mais plus cher) ?

    Edit : j'avais utilisé, en autres, le pdf à cette adresse : http://www2.imm.dtu.dk/pubdb/views/p...ls.php?id=3625
    Dans ton cas, la partie intéressante commence au Chapitre 12 (la Partie II). Tout ce qui est avant, c'est des AAM pour avoir la poste de la tête.

  7. #7
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Niveau matériel je n'ai pas forcément fait mon choix, mais il me semble qu'il suffit de remplacer le filtre IR d'une webcam (pour un coût matériel d'à peu prêt rien) pour qu'elle puisse être utilisée pour filmer en IR. Est-ce que je me trompe ?
    Niveau budget je n'ai rien pour l'instant, mais j'essaye d'en obtenir. Encore faut il avoir quelque chose de précis à demander

    Merci pour cette référence, c'est toujours bon à prendre. Et pour une thèse de master on ne peut pas dire que ces étudiants aient chaumé ^^

    Depuis ma dernière réponse j'ai entre autre contacté Dan Witzner Hansen (à l'origine d'ITU Gaze Tracker : http://www.gazegroup.org/) qui m'a envoyé une review qu'il a fait en 2010 sur la question (version draft : http://people.ict.usc.edu/~gratch/CSCI534/WitznerJi_EyeTrackSurvey%282009%29.pdf)
    Je pense que ça va me donner une idée bien précise des différentes méthode existantes ainsi que de leurs avantages et inconvénients.

    Pour résumer mes besoins concernant la méthode choisie, elle doit être :
    - user friendly, dans le sens où une fois mon logiciel implémenté un non-informaticien ne doit pas se heurter à moult calibration et autre étalonnage fastidieux. Au même titre les conditions d'utilisations ne doivent pas être trop contraignantes sinon c'est sûr que ça ne marchera pas
    - relativement précise et fiable, enfin assez pour déterminer à quelques pixels prêts où l'utilisateur regarde l'écran
    - pas trop goulue en ressources, car j'ai d'autre choses à faire faire à ma machine
    - pas trop chère, car sinon autant acheter une solution hors de prix telle qu'il en existe sur le marché
    Et oui rien que ça Bien évidemment je suis prêt à faire quelques concessions ...
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2011
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 32
    Points : 39
    Points
    39
    Par défaut
    C'est pas mal d'avoir contacté, pour l'ITU Gaze Tracker.

    Je viens de me souvenir qu'il était possible de faire du HEad Tracking avec le Kinect (version Xbox et version Windows). Ça fait tout de suite plus cher (jusqu'à 250$ pour le kinect windows), mais ça permet d'avoir tout de suite la position de la tête dans l'espace - les 3 angles (tangage, roulis, lacet).

    Dans tous les cas, un système porté près de l'oeil permet de s'abstraire un peu des mouvements de la tête, et de ne s'occuper que des mouvements de l'oeil. Mais il faut porter une fausse paire de lunettes, et un objectif de webcam près de l'oeil. (Et, oui, il est possible de retirer le filtre IR d'une webcam pour qu'elle fonctionne en proche IR. Attention, ce n'est pas forcément facile à faire sur toutes les caméras. Pour certaines, le filtre est collé sur les montantes de l'oeilleton, et l'envler déchire tout. J'avais acheté 2 ou 3 modèles de webcams ultra low cost sur ebay, autour de 5$, on ne sait jamais).

    Une webcam placé sur la table ou l'écran implique forcément de calculer la position de la tête, à moins de bloquer l'utilisateur dans une mentionnière (c'est jouable pour une personne handicapée, et encore, c'est inconfortable).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traquage de couleur
    Par joladouille dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 22/06/2009, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo