python3+dlib人脸识别及情绪分析

一、介绍

我想做的是基于人脸识别的表情(情绪)分析。看到网上也是有很多的开源库提供使用,为开发提供了很大的方便。我选择目前用的比较多的dlib库进行人脸识别与特征标定。使用python也缩短了开发周期。

官网对于dlib的介绍是:Dlib包含广泛的机器学习算法。所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起来非常简单。它用于各种应用,包括机器人技术,嵌入式设备,手机和大型高性能计算环境。

虽然应用都比较高大上,但是自己在PC上做个情绪分析的小软件还是挺有意思的。

按照自己的想法与思路设计识别方式。目前也比较火的keras好像就是根据嘴型的变化作为情绪分析的一个指标。

而我的想法是利用嘴的张开比例,眼睛的睁开程度,眉毛的倾斜角度作为情绪分析的三个指标。但是由于人与人长相的差异较大,五官的也是千差万别,再加上我的计算方法也比较简单。所以识别效率并不是很高。

识别规则:

1、嘴巴张开距离占面部识别框宽度的比例越大,说明情绪越激动,可能是非常开心,也可能是极度愤怒。

2、眉毛上扬,17-21 或者 22-26 号特征点距离面部识别框顶部与识别框高度的比值越小,说明眉毛上扬越厉害,可表示惊讶、开心。眉毛的倾斜角度,开心时眉毛一般是上扬,愤怒时皱眉,同时眉毛下压的比较厉害。

3、眯眼睛,人在开怀大笑的时候会不自觉的眯起眼睛,愤怒或者惊讶的时候会瞪大眼睛。

系统缺点:不能捕捉细微表情的变化,只能大致的判断出人的情绪,开心、愤怒、惊讶、自然。

系统优点:结构简单,易于上手。

应用领域:微笑抓拍,捕捉瞬间的美好、缓解儿童自闭症、交互式游戏开发。

由于人感情的复杂性,这些表情确实不能完完全全的代表一个人内心深处的情绪波动,如要提高判断的准确性,则需要心率检测、语音处理等综合评价。

二、开发环境搭建:

1、安装VS2015,因为最新版的dlib-19.10需要这个版本的vscode

2、安装opencv(whl方式安装):
从pythonlibs下载需要的版本whl文件,比如(opencv_python?3.3.0+contrib?cp36?cp36m?win_amd64.whl)
然后在本地使用pip install 安装。 注意文件位置下安装(如:C:\download\xxx.whl)

3、安装dlib(whl方式安装):
在这里下载dlib的各种版本的whl文件,然后在根目录下打开cmd直接安装即可。
但是为了学习使用dlib中的各种python实例程序,还是需要下载一个dlib的压缩包。
直接访问dlib官网即可下载:http://dlib.net/ml.html

dlib各种版本的whl文件:https://pypi.python.org/simple/dlib/

4、如果想要使用人脸模型特征标定的话,还需要一个人脸面部形状预测器,这个可以通过自己的照片进行训练,也可以使用dlib作者给出的一个训练好的预测器:

点击下载:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

三、实施思路

四、具体步骤

首先是利用dlib进行人脸识别:)

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))

然后实例化一个 shape_predictor 对象,使用dlib作者训练好人脸特征检测器,进行人脸的特征点标定。

标定的时候使用opencv的circle方法,在特征点的坐标上面添加水印,内容就是特征点的序号和位置。

        # 利用预测器预测
        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)

到此,68个特征点的信息就获取到了,下面就需要跟根据这个68个特征点的坐标信息,进行综合 计算,作为每个表情的判断指标。

根据上面说到的我的判断指标,先计算嘴巴的张开比例,由于人离摄像头距离的远近,导致人脸识别框的大小不一,故选择比例来作为判断指标。

在选择指标的标准数值之前,先对多个开心的人脸照片进行分析。计算开心时的嘴巴张卡比例的平均。

下面是截取对人眉毛的数据处理方法,对左边眉毛上面的5个特征点进行线性拟合,拟合出一个一次函数直线,用拟合直线的斜率近似代表眉毛的倾斜程度。

                    # 眉毛
                    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)

五、实际运行效果:

识别之后:

完整项目代码:https://gitee.com/Andrew_Qian/face/blob/master/from_video.py

参考资料:

8种方法用Python实现线性回归,为你解析最高效选择

利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时人脸68个特征点标定;

