Table of Contents
Sélectionner un ensemble de photos #
Nous reprenons pour cette séance votre expérience sur les sourires, pour essayer d’organiser un peu mieux la présentation des sujets. Notre but ici est de ne proposer que quelques sujets en respectant quelques règles pour éviter les biais.
Base de la séance précédente #
Pour avancer sur ce TP, il vous faut avoir la base de la séance précédente. Si ce n’est pas le cas, commencez par terminer le TP de la séance précédente, et n’hésitez pas à demander de l’aide pour avancer.
Sélectionner aléatoirement des photos #
Le jeu de données contient actuellement 219 photos. C’est beaucoup trop si vous souhaitez éviter de lasser vos sujets. Notre but pour cette phase est de ne sélectionner que 20 photos. Pour ce faire, nous allons utiliser les fonctionnalités de python pour manipuler le hasard.
Info : Utiliser le hasard #
Python propose des fonctionnalités pour manipuler le hasard. Elles deviennent accessibles en ajoutant en début de programme la ligne
import random
Vous pouvez obtenir la liste des fonctionnalités disponibles en consultant la documentation de ce module. Pour nos besoins ici, nous avons besoin de sélectionner aléatoirement 20 photos parmi 219. Cette fonctionnalité est proposée par la fonction sample. Cette fonction prend deux paramètres :
- la liste des éléments disponibles ;
- le nombre d’éléments à piocher dans cette liste.
Elle retournera une liste de la taille souhaitée d’éléments piochés parmi les éléments disponibles, sans doublons.
Pour utiliser une fonction du module random, il faut ajouter le préfixe
random. avant le nom de la fonction. Ainsi pour sélectionner 8 nombres
distincts entre 0 et 199, nous pouvons utiliser
selection = random.sample(range(200), 8)
Après cet appel, la variable sélection contiendra la liste des nombres sélectionnés, par exemple
[3, 11, 10, 18, 9, 19, 4, 17]
Notez que les nombres ne sont pas spécialement triés, et que relancer une seconde fois cette instruction ne produira pas le même résultat.
Exercice : Sélection de 20 photos #
Pour l’instant votre code de sélection des photos devrait ressembler au suivant
from datamatrix import DataMatrix
photos = pool.files()
table = DataMatrix(length = len(photos))
table.image = photos
items["boucle_sourires"].dm = table
Dans ce code, la liste des photos disponibles est obtenue dans la variable
photos via
photos = pool.files()
Le nombre de photos souhaitées est 20, à vous de modifier votre programme pour sélectionner aléatoirement ces 20 photos, et les utiliser pour votre boucle.
Garder une trace de l’expérience #
Opensesame a la possibilité de produire un fichier au format csv pour
synthétiser les résultats de l’expérience. La génération de ce fichier est
contrôlée par l’élément logger
Cet outil, à chaque fois qu’il est invoqué, ajoutera une ligne au fichier csv, avec par défaut la liste des variables actuellement définies. Vous avez la possibilité d’en exclure ou d’en inclure manuellement. Ces variables peuvent être créées par vos éléments scripts, certaines sont également créées toutes seules par exemple pour vous fournir le temps de réaction du sujet sur chaque élément.
Vous pouvez ensuite ouvrir ce fichier csv dans un tableur pour analyser vos
résultats, ou les analyser automatiquement avec un programme, par exemple en
python.
Exercice : ajouter une ligne après la présentation de chaque photo #
Ajoutez un élément logger à la fin de la séquence d’instructions de votre boucle et vérifiez que dans le fichier produit, vous avez bien 20 lignes.
Sélectionner autant de chaque genre #
Pour éviter un biais lié au genre, nous souhaitons désormais nous assurer que dans les photos sélectionnées nous avons autant d’hommes que de femmes, soit 10 hommes et 10 femmes.
Exercice : séparer les photos selon le genre #
Chaque photo est annotée par une lettre pour indiquer le genre auquel
s’identifie la personne photographiée. Le jeu de données est binaire, et lorsque
la seconde lettre du nom d’un fichier est F il s’agit d’une femme, lorsque la
lettre est M il s’agit d’un homme. Vous allez donc pouvoir parcourir
l’ensemble des photos et créer deux listes, une pour les photos d’hommes et une
pour celles de femmes.
Vous aurez d’abord besoin de créer deux listes vides pour collecter vos photos. Une liste vide peut être créée via
ma_liste = []
Suite au le code ci-dessus, la variable ma_liste contiendra une liste vide.
Il est également possible ici de préciser le contenu souhaité de la liste entre
les crochets, mais ce n’est pas nécessaire ici.
Pour ajouter un élément à une liste, vous pouvez utiliser append sur cette
liste :
ma_liste.append("fichier.jpg")
Cette instruction modifie directement ma_liste pour lui ajouter l’élément.
Enfin pour parcourir la liste des photos disponibles, si cette liste est dans la
variable photos, vous pouvez utiliser une boucle for :
for photo in photos:
# utiliser la variable photo
Exercice : sélectionner 10 de chaque #
Une fois fos deux listes obtenues, il vous est alors possible de sélectionner 10
photos dans chaque liste, puis de joindre les deux listes pour former votre
table. Pour ajouter les éléments d’une liste à une autre liste, vous pouvez utiliser
extend :
ma_liste.extend([1, 2, 3, 4, 5])
Normalement à ce stade, votre expérience devrait proposer 20 photos dans un ordre aléatoire, avec 10 hommes et 10 femmes.
Afficher pour chaque sujet le sourire et le neutre #
Pour la plupart des personnes photographiées, nous avons deux photos, une souriante et une neutre. Nous souhaitons donc maintenant nous assurer que dans les 20 photos sélectionnées, nous n’avons que 10 personnes différentes, et que pour chacune nous avons les deux photos, la photo souriante et la photo non souriante. Attention cependant, nous avons 219 photos, ce qui est un nombre impair, donc au moins une personne n’est présente que sur une photo et n’aura pas les deux versions. Nous ne souhaitons pas éplucher à la main le jeu de données pour trouver qui éliminer.
Exercice : lister les personnes #
Pour chaque photo, la personne photographiée est identifiée par un nombre à quatre chiffres dans le nom du fichier. Pour extraire ce nombre vous pouvez utiliser une syntaxe particulière. Jusqu’à présent vous avez utilisé les crochers pour accéder à un carractère dans une chaîne :
chaine = "bonjour"
lettre = chaine[1]
# lettre contient "o"
Souvenez-vous, la numérotation des lettre commence à 0 pour la première. Pour récupérer plusieurs lettres, vous pouvez fournir une plage de lettres, avec l’indice de la première lettre à récupérer, et l’indice de la première lettre à ne pas récupérer. Par exemple :
chaine = "bonjour"
lettres = chaine[4:6]
# lettres contient "ou"
Cette syntaxe est à comprendre comme « de la lettre 4 (incluse) à la lettre 6 (exclue) ». Commencez donc par parcourir les fichiers, et former la liste des identifiants des personnes photographiées.
Exercice : lister les personnes présentes deux fois #
Dans votre liste d’identifiants, normalement les personnes prises deux photos en photo, une fois souriante et une fois neutre ont deux fois leur identifiant dans la liste. Votre but maintenant est de rajouter un test pour déterminer si un identifiant est déjà dans la liste ou non. S’il est déjà dans la liste, vous pouvez alors ajouter l’indentifiant à une seconde liste, qui du coup ne contiendra que les identifiants rencontrés deux fois ou plus.
Pour savoir si un élément est déjà dans une liste ou non, vous pouvez utiliser
l’opérateur in pour réaliser un test :
l = [2, 4, 6, 8]
if 3 in l:
# les instructions ici ne seront pas exécutées, 3 n'est pas dans l
a = 6
if a in l:
# les instructions ici seront exécutées car 6 est dans l
À vous désormais de lister les identifiants des personnes prises deux fois en photo.
Exercice : ne pas oublier le genre #
Vous avez désormais la liste des identifiants des personnes photographiées deux fois, mais il reste à les séparer par genre pour continuer à présenter autant d’hommes que de femmes. Modifiez donc votre code pour avoir séparément la liste des hommes photographiés deux fois, et la liste des femmes photographiées deux fois.
Séparer l’expérience en deux phases #
En présentant les photos dans un ordre aléatoire, il peut arriver que deux photos successives concernent la même personne. Nous souhaitons éviter cela, et faire en sorte que chaque personne est vue une fois avant de voir une personne une seconde fois.
Exercice : créer une seconde boucle #
Dans opensesame, créez une seconde boucle, qui réalisera la même séquence d’instructions que la première. Normalement il vous est possible de dupliquer toute la séquence sans avoir à la refaire intégralement, et de garder les séquences liées de telle sorte que si vous modifiez la séquence d’une boucle, ça modifie la séquence de l’autre boucle.
Dans la préparation des tables de vos boucles, pour l’instant faites en sorte que la première boucle présente toutes les personnes souriantes, et que la seconde présente toutes les personnes neutres.
Exercice : répartir les sourires #
L’expérience devient un peu facile si votre sujet voit d’abord tous les sourires, puis tous les neutres. Modifiez donc votre code pour faire en sorte que les sourires soient répartis aléatoirement entre les deux boucles. Vous pouvez chercher dans la documentation du module random pour trouver des outils pour choisir aléatoirement pour chaque personne photographiée si la version souriante est présentée dans la première boucle ou dans la seconde.