【人工智能项目】LBP+SVM人脸表情识别

基于Matlab的人脸表情识别系统 一、项目背景与意义人脸表情识别是计算机视觉和人工智能领域的一个重要研究方向,它在人机交互、情感分析、安全监控等领域具有广泛的应用前景。通过自动分析人脸图像中的表情信息,可以实现对人类情感的智能感知和理解。基于Matlab的人脸表情识别系统项目旨在利用Matlab强大的编程能力和丰富的图像处理工具包,构建一个高效、准确的人脸表情识别系统,以满足不同应用场景下的需求。二、项目目标人脸检测:从输入的图像或视频帧中自动检测并定位人脸区域。 阅读详情

【人工智能项目】人脸表情识别

在这里插入图片描述
本次将采用传统的机器方法对人脸表情进行识别,主要步骤为先提取人脸表情的特征,拼接特征,送入机器学习模型当中训练测试,得到最终的检测结果。那开搞!!!
在这里插入图片描述

生成本次所需的图片

本次所用的数据是fer2013.csv数据,图片以像素值的形式保存在了csv文件中,所以我们需要先生成图片。

import pandas as pd

df = pd.read_csv("./fer2013.csv")
df.head()

#encoding:utf-8
import pandas as pd
import numpy as np
import os
import cv2

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")
        
        # 保存图片
        cv2.imwrite(imageName,image)
        imageCount = index
    print("总共有"+str(imageCount)+"张图片")

if __name__ == "__main__":
    saveImageFromFer2013("fer2013.csv")

总共有35886张图片

对生成的图片进行可视化展示分析。

# 可视化图像 anger disgust fear happy normal sad surprised
from tensorflow.keras.preprocessing.image import load_img,img_to_array
import matplotlib.pyplot as plt
import os
import warnings

%matplotlib inline

# 图像像素大小为48*48
pic_size = 48
plt.figure(0,figsize=(12,20))
cpt = 0
for expression in os.listdir("./Training/"):
    for i in range(1,6):
        cpt = cpt +1
        plt.subplot(7,5,cpt)
        img = load_img("./Training/"+expression+"/"+os.listdir("./Training/"+expression)[i],target_size=(pic_size,pic_size))
        plt.imshow(img,cmap="gray")
plt.tight_layout()
plt.show()        

在这里插入图片描述
之后对训练图像中类别数量进行统计

# 统计训练图像中每个类别的数量
for expression in os.listdir("./Training/"):
    print(str(len(os.listdir("./Training/"+expression)))+" " + expression +" images")

95 anger images
436 disgust images
4097 fear images
7215 happy images
4965 normal images
4830 sad images
3171 surprised images

特征提取工作

import os
import numpy as np
from skimage import feature as skif
from skimage import io, transform
import random
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVR

<img src="./2.png">
def get_lbp_data(images_data, hist_size=256, lbp_radius=1, lbp_point=8):
    n_images = images_data.shape[0]
    hist = np.zeros((n_images, hist_size))
    for i in np.arange(n_images):
        # 使用LBP方法提取图像的纹理特征.
        lbp = skif.local_binary_pattern(images_data[i], lbp_point, lbp_radius, 'default')
        # 统计图像的直方图
        max_bins = int(lbp.max() + 1)
        # hist size:256
        hist[i], _ = np.histogram(lbp, normed=True, bins=max_bins, range=(0, max_bins))

    return hist
import os
import cv2


anger_imgs_path = "./Training/anger/"
anger_hists = []
for img_path in os.listdir(anger_imgs_path):
    img = cv2.imread(os.path.join(anger_imgs_path,img_path))
    hist =  get_lbp_data(img, hist_size=256, lbp_radius=1, lbp_point=8)
    anger_hists.append(hist)
anger_hists = np.array(anger_hists)
print(anger_hists.shape)
import numpy as np
anger_arr = np.zeros(3995)
anger_arr.shape

同理,对其余文件夹中的图片进行相同操作,生成各个表情的特征之后,对其拼接。

