Maison  >  Article  >  développement back-end  >  python3+dlib implémente la reconnaissance faciale et l'analyse des émotions

python3+dlib implémente la reconnaissance faciale et l'analyse des émotions

不言
不言original
2018-05-30 14:10:289274parcourir

Cet article explique en détail comment python3+dlib implémente la reconnaissance faciale et l'analyse des émotions à travers des codes et des étapes spécifiques. Les amis dans le besoin peuvent s'y référer.

1. Introduction

Ce que je veux faire, c'est une analyse d'expression (émotion) basée sur la reconnaissance faciale. J'ai vu qu'il existe de nombreuses bibliothèques open source disponibles sur Internet, ce qui offre une grande commodité pour le développement. J'ai choisi la bibliothèque dlib, qui est actuellement utilisée plus fréquemment, pour la reconnaissance faciale et l'étalonnage des fonctionnalités. L'utilisation de Python raccourcit également le cycle de développement.

L'introduction de dlib sur le site officiel est la suivante : Dlib contient un large éventail d'algorithmes d'apprentissage automatique. Tous sont conçus pour être hautement modulaires, rapides à exécuter et extrêmement simples à utiliser via une API C++ propre et moderne. Il est utilisé dans diverses applications, notamment la robotique, les appareils embarqués, les téléphones mobiles et les grands environnements informatiques hautes performances.

Bien que les applications soient relativement haut de gamme, il est assez intéressant de réaliser un petit logiciel d'analyse de sentiments sur son PC.

Concevez la méthode d'identification selon vos propres idées et idées. Keras, qui est également très populaire en ce moment, semble utiliser les changements dans la forme de la bouche comme indicateur d'analyse émotionnelle.

Mon idée est d'utiliser le taux d'ouverture de la bouche, le degré d'ouverture des yeux et l'angle d'inclinaison des sourcils comme trois indicateurs d'analyse des émotions. Cependant, en raison des grandes différences d’apparence entre les personnes et du large éventail de traits du visage, ma méthode de calcul est également relativement simple. L’efficacité de la reconnaissance n’est donc pas très élevée.

Règles de reconnaissance :

1. Plus la proportion de la distance entre l'ouverture de la bouche et la largeur du cadre de reconnaissance faciale est grande, plus l'émotion est excitée, qui peut être très heureux, ou extrêmement en colère.

2. Les sourcils sont relevés. Plus le rapport entre les points caractéristiques 17-21 ou 22-26 à partir du haut du cadre de reconnaissance faciale et la hauteur du cadre de reconnaissance est petit, cela signifie que les sourcils sont davantage relevés. fortement, ce qui peut exprimer la surprise et le bonheur. L'angle d'inclinaison des sourcils. Lorsque vous êtes heureux, vos sourcils sont généralement relevés. Lorsque vous êtes en colère, vos sourcils sont froncés. En même temps, vos sourcils sont plus fortement enfoncés.

3. Plissez les yeux. Les gens plisseront inconsciemment les yeux lorsqu'ils rient, et ils écarquilleront les yeux lorsqu'ils seront en colère ou surpris.

Défauts du système : il ne peut pas capturer les changements subtils dans les expressions et ne peut juger que grossièrement les émotions des gens, telles que le bonheur, la colère, la surprise et le naturel.

Avantages du système : structure simple et facile à utiliser.

Champs d'application : Capture de sourire, capture de la beauté du moment, soulagement de l'autisme chez les enfants et développement de jeux interactifs.

En raison de la complexité des émotions humaines, ces expressions ne peuvent pas représenter complètement les fluctuations émotionnelles les plus intimes d'une personne. Pour améliorer la précision du jugement, une évaluation complète telle que la détection de la fréquence cardiaque et le traitement de la parole est nécessaire.

2. Configuration de l'environnement de développement :

1. Installez VS2015, car la dernière version de dlib-19.10 nécessite cette version de vscode

2. Installation opencv (installation en mode whl) :

Téléchargez la version requise du fichier whl depuis pythonlibs, tel que (opencv_python?3.3.0+contrib?cp36?cp36m?win_amd64.whl)
puis utilisez-le localement pip install installation. Faites attention à l'emplacement du fichier (tel que : C: downloadxxx.whl)

3. Installez dlib (installation en mode whl) :

Téléchargez différentes versions des fichiers whl de dlib ici, puis ouvrez cmd dans le répertoire racine et installez-le directement.

Mais pour apprendre à utiliser divers exemples de programmes Python dans dlib, vous devez toujours télécharger un package compressé dlib.

Visitez directement le site officiel de dlib pour télécharger : http://dlib.net/ml.html

Fichiers Whl des différentes versions de dlib : https://pypi.python .org/simple/dlib/

4. Si vous souhaitez utiliser l'étalonnage des caractéristiques du modèle de visage, vous avez également besoin d'un prédicteur de forme de visage. Cela peut être entraîné avec vos propres photos, ou vous pouvez utiliser l'auteur dlib pour le faire. Un prédicteur bien formé :

