Distinguer différents visages

Tutoriel vidéo 19 - Distinguer différents visages :https://singtown.com/learn/50033/

Cette section présente comment utiliser les caractéristiques LBP pour distinguer différents visages.

Nous devons d'abord constituer notre propre bibliothèque d'images. Nous créons d'abord un nouveau dossier sur la clé USB de l'OpenMV (notez que vous devez insérer la carte SD) et le nommons singtown, puis créons n sous-dossiers nommés s1, s2, s3...sn dans le dossier singtown, où n est le nombre de personnes présentes dans l'ensemble de la bibliothèque d'images. Comme illustré ci-dessous :

Ensuite, nous pouvons exécuter le code suivant pour collecter différents échantillons de visages. Notez que, lors de la collecte, il faut essayer de garder un arrière-plan uniforme et faire en sorte que le visage remplisse autant que possible tout l'écran. Le visage peut sourire, ne pas sourire, être droit, incliné, porter des lunettes ou non, etc. Vous pouvez choisir 10 à 20 images par personne.

# Exemple de capture d'image
#
# Remarque : vous aurez besoin d'une carte SD pour exécuter cet exemple.
#
# Vous pouvez utiliser votre OpenMV Cam pour enregistrer des fichiers image.

import csi, image, machine
csi0 = csi.CSI()

#import pyb

RED_LED_PIN = 1
BLUE_LED_PIN = 3

csi0.reset() # Initialise le capteur de la caméra.
csi0.pixformat(csi.GRAYSCALE) # ou csi.GRAYSCALE
csi0.framesize(csi.QQVGA) # ou csi.QQVGA (ou autres)
csi0.window((92,112))
csi0.snapshot(frames=10) # Laisse les nouveaux réglages prendre effet.
csi0.snapshot(time = 2000)

num = 1 # Définit le numéro de la personne photographiée : les images de la première personne sont enregistrées dans le dossier s1, celles de la deuxième dans s2, et ainsi de suite. Modifiez la valeur de num à chaque changement de personne photographiée.

n = 20 # Définit le nombre d'images à prendre par personne.

# Prend n photos successives, avec un intervalle de 3 s entre chacune.
while(n):
    # La LED rouge s'allume
    machine.LED("LED_RED").on()
    #pyb.LED(RED_LED_PIN).on()
    csi0.snapshot(time = 3000) # Give the user time to get ready. Attend 3 s, préparez votre expression.

    # La LED rouge s'éteint, la LED bleue s'allume
    machine.LED("LED_RED").off()
    machine.LED("LED_BLUE").on()
    #pyb.LED(RED_LED_PIN).off()
    #pyb.LED(BLUE_LED_PIN).on()

    # Enregistre l'image capturée sur la carte SD
    print(n)
    csi0.snapshot().save("singtown/s%s/%s.pgm" % (num, n) ) # or "example.bmp" (or others)

    n -= 1

    #pyb.LED(BLUE_LED_PIN).off()
    machine.LED("LED_BLUE").off()
    print("Done! Reset the camera to see the saved image.")

Après la prise de vue, l'image sur la clé USB de l'OpenMV se présente comme suit (notez qu'à chaque fois que la clé USB de l'OpenMV écrit une nouvelle image/un nouveau fichier, vous devez réinitialiser l'OpenMV pour la voir) :

Enfin, nous exécutons le code suivant pour identifier le visage dans le champ de vision actuel de la caméra et afficher la personne correspondant le mieux à l'objet actuel.

# Reconnaissance faciale avec des descripteurs LBP.
# Voir « Face Recognition with Local Binary Patterns » de Timo Ahonen.
#
# Avant d'exécuter cet exemple :
# 1) Téléchargez la base de données de visages AT&T http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
# 2) Extrayez et copiez le répertoire orl_faces à la racine de la carte SD.


import csi, time, image
csi0 = csi.CSI()

csi0.reset() # Initialise le capteur de la caméra.
csi0.pixformat(csi.GRAYSCALE) # ou csi.GRAYSCALE
csi0.framesize(csi.QQVGA) # ou csi.QQVGA (ou autres)
csi0.window((92,112))
csi0.snapshot(frames=10) # Laisse les nouveaux réglages prendre effet.
csi0.snapshot(time = 5000) # Attend 5 s



#SUB = "s1"
NUM_SUBJECTS = 6 # Nombre de personnes différentes dans la bibliothèque d'images, 6 au total
NUM_SUBJECTS_IMGS = 20 # Chaque personne dispose de 20 images d'échantillon

# Capture le visage actuel.
img = csi0.snapshot()
#img = image.Image("singtown/%s/1.pgm"%(SUB))
d0 = img.find_lbp((0, 0, img.width(), img.height()))
# d0 est la caractéristique lbp du visage actuel
img = None
pmin = 999999
num=0

def min(pmin, a, s):
    global num
    if a<pmin:
        pmin=a
        num=s
    return pmin

for s in range(1, NUM_SUBJECTS+1):
    dist = 0
    for i in range(2, NUM_SUBJECTS_IMGS+1):
        img = image.Image("singtown/s%d/%d.pgm"%(s, i))
        d1 = img.find_lbp((0, 0, img.width(), img.height()))
        # d1 est la caractéristique lbp de la i-ème image du dossier s
        dist += image.match_descriptor(d0, d1) # calcule le degré de différence entre d0 et d1, c'est-à-dire entre l'image échantillon et le visage détecté.
    print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))
    pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s) # plus le degré de différence des caractéristiques est faible, plus le visage détecté ressemble à cet échantillon et lui correspond.
    print(pmin)

print(num) # num est le numéro de la personne correspondant le mieux actuellement.

Les résultats d'exécution sont présentés dans la figure :

results matching ""

    No results matching ""