x_train = np.vstack((anger_hists,disgust_hists,fear_hists,happy_hists,normal_hists,sad_hists,surprised_hists))

y_train = []

anger_list = list(anger_arr)
disgust_list = list(disgust_arr)
fear_list = list(fear_arr)
happy_list = list(happy_arr)
normal_list = list(normal_arr)
sad_list = list(sad_arr)
surprised_list = list(surprised_arr)


anger_list.extend(disgust_list)
anger_list.extend(fear_list)
anger_list.extend(happy_list)
anger_list.extend(normal_list)
anger_list.extend(sad_list)
anger_list.extend(surprised_list)


y_train = np.array(anger_list)
x_train.shape
y_train.shape

重新划分

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.1,random_state=2019)

SVM模型

from sklearn.svm import SVC

svm = SVC(kernel="linear")
svm.fit(x_train,y_train)

SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=‘ovr’, degree=3, gamma=‘scale’, kernel=‘linear’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

from sklearn.externals import joblib
svm = joblib.load("svm_train_model.m")
print ("Done\n")
from sklearn.metrics import accuracy_score,f1_score,confusion_matrix,classification_report

from sklearn.externals import joblib
joblib.dump(svm, "svm_train_model.m")
print ("Done\n")
prediction =svm.predict(x_test)
score=accuracy_score(y_test,prediction)
import seaborn as sns

garbage_types = ['anger','disgust','fear','happy','normal',
               'sad','surprised']
labels = {0:'anger',1:'disgust',2:'fear',3:'fear',4:'normal',
          5:'sad',6:'surprised'}




acc = accuracy_score(y_test,prediction)
print(acc)
con_matrix = confusion_matrix(y_test, prediction,
                              labels=[0, 1, 2, 3, 4, 5, 6])
plt.figure(figsize=(10, 10))
plt.title('Prediction of garbage types')
plt.ylabel('True label')
plt.xlabel('Predicted label')
# plt.show(sns.heatmap(con_matrix, annot=True, fmt="d",annot_kws={"size": 7},cmap='Blues',square=True))
ax = sns.heatmap(con_matrix, annot=True, fmt="d", annot_kws={"size": 7}, cmap='Blues', square=True)
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)
plt.show()

小节

LBP+SVM人脸识别的准确率相比较深度学习比较一般,不过主要是让大家了解如何提取特征,送入机器学习模型当中。那么本次就到这里了,下次见!

在这里插入图片描述

人脸面部表情识别系统的设计(opencv) 转眼间研究生已经过去两年了,这几天整理一下,研究生期间做的一些课题,算是一个总结吧!未来的路很长,还需要继续努力哈。 人脸表情识别系统,是我在研二刚开始的时候做的一个小demo,是根据一篇论文自己实现的, Facial expression recognition based on Local Binary Patterns:A comprehensive study Caifeng Sha 阅读详情

相关推荐

OpenCV实战:用LBP直方图特征,5步搭建一个简易人脸表情识别原型

本文详细介绍了如何使用OpenCV和LBP直方图特征在5步内搭建一个简易人脸表情识别原型。通过LBP特征提取、空间分区与直方图统计等步骤,结合SVM分类器,实现高效的表情识别。文章还提供了实战效果提升技巧和常见问题解决方案,适合计算机视觉开发者快速入门。

weixin_26712075的博客 145

python基于LBP+SVM开发构建基于fer2013数据集的人脸表情识别模型是种什么体验,让结果告诉你...

python基于LBP+SVM开发构建基于fer2013数据集的人脸表情识别模型是种什么体验,让结果告诉你...

Together_CZ的博客 1118

Python借助OpenCV进行人脸表情识别

本文旨在为读者提供一个全面的指南,介绍如何使用Python和OpenCV实现人脸表情识别系统。人脸检测的基本原理和方法表情识别的特征提取技术机器学习模型在表情识别中的应用完整的Python实现代码性能优化和实际部署考虑背景介绍:概述表情识别的基本概念和应用场景核心概念与联系:讲解人脸检测和表情识别的关键技术核心算法原理:详细分析使用的算法和实现步骤数学模型:介绍相关的数学理论和公式项目实战:完整的代码实现和解释应用场景:实际应用案例分析。

