Table of Contents
Reconnaître un sourire #
Vous allez maintenant élaborer une expérience plus sérieuse. Le but de cette expérience est de déterminer si un sujet reconnaît un visage souriant.
Données #
Pour cette expérience, nous utiliserons les données en libre accès fournies
gracieusement par l’American Multiracial Faces Database.
Ce jeu de données contient des photos de visages. Pour chaque sujet, une
photo neutre et une photo souriante sont disponible. Chaque fichier est nommé
avec le numéro du sujet, son genre, et son expression. Ainsi SF-1001.jpg
correspond au sujet 1001, qui sourit (S) et est une femme (F). Vous
pouvez télécharger :
- un échantillon réduit de 5 sujets (10 Mo)
- le jeu de données complet (200 Mo)
Séquence de base #
Vous allez d’abord mettre en place une séquence de base pour proposer une photo, et demander si la personne sourit ou non. Cette séquence comporte plusieurs étapes.
Expliquer l’expérience #
Tout d’abord ajoutez une page pour expliquer en quoi consiste l’expérience. Il s’agit d’afficher des photos pendant un court laps de temps, puis de demander si la personne observée était souriante ou non. Cette page doit restée affichée aussi longtemps que souhaité, et il faut également demander à presser une touche pour démarrer l’expérience.
Présenter une photo #
Proposez ensuite une seconde page qui présente une photo. Récupérer le jeu de données réduit, et choisissez n’importe quelle photo du jeu de données. Faites également en sorte que la photo ne soit présentées que pendant 500ms.
Demander si le sujet sourit #
Une fois la photo présentée, proposez une troisième page qui demande si la
personne qui vient d’être présentée souriait ou non, et d’appuyer sur la touche
o pour oui et n pour non. Réduisez à 0 le temps de présentation de la page
pour laisser la place à un élément d’attente d’une frappe au clavier,
n’acceptant que les touche o et n. Selon la photo choisie, renseignez la bonne
réponse.
Vérifier et fournir un retour #
Si tout s’est bien passé, suite à l’étape précédente, une variable correct
indique si la réponse du sujet était correcte ou non. Ajoutez donc un script
pour produire un message indiquant si la réponse était juste ou non, puis
affichez ce message dans une dernière page.
Boucle #
Le but est maintenant de créer une boucle permettant de répéter l’expérience et d’afficher successivement plusieurs images dans un ordre quelconque.
Charger les fichiers #
Pour charger toutes les images du jeu de données réduit, ouvrez le panneau de gestion des fichiers en utilisant l’icône suivante
Utilisez le + pour ajouter des fichiers, puis naviguez vers le répertoire
contenant les images, et sélectionnez toutes les images. Vous pouvez utiliser la
touche majuscule en même temps que le clic pour sélectionner d’un coup un groupe
d’images. Il n’est pas nécessaire de charger le fichier readme.md qui contient
les information d’attribution du jeu de données.
Créer la boucle #
Pour répéter l’expérience sur chaque image, utilisez un composant boucle, dans
lequel vous insèrerez la séquence de test que vous avez produite en première
partie. Modifiez ensuite la table de la boucle pour y ajouter une colonne image
dans laquelle vous listerez les noms des fichiers que vous avez chargés, un par
ligne.
Utiliser le nom de fichier #
À ce stade, votre expérience se répète, mais l’image affichée reste toujours la
même. Normalement, votre boucle fournit une variable image qui contiendra le
nom du fichier image à utiliser. Dans la page qui affiche l’image, vous pouvez
double-cliquer sur l’image, ce qui fera apparaître une boîte de texte avec les
paramètres de l’image affichée. Par exemple :
draw image center=1 file="NF-1001.jpg"
scale=0.35 show_if=True x=0 y=0 z_index=0
dans cette boîte, vous pouvez alors changer la chaîne de caractères fournie pour
le paramètre file pour utiliser à la place "{image}" et ainsi utiliser le
nom de fichier fourni par la boucle.
Déterminer la réponse correcte #
Selon le fichier, il faut également déterminer la réponse correcte en fonction
du nom de fichier. Lorsque le nom du fichier commence par un S, le sujet
sourit, alors que lorsqu’un commence par un N le sujet a une expression
neutre. Lorsqu’aucune touche correcte n’est fournie à l’élément
keyboard_response, il utilise une variable correct_response. Ajoutez donc un
script avant cet élément, qui en fonction du nom de l’image assignera la
variable correct_response à o ou à n.
Passer au jeu de données complet #
Le but est maintenant de passer au jeu de données complet. Le problème est que ce jeu de données contient beaucoup d’images (218) et qu’il sera donc assez fastidieux de refaire la table de la boucle à la main. D’autre part, les fichiers opensesame stockent en interne une copie des fichiers que vous avez chargés, ce qui augmente significativement leur taille.
Gestion des fichiers via un dossier spécial #
Opensesame peut également utiliser des fichiers sans les charger, s’ils sont
dans un dossier spécial nommé __pool__ dans le même dossier que le fichier
de votre expérience. Commencez par faire le vide pour retirer les fichiers du
gestionnaire d’opensesame, et assurez-vous donc d’avoir bien enregistré votre
expérience, puis récupérez le jeu de données complet. Décompressez le
fichier, ce qui devrait produire un dossier AMFD que vous renommerez
__pool__. Rafraîchissez ensuite le gestionnaire de fichier pour vous assurer
que tous les fichiers du jeu de données apparaissent. Vous pouvez également
supprimer le fichier readme.md qui fourni les attributions du jeu de données.
Génération de la table par un programme #
Nous allons maintenant générer la table de la boucle via un programme. Pour
gérer les tables, opensesame utilise un objet DataMatrix que nous allons
pouvoir générer via un programme python. Ajoutez donc un script avant la boucle
pour réaliser cette opération lors de la phase de préparation. Notre but est de
créer une table ayant une colonne image, et de remplir ses lignes avec les
noms de nos fichiers. Pour utiliser les objets DataMatrix, il faut commencer
par importer ce type d’objets avec la ligne suivante :
from datamatrix import DataMatrix
Vous pouvez ensuite créer une variable table par exemple, pour y stocker une
table contenant deux lignes avec le code suivant :
table = DataMatrix(length = 2)
Vous pouvez lui ajouter une colonne nommée image et fournir les lignes
correspondantes avec la syntaxe suivante :
table["image"] = ["SM-1027.jpg", "SM-1029.jpg"]
Pour configurer votre boucle avec cette table, la syntaxe est la suivante :
items["boucle_sourires"].dm = table
Dans la ligne ci-dessus, boucle_sourires est le nom que vous avez donné à
votre élément de boucle dans votre expérience. Normalement, avec toutes ces
modifications, votre boucle devrait désormais présenter deux sujets,
correspondant aux fichiers SM-1027.jpg et SM-1029.jpg.
Si vous souhaitez aller plus loin sur cette voie, vous pouvez consulter la documentation du module datamatrix. Nous n’aurons pas besoin de plus pour ce travail.
Utiliser tous les fichiers #
Il nous faut maintenant remplir la table avec tous les fichiers du jeu de
données. Dans les scripts, le gestionnaire de fichiers est accessible via la
variable pool. D’après la documentation, la liste des fichiers peut
être obtenue en utilisant pool.files(). Attention par contre, pool.size() ne
fournit pas le nombre de fichiers, mais le nombre d’octets qu’ils occupent. Le
nombre de fichiers est accessible via le nombre d’éléments de la liste de
fichiers, avec len.
Avec ces informations, modifiez votre script pour créer une table listant toutes les images du dossier.
La suite #
Le je de données complet contient beaucoup de données. Lors de la prochaine séance, nous verrons comment sélectionner au hasard une partie des données, tout en respectant des contraintes.