Python基于OpenCV的人脸表情识别系统[源码&部署教程]

Posted 群马视觉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基于OpenCV的人脸表情识别系统[源码&部署教程]相关的知识,希望对你有一定的参考价值。

1.项目背景

人脸表情识别是模式识别中一个非常重要却十分复杂的课题。首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾。然后对近期人脸表情识别的方法进行了分类综述。通过对各种识别方法的分析与比较 ,提出了人脸表情识别技术实用化所需要考虑的几个方面 ,进而展望了今后人脸表情识别技术的发展方向。

2.识别效果展示

3.识别视频演示

Python基于OpenCV的人脸表情识别系统[源码&部署教程]_哔哩哔哩_bilibili

4.实现方法分析

人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。

5.实现方法分析

人脸表情识别中需要运用人脸检测技术,识别人脸之后,再对表情图像做预处理(彩色图像灰度化、图像几何归一化和光照预处理),然后再对表情特征进行提取,分析,从而实现对表情的识别。国内外对于人脸的表情识别的研究近几年非常的多,涌现出了很多的算法,但对于表情的识别精度还是有待改进。
本设计报告采用人脸检测技术,并进行标记,图像灰度化,图像几何归一化等方法,通过提取出嘴巴,眼睛两个地方的大小变化进行判断。

5.算法流程图

6.fer2013人脸表情数据集简介

Fer2013人脸表情数据集由35886张人脸表情图片组成,其中,测试图(Training)28708张,公共验证图(PublicTest)和私有验证图(PrivateTest)各3589张,每张图片是由大小固定为48×48的灰度图像组成,共有7种表情,分别对应于数字标签0-6,具体表情对应的标签和中英文如下:0 anger 生气; 1 disgust 厌恶; 2 fear 恐惧; 3 happy 开心; 4 sad 伤心;5 surprised 惊讶; 6 normal 中性。

但是,数据集并没有直接给出图片,而是将表情、图片数据、用途的数据保存到csv文件中,如下图所示,

如上图所示,第一张图是csv文件的开头,第一行是表头,说明每列数据的含义,第一列表示表情标签,第二列即为图片数据,这里是原始的图片数据,最后一列为用途。

7.表情图片提取

知道数据结构以后,就好办了,使用pandas解析csv文件,(pandas的简单用法可以查看这篇博客:https://blog.csdn.net/rookie_wei/article/details/82974277 ),再将原始图片数据保存为jpg文件,并根据用途和标签标签进行分类,分别保存到对应文件夹下,代码比较简单,并且做了详细备注,直接给完整代码如下

代码实现

#encoding:utf-8
import pandas as pd
import numpy as np
import scipy.misc as sm
import os
 
emotions = 
    '0':'anger', #生气
    '1':'disgust', #厌恶
    '2':'fear', #恐惧
    '3':'happy', #开心
    '4':'sad', #伤心
    '5':'surprised', #惊讶
    '6':'normal', #中性

 
#创建文件夹
def createDir(dir):
    if os.path.exists(dir) is False:
        os.makedirs(dir)
 
def saveImageFromFer2013(file):
 
 
    #读取csv文件
    faces_data = pd.read_csv(file)
    imageCount = 0
    #遍历csv文件内容,并将图片数据按分类保存
    for index in range(len(faces_data)):
        #解析每一行csv文件内容
        emotion_data = faces_data.loc[index][0]
        image_data = faces_data.loc[index][1]
        usage_data = faces_data.loc[index][2]
        #将图片数据转换成48*48
        data_array = list(map(float, image_data.split()))
        data_array = np.asarray(data_array)
        image = data_array.reshape(48, 48)
 
        #选择分类,并创建文件名
        dirName = usage_data
        emotionName = emotions[str(emotion_data)]
 
        #图片要保存的文件夹
        imagePath = os.path.join(dirName, emotionName)
 
        # 创建“用途文件夹”和“表情”文件夹
        createDir(dirName)
        createDir(imagePath)
 
        #图片文件名
        imageName = os.path.join(imagePath, str(index) + '.jpg')
 
        sm.toimage(image).save(imageName)
        imageCount = index
    print('总共有' + str(imageCount) + '张图片')
 
 
if __name__ == '__main__':
    saveImageFromFer2013('fer2013.csv')

运行完上面的代码后,得到3个文件夹,文件下有相应的表情的子文件夹

子文件夹下又有相应的图片

8.系统整合

9.完整源码&环境部暑视频教程&数据集&自定义UI界面

百度面包多搜索标题名即可下载源码

10.参考文献

Python+OpenCV+dlib实现人脸检测与表情识别

点击查看:Python+OpenCV+dlib实现人脸检测与表情识别

文件大小:95M

操作系统:Windows10旗舰版

开发工具:Python3.8、OpenCV4.5、dlib

开发语言:.py

简要概述:

利用dlib库进行人脸识别与特征标定,并利用嘴巴的张开比例,眼睛的睁开程度,眉毛的倾斜程度作为表情分析的三个指标。方法较为简单,识别的效率不是很高,可以在此基础上进行改善。

识别规则:

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

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

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

具体步骤:

首先打开摄像头,捕捉人脸。利用dlib中dlib.get_frontal_face_detector()识别人脸,利用dlib.shape_predictor(“shape_predictor_68_face_landmarks.dat”)预测人脸的68点。之后综合计算,作为每个表情的判断指标。由于人离摄像头距离的远近,导致人脸识别狂的大小不一,故选择比例作为判断指标。

演示视频:
在这里插入图片描述
在这里插入图片描述

以上是关于Python基于OpenCV的人脸表情识别系统[源码&部署教程]的主要内容,如果未能解决你的问题,请参考以下文章

Python+OpenCV+dlib实现人脸检测与表情识别

基于OpenCv的人脸识别,翻车了居然识别错误。

opencv的人脸识别基于啥特征

基于Python+OpenCV实时人脸识别/检测系统(GUI界面)

python基于OpenCV的人脸识别系统

人脸表情识别系统——基于Mini-Xception网络模型实现表情分类