AI Python 编程之道的博客 915

LBP特征的实现及LBP+SVM分类

LBP特征的实现及LBP+SVM分类

QQ哥的专栏 4万+

基于MATLAB GUI的LBP+SVM人脸表情识别

在本文中,我们使用FER-2013数据集,该数据集包含35887张人脸图片,其中28709张用于训练,7178张用于测试。这些图片的大小不一,需要进行前期处理。由于每个人脸图片都对应着一个表情标签,我们可以使用MATLAB内置的imread函数加载图片,同时读取其标签。当用户上传一张人脸图片并点击“表情识别”按钮后,程序将自动进行LBP特征提取,并使用训练好的SVM分类器进行表情识别,最后将结果显示在界面上。在人脸表情识别中,需要选取合适的特征描述符提取人脸图像的特征,以便于后续分类器的训练和识别。

HackDashX的博客 299

基于SVM的面部表情识别Matlab实现

Jaffe数据集中的情感类型包括愤怒(AN,angry)、厌恶(DI,disgusted)、害怕(AF,afraid)、高兴(HA,happy)、悲伤(SA,sad)、惊讶(SU,surprised)和中性(NE,neutral)7 种类型。我们需要将测试集中的人脸图像进行LBP特征提取,并输入到SVM分类器中,得到对应的表情分类结果。在特征提取完成后,我们需要使用分类器对特征进行分类。面部表情识别旨在通过计算机对人脸的各种表情进行自动识别和分类,具有广泛的应用价值,如安防监控、智能驾驶、虚拟现实等领域。

2301_79331328的博客 268

Kaggle ICML2013 fer2013人脸表情识别/面部表情识别:训练、调优、调试与踩坑

目录 概要: 问题来源: 论文对此比赛的说明: 选择原因: 实现与优化思路: 前置: 数据处理: 原csv数据的读取与分割: csv数据转图片和tfrecord的存取: tfrecord接生产队列供模型训练: 神经网络定义: 损失函数: 滑动平均(EMA): 训练与优化过程: 基本设置: 学习率: batch_size: 训练次数: Dropout: BN:...

huqinwei的专栏 2万+

人脸表情识别教学骨架:从FACS心理学到LBP/SVM工程实现

人脸表情识别(FER)是计算机视觉与人机交互交叉的核心技术,其本质是将面部视觉信号转化为情绪语义标签。原理上需遵循检测→特征→分类三阶段 pipeline,其中特征提取决定系统上限:PCA侧重全局结构但易忽略微表情,LBP编码局部纹理序关系,Gabor小波则凭借方向选择性与光照鲁棒性应对真实场景挑战。技术价值在于为小样本、低算力场景提供可解释、可调试的替代方案,避免深度学习黑箱依赖。典型应用场景包括在线教育情绪反馈、AI助教情感自适应、无障碍人机交互等。本教案聚焦传统机器学习路径,以Ekman-Friese

weixin_29061425的博客 134

深度学习项目-人脸表情识别

本文介绍利用Keras如何实现一个人脸表情识别系统。

周先森爱吃素的博客 1万+

基于MATLAB的人脸表情识别系统设计与实现

人脸表情识别(Facial Expression Recognition, FER)是计算机视觉与人工智能领域的重要研究方向,旨在通过图像或视频自动识别个体的情绪状态,如愤怒、厌恶、恐惧、高兴、悲伤和惊讶等基本情绪。该技术的发展依托于情感计算、模式识别与深度学习的不断进步,广泛应用于智能监控、教育评估、心理健康分析及人机交互等多个领域。从技术流程来看,FER系统通常包括图像采集、预处理、人脸检测与对齐、特征提取以及情绪分类五大核心环节。图像采集阶段可通过摄像头或已有数据集获取原始图像;

weixin_35903223的博客 805