49 款人脸检测/识别的API、库和软件

原文地址:https://www.cnblogs.com/qsyll0916/p/8893790.html

时间: 2024-08-01 07:41:44

python3+dlib人脸识别及情绪分析的相关文章

[深度学习工具]&#183;极简安装Dlib人脸识别库

[深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境.Dlib的开源许可证 允许您在任何应用程序中免费使用它.Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习.深度学习.图像处理等模块的开发. 安装 此博文针对Windows10安装,其他平台可以仿照这个步骤来安装 安装Minicond

[深度应用]&#183;实战掌握Dlib人脸识别开发教程

[深度应用]·实战掌握Dlib人脸识别开发教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com/xiaosongshine/dlib_face_recognition 1.背景介绍 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch.但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识

实战 | 如何用最快的速度学会Dlib人脸识别开发?

项目GitHub地址:https://github.com/xiaosongshine/dlib_face_recognition 1.背景介绍 Dlib是一个深度学习开源工具,基于C++开发,也支持Python开发接口,功能类似于TensorFlow与PyTorch.但是由于Dlib对于人脸特征提取支持很好,有很多训练好的人脸特征提取模型供开发者使用,所以Dlib人脸识别开发很适合做人脸项目开发.上面所说的人脸识别开发,主要是指人脸验证,就是输入两张人脸照片,系统会对比输出0或者1,代表判断是

dlib人脸识别

dlib人脸识别 1.dlib安装 ? 代码的编写在jupyter notebook中来完成 ? jupyter notebook是一个工具 ? pip install jupyter ------------>安装使用 ? 如何启动: ? 命令行输入:jupyter notebook ? 前提,环境变量配置成功 ? ? dlib安装-------------> pip install dlib ? dlib有不同的版本,最新版本(19.17.0),经过测试,dll包不完备,所以上次我在使用时

OpenCV 和 Dlib 人脸识别基础

00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测试 在键盘按 Win + R, 输入 cmd,回车,将会打开cmd窗口,输入 activate base, 如下所示,表明anaconda环境系统变量无误. IDE PyCharm的安装 自行百度搜索下载并破解. http://idea.lanyus.com/ OpenCV安装 C:\Users\A

人脸识别技术的分析

人脸辨认体系的研讨始于20世纪60年代,80年代后跟着计算机技能和光学成像技能的开展得到提高,而真实进入初级的运用阶段则在90年后期,并且以美国.德国和日本的技能完成为主:人脸辨认体系成功的关键在于是否具有顶级的中心算法,并使辨认成果具有实用化的辨认率和辨认速度:"人脸辨认体系"集成了人工智能.机器辨认.机器学习.模型理论.专家体系.视频图画处理等多种专业技能,一起需结合中间值处理的理论与完成,是生物特征辨认的最新运用,其中心技能的完成,展示了弱人工智能向强人工智能的转化. 人脸辨认体

使用python3完成人脸识别

原文地址:https://www.jb51.net/article/160197.htm 第一种: 1 # -*- coding:utf-8 -*- 2 import cv2 as cv 3 import numpy as np 4 5 src = cv.imread('test1.jpg') 6 path = r'D:\face' 7 8 def face_detect_demo(): 9 gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY) 10 11 face

40行代码的人脸识别实践【转】

转自:http://blog.csdn.net/xingchenbingbuyu/article/details/68482838?ref=myrecommend 版权声明:本文为博主原创文章,转载请联系作者取得授权. 目录(?)[+] 40行代码的人脸识别实践 40行代码的人脸识别实践 前言 一点区分 所用工具 Dlib 人脸识别 前期准备 识别流程 代码 运行结果 前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些

基于人脸识别的登陆认证方案及思路

本文主要讨论基于人脸识别的登陆认证过程中的关键技术点,讨论如何实现这些关键技术点并解决困难问题. 1.关键技术点及思路 (1)登陆认证在服务器端实现还是在客户端实现? 换句话说,人脸识别的模型应该运行在服务器端还是客户端.如果人脸识别模型运行在服务器端,那么客户端必须在联网环境下才能通过服务端的认证并使用.某些场景下,例如音乐客户端场景(用户在无需联网的情况下也需要进入APP听音乐),人脸识别模型运行在服务器就无法满足需求.如果人脸识别模型运行在客户端,那么需要模型足够简单,客户端能够提供运行模