Cliquez pour télécharger : http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

Idées de mise en œuvre

Quatre étapes spécifiques

Tout d'abord, utilisez dlib pour la reconnaissance faciale :)

import cv2
import dlib
from skimage import io

# 使用特征提取器get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
# dlib的68点模型,使用作者训练好的特征预测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 图片所在路径
img = io.imread("2.jpg")
# 生成dlib的图像窗口
win = dlib.image_window()
win.clear_overlay()
win.set_image(img)

# 特征提取器的实例化
dets = detector(img, 1)
print("人脸数:", len(dets))

for k, d in enumerate(dets):
    print("第", k+1, "个人脸d的坐标:",
       "left:", d.left(),
       "right:", d.right(),
       "top:", d.top(),
       "bottom:", d.bottom())

    width = d.right() - d.left()
    heigth = d.bottom() - d.top()

    print('人脸面积为:',(width*heigth))

Ensuite, instancier un shape_predictor objet, utilisez l'auteur dlib pour entraîner le détecteur de caractéristiques du visage et calibrer les points caractéristiques du visage.

Lors du calibrage, utilisez la méthode du cercle d'opencv pour ajouter un filigrane aux coordonnées des points caractéristiques. Le contenu est le numéro de série et la position des points caractéristiques.

 # 利用预测器预测
    shape = predictor(img, d)
    # 标出68个点的位置
    for i in range(68):
      cv2.circle(img, (shape.part(i).x, shape.part(i).y), 4, (0, 255, 0), -1, 8)
      cv2.putText(img, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
    # 显示一下处理的图片,然后销毁窗口
    cv2.imshow('face', img)
    cv2.waitKey(0)

À ce stade, les informations de 68 points caractéristiques ont été obtenues. Ensuite, il est nécessaire d'effectuer un calcul complet basé sur les informations de coordonnées de ces 68 points caractéristiques comme indicateur de jugement pour chaque expression. .

Sur la base de mes indicateurs de jugement mentionnés ci-dessus, calculez d'abord le taux d'ouverture de la bouche. En raison de la distance de la personne à la caméra, de la taille du cadre de reconnaissance faciale. est différent, donc le rapport est choisi comme indice de jugement.

Analysez plusieurs photos de visages heureux avant de choisir une valeur standard pour l'indicateur. Calculez le taux moyen d’ouverture de la bouche lorsque vous êtes heureux.

Ce qui suit est une méthode de traitement des données pour intercepter les sourcils humains. Un ajustement linéaire est effectué sur les cinq points caractéristiques du sourcil gauche pour ajuster une ligne droite de fonction linéaire. La pente de la ligne droite ajustée est utilisée à environ. représentent le degré d’inclinaison des sourcils.

# 眉毛
          brow_sum = 0  # 高度之和
          frown_sum = 0  # 两边眉毛距离之和
          for j in range(17,21):
            brow_sum+= (shape.part(j).y - d.top()) + (shape.part(j+5).y- d.top())
            frown_sum+= shape.part(j+5).x - shape.part(j).x
            line_brow_x.append(shape.part(j).x)
            line_brow_y.append(shape.part(j).y)

          self.excel_brow_hight.append(round((brow_sum/10)/self.face_width,3))
          self.excel_brow_width.append(round((frown_sum/5)/self.face_width,3))
          brow_hight[0]+= (brow_sum/10)/self.face_width    # 眉毛高度占比
          brow_width[0]+= (frown_sum/5)/self.face_width    # 眉毛距离占比

          tempx = np.array(line_brow_x)
          tempy = np.array(line_brow_y)
          z1 = np.polyfit(tempx, tempy, 1) # 拟合成一次直线
          self.brow_k = -round(z1[0], 3)  # 拟合出曲线的斜率和实际眉毛的倾斜方向是相反的

我计算了25个人脸的开心表情的嘴巴张开比例、嘴巴宽度、眼睛张开程度、眉毛倾斜程度,导入excel表格生成折线图:

通过折线图能很明显的看出什么参数可以使用,什么参数的可信度不高,什么参数在那个范围内可以作为一个指标。

同样的方法,计算人愤怒、惊讶、自然时的数据折线图。

通过对多个不同表情数据的分析,得出每个指标的参考值,可以写出简单的表情分类标准:

# 分情况讨论
            # 张嘴,可能是开心或者惊讶
            if round(mouth_higth >= 0.03):
              if eye_hight >= 0.056:
                cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)
              else:
                cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)

            # 没有张嘴,可能是正常和生气
            else:
              if self.brow_k <= -0.3:
                cv2.putText(im_rd, "angry", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)
              else:
                cv2.putText(im_rd, "nature", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)

五、实际运行效果:

识别之后:


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:@classmethod en PythonArticle suivant:@classmethod en Python