Utilisation d’un module (os) pour interagir avec le système.

import os
import random
random.seed()

Lister les fichier et sous-dossiers d’un dossier

os.listdir("images")
['NF-1001.jpg',
 'NF-1002.jpg',
 'NF-1003.jpg',
 'SF-1001.jpg',
 'SF-1002.jpg',
 'SF-1003.jpg',
 'NM-1007.jpg',
 'NM-1010.jpg',
 'SM-1007.jpg',
 'SM-1010.jpg',
 '.ipynb_checkpoints']

Mettre les fichiers d’images dans un tableau images

images = []
for fichier in os.listdir("images"):
    if fichier[-4:] == ".jpg" :   # c'est une image
        images.append(fichier)
images
['NF-1001.jpg',
 'NF-1002.jpg',
 'NF-1003.jpg',
 'SF-1001.jpg',
 'SF-1002.jpg',
 'SF-1003.jpg',
 'NM-1007.jpg',
 'NM-1010.jpg',
 'SM-1007.jpg',
 'SM-1010.jpg']

Mélanger le tableau images

random.shuffle(images)
images1 = images[:len(images)//2]
images2 = images[len(images)//2:]
print(images1)
print(images2)
['SM-1007.jpg', 'NF-1003.jpg', 'SF-1003.jpg', 'SM-1010.jpg', 'SF-1001.jpg']
['NF-1002.jpg', 'NM-1007.jpg', 'NM-1010.jpg', 'NF-1001.jpg', 'SF-1002.jpg']

Tester si un élément est dans un tableau

print(images)
print("'SM-1007.jpg' dans images: "+str('SM-1007.jpg' in images))
print("'KM-1007.jpg' dans images: "+str('KM-1007.jpg' in images))
['SM-1007.jpg', 'NF-1003.jpg', 'SF-1003.jpg', 'SM-1010.jpg', 'SF-1001.jpg', 'NF-1002.jpg', 'NM-1007.jpg', 'NM-1010.jpg', 'NF-1001.jpg', 'SF-1002.jpg']
'SM-1007.jpg' dans images: True
'KM-1007.jpg' dans images: False

Génération de deux blocs d’images respectant la contrainte “pas deux fois la même personne dans un bloc”

images1 = []
images2 = []
random.shuffle(images)

for img in images:
    if img[0] == 'S':
        img_a_trouver = 'N'+img[1:]
    else:
        img_a_trouver = 'S'+img[1:]
    if img_a_trouver in images1:
        images2.append(img)
    else:
        images1.append(img)
        
print(images1)
print(images2)
['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 'SF-1003.jpg', 'SF-1002.jpg']
['SM-1007.jpg', 'NF-1002.jpg', 'SM-1010.jpg', 'NF-1001.jpg', 'NF-1003.jpg']

On réarrange l’ordre dans chaque bloc pour respecter la contrainte “pas k images de suite de la même catégorie”

images1 = ['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 'SF-1003.jpg', 'SF-1002.jpg']
images1b = []
k = 3 # max 2 images de suites dans la même catégorie
m = 0 # nombre d'images de la catégories de l'image regardée
cat = '' # catégorie des dernières images

mises_de_cote = []

for img in images1:
    if cat == img[:2]: # est-on dans la même catégorie qu'avant ?
        if m >= k-1: # si on est déjà au max
            # on met l'image de côté
            mises_de_cote.append(img)
        else:
            images1b.append(img)
            m = m + 1
    else: # on change de catégorie
        images1b.append(img)
        cat = img[:2] # on change la catégorie
        m = 1
print(images1b)
print(mises_de_cote)
['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 'SF-1003.jpg']
['SF-1002.jpg']

On place ce code dans une fonction

def force_contrainte_categorie(images, k):
    """
    Cette fonction prend en argument un tableau d'images 
    et renvoie deux tableaux:
    - un premier tableau comportant une suite d'images trouves 
      dans `images`, en conservant l'ordre et de façon à ce 
      que la contrainte de catégorie soit respectée
    - un deuxième tableau contenant les images restantes
    
    k est le nombre d'images maximum qu'on peut trouver 
    de suite dans une même catégorie
    """
    images_resultat = []
    m = 0 # nombre d'images de la catégories de l'image regardée
    cat = '' # catégorie des dernières images

    mises_de_cote = []

    for img in images:
        if cat == img[:2]: # est-on dans la même catégorie qu'avant ?
            if m >= k: # si on est déjà au max
                # on met l'image de côté
                mises_de_cote.append(img)
            else:
                images_resultat.append(img)
                m = m + 1
        else: # on change de catégorie
            images_resultat.append(img)
            cat = img[:2] # on change la catégorie
            m = 1
    # renvoyer le résultat, i.e. les deux tableaux
    return (images_resultat, mises_de_cote)
force_contrainte_categorie(
    ['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 
     'SF-1003.jpg', 'SF-1002.jpg'],
    2)
(['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 'SF-1003.jpg'], ['SF-1002.jpg'])
force_contrainte_categorie(
    ['NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 
     'SF-1003.jpg', 'SF-1002.jpg'],
    1)
(['NM-1007.jpg', 'SF-1001.jpg'], ['NM-1010.jpg', 'SF-1003.jpg', 'SF-1002.jpg'])
force_contrainte_categorie(
    ['SF-1003.jpg', 'NM-1007.jpg', 
     'NM-1010.jpg', 'SF-1001.jpg', 
     'SF-1002.jpg'],
    2)
(['SF-1003.jpg', 'NM-1007.jpg', 'NM-1010.jpg', 'SF-1001.jpg', 'SF-1002.jpg'],
 [])
Maître de conférences en Informatique