基于C++与小波变换的人脸表情识别系统(含表情库)

简介:本文介绍了一个使用C++结合小波变换技术实现的人脸表情识别系统,涵盖从图像特征提取到表情分类的完整流程。小波变换因其在时频域上的局部化优势,被用于高效提取人脸局部纹理变化特征,如皱纹、嘴角形态等关键表情指标。项目集成OpenCV库实现人脸检测(如Haar、LBP、HOG)、图像预处理与小波分析,并采用机器学习方法(如SVM或神经网络)进行表情分类。压缩包内含标注好的人脸表情数据库,支持模型训练与验证。该系统展示了C++在高性能计算机视觉任务中的应用潜力,适合作为人工智能与图像处理领域的实践参考。

weixin_42360846的博客 935

人工智能与机器学习——人脸表情识别

一、人脸特征提取的步骤 ①数据集 这里我们使用GENKI-4K数据集去进行我们的实验,GENKI-4K一共包含4000个图像,分为“笑”和“不笑”两种,每个图片拥有不同的尺度大小,姿势,光照变化,头部姿态,可专门用于做笑脸识别。这些图像包括广泛的背景,光照条件,地理位置,个人身份和种族等。 ②定义 训练/测试:将图片分为训练集和测试集,训练集中的图片是用来训练模型,测试集的图片是用来对模型进行测试和评价的。 阳性样本:笑脸的图片。 阴性样本:不笑的图片 F1分数:用来衡量你的模型。...

dedsec0x的博客 9068

face-expression-recognition-svm:训练SVM分类器以识别Fer2013数据集上的人的表情(情绪)

使用SVM进行面部表情识别 使用Dlib提取人脸地标,并训练多类SVM分类器以识别人脸表情(情感)。 动机: 任务是根据面部表情所显示的情感对人的图像进行分类。 为了训练我们的模型,我们想使用Fer2013 datset,其中包含30,000个表达式图像,分为七个类别:愤怒,厌恶,恐惧,快乐,悲伤,惊喜和中立。 问题在于,Fer2013图像未对齐,因此很难从中对面部表情进行分类。 据我所知,该数据集的最新准确性为75.2%(请参阅: Christopher Pramerdorfer和Martin Kampel。“使用卷积神经网络进行面部表情识别:最新技术”。arXiv:1612.02903v

基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别

基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别

Together_CZ的博客 1332

机器学习人脸检测源代码

人脸检测的源代码,包括机器学习部分,特征提取部分,特征匹配部分等等,对学习图像处理的朋友很有帮助

python语言使用LBP算法提取特征向量SVM算法训练模型和识别分类整套文件(可直接运行)

python语言使用LBP算法提取特征向量SVM算法训练模型和识别分类整套文件。内有训练和测试、验证图片集,训练和测试程序分两个py文件。训练使用lbp_train.py文件,测试和验证使用均使用lbp_test.py文件,更改训练集和测试集文件可更改为自己所需的程序。LBP算法使用uniform模式,准确率可达93.31%以上

人脸表情识别 实战项目

使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。

weixin_62075168的博客 1814

分享通达信破解交易接口的使用!

那其实通达信破解交易接口的使用方法比较复杂,这里以MA均线指标为例子,只要理解了这些操作步骤,就可以很容易地使用其他指标包括自己编写的指标来进行交易。委托结果(包含委托编号), 需要分配 1024*1024 字节的空间。委托结果数组, 每项结果需要分配 1024*1024 字节的空间。0: 买入, 1: 卖出, 2: 融资买入, 3: 融券卖出,4: (市价委托)上海五档即成剩撤, 深圳五档即成剩撤。4: 买券还券, 5: 卖券还款, 6: 现券还券。0: 上海限价委托, 深圳限价委托。

1841085904的博客 2361
上一篇: 【人工智能项目】Bert实现文本领域分类
下一篇: 【人工智能项目】Bert实现泰迪杯论坛文本分类任务
mind_programmonkey
mind_programmonkey 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄9年 4435粉丝 1111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值