一、介绍

我想做的是基于人脸识别的表情(情绪)分析。看到网上也是有很多的开源库提供使用,为开发提供了很大的方便。我选择目前用的比较多的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作者给出的一个训练好的预测器:

三、实施思路

四、具体步骤

首先是利用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)

五、实际运行效果:

识别之后:

参考资料:

&lbrack;深度应用&rsqb;&&num;183&semi;实战掌握Dlib人脸识别开发教程

[深度应用]·实战掌握Dlib人脸识别开发教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com/xi ...

&lbrack;深度学习工具&rsqb;&&num;183&semi;极简安装Dlib人脸识别库

[深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包 ...

ArcFace虹软与Dlib人脸识别对比

我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

arcface和Dlib人脸识别算法对比

我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

【C&num;】arcface人脸识别使用问题分析

arcface上线了新版 正好有空 赶紧下载体验了一番 凡是过程中也遇到一些问题 1.初始化 [DllImport("libarcsoft_face_engine.dll", En ...

SUSE Linux Enterprise 11 离线安装 DLIB 人脸识别 python机器学习模块

python机器学习模块安装 我的博客:http://www.cnblogs.com/wglIT/p/7525046.html 环境:SUSE Linux Enterprise 11 sp4  离线安 ...

使用python3完成人脸识别

python dlib人脸识别_python3+dlib人脸识别及情绪分析相关推荐

  1. 利用Python和R对权游剧本进行NLP情绪分析

    文章目录 1. 背景知识 2. 准备数据 Python R 3. 数据清理 4. 数据分析 5. 收获 最近学会利用Python做了几个词云后,又应用NLP中情感分析,结合snownlp库完成了词云分 ...

  2. python下载网页歌词_python3个人学习笔记-批量下载分析歌词2

    我发现之前自己真是太愚蠢了没有搞清楚正则表达的各种用法. 不同词语的筛选根本不用像re.sub('另一个想替换的内容','另一个替换后的内容',re.sub('想要替换的内容','替换后的内容',x) ...

  3. python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别

    基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...

  4. Python+dlib+opencv实现简单的人脸识别

    目录 一.建立人脸数据集 1.采集人脸 2.采集对应20张图片的68个特征点数组和平均特征数组 二.人脸识别 三.总结 参考资料 接上一篇博客基于dlib+opencv3.4+python3.7的人脸 ...

  5. dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪

    文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...

  6. 用深度学习识别人脸openface和dlib

    你有没有发现 Facebook 研发出了一种能够在你的照片中识别出你朋友的神奇neng li? 之前,你需要手动点击你朋友的照片,输入他们的名字,然后加上标签.现在,只要你一上传照片,Facebook ...

  7. python动态人脸识别_python3.8动态人脸识别

    一.准备依赖库 pip install dlib pip python-opencv 二.代码实现 #coding: utf-8 """ 从视屏中识别人脸,并实时标出面部 ...

  8. 人脸识别系统——Dlib人脸识别

    EduCoder平台:人脸识别系统--Dlib人脸识别 第1关:dlib人脸检测的基本原理 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,使用Dlib识别人脸并输出识别结果: 计算已知 ...

  9. 人脸识别系统——Dlib人脸检测

    EduCoder平台:人脸识别系统--Dlib人脸检测 第1关:HOG特征描述方法 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 声明OpenCV中的HOG特征描述方法 ...

最新文章

  1. 执行远程linux命令,linux shell 远程执行命令
  2. oracle 表个数
  3. 一台古老电脑之维修记
  4. python使用datetime获取两个时间的时间差,与时间的加减运算
  5. phoenix timestamp字段查询
  6. 利用反射生成SQL语句
  7. 成也英雄,败也英雄—Sun前CEO Scott Mc- Nealy
  8. 项目在linux下运行情况,Linux系统下部署项目的设置方法
  9. 如何用c语言编写炫酷烟花程序,简单屏幕烟花程序
  10. OpenCV下载驿站(解决github下载问题,解决OpenCV官网下载较慢)
  11. 基本图像分类与目标检测网络要点总结
  12. 网络安全——lcx的使用
  13. java跨平台是什么意思_java的跨平台性指的什么
  14. 利用stm32cubemx生成单极性倍频spwm调制代码步骤
  15. 大学计算机应用教程实验步骤,大学计算机基础实验教程--详细介绍
  16. win10 / linux计划任务
  17. js月份的计算公式_JS根据生日月份和日期计算星座的简单实现方法
  18. java oo_我爱oo,我爱java
  19. Java线程的同步和异步的区别
  20. APP攻防——微信小程序解包反编译数据抓包APK资源提取

热门文章

  1. 鸿蒙系统3.0多大内存,鸿蒙2.0终于上机实测 多大内存能跑?
  2. “云时代”大势当前,专有云成企业上云首选
  3. SYN Flood攻击
  4. html5 水流旋涡,HTML5 金色漩涡动画
  5. USB摄像头预览识别二维码
  6. 做什么事都要有风险意识
  7. Freertos 任务切换
  8. android wifi流量监控,Android流量监测的实现原理
  9. 读源码品Caffe - 结构流程篇
  10. 云存储是什么?云存储的常见三种类型