Extraction de points de repère faciaux dans la base CK+

Présentation de la base de données CK+

La base de données étendue Cohn-Kanade (CK+) constitue une référence en reconnaissance faciale. Elle contient 123 sujets et 593 séquences vidéo, chacune comprenant des images allant d'une expression neutre à une expression émotionnnelle culminante. Parmi ces séquences, 327 disposent d'annotations émotionnelles correspondant à 8 catégories :

  • 0 : Neutre
  • 1 : Colère
  • 2 : Mépris
  • 3 : Dégoût
  • 4 : Peur
  • 5 : Joie
  • 6 : Tristesse
  • 7 : Surprise

Les fichiers fournis incluent les images originales, les coordonnées des 68 points de repère faciaux, ainsi que les annotations FACS et émotionnelles.

Analyse des repères faciaux

Pour l'extractoin des caractéristiques, cette procédure visualise les points de repère sur une image :

def dessiner_points(img, couleur):
    dessin = ImageDraw.Draw(img)
    fonte = ImageFont.truetype("chemin_police", 10)
    
    with open("fichier_landmarks.txt", "r") as fichier:
        lignes = fichier.readlines()
        point_id = 1
        for ligne in lignes:
            coords = ligne.strip().split()
            x = float(coords[2])
            y = float(coords[3])
            dessin.text((x, y), str(point_id), font=fonte, fill=couleur)
            point_id += 1

Correspondance avec RealSense

La conversion des points entre CK+ (68 points) et RealSense (78 points) nécessite un mappage spécifique. Certains points sont exclus, réduisant l'ensemble à 66 repères :

mapping_ck_vers_rs = {
    0:22, 1:21, 2:20, 3:19, 4:18,
    5:23, 6:24, 7:25, 8:26, 9:27,
    10:10, 11:39, 12:38, 14:37, 16:42, 17:41,
    # ... autres correspondances ...
    69:17
}

ids_realsense = [0,1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19,20,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69]

Traitement des séquences

L'extraction des coordonnées pour une séquence complète s'effectue via :

def traiter_fichier(chemin):
    repertoire = os.path.dirname(chemin)
    fichier_sortie = os.path.join(repertoire, "donnees_ck.txt")
    
    with open(chemin, "r") as entree, open(fichier_sortie, "a") as sortie:
        nom_base = os.path.splitext(os.path.basename(chemin))[0]
        sortie.write(nom_base + "\t")
        
        lignes = entree.readlines()
        for index in range(66):
            ligne_cible = mapping_ck_vers_rs[ids_realsense[index]] - 1
            valeurs = lignes[ligne_cible].split()
            x = float(valeurs[2])
            y = float(valeurs[3])
            sortie.write(f"{ids_realsense[index]}\t{x}\t{y}\t")

Parcours récursif des données

Le traitement batch des répertoires s'effectue avec :

def parcourir_repertoire(chemin):
    elements = os.listdir(chemin)
    for element in elements:
        chemin_complet = os.path.join(chemin, element)
        if os.path.isfile(chemin_complet) and chemin_complet.endswith(".txt"):
            traiter_fichier(chemin_complet)
        elif os.path.isdir(chemin_complet):
            parcourir_repertoire(chemin_complet)

Étiquettes: CK+ FACS Realsense points de repère reconnaissance faciale

Publié le 6 juillet à 02h33