Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)

1.研究背景

在深度学习中,传统的卷积神经网络对面部表情特征的提取不充分以及计算参数量较大的问题,导致分类准确率偏低。因此,提出了一种基于改进的VGG19网络的人脸表情识别算法。首先,对数据进行增强如裁剪、翻转等处理,然后采用平均池化取代全连接操作从而大幅降低网络的参数量,最后,测试的时候采用了10折交叉验证的方法增加数据量以提升模型的泛化能力。实验结果表明,改进后的神经网络在FER2013测试数据集上的识别准确率为73.112%。

2.图片演示

1.png

3.实时摄像头演示

3.png

4.png

4.视频效果演示

Opencv基于VGG19的表情识别系统(源码&Fer2013&教程)_哔哩哔哩_bilibili

5.数据集的准备

FER2013数据集

FER2013数据集由Pierre Luc carrier和Aaron Courville通过搜索相关的情感关键词在网络上爬取的。这些图像都是经过人工标注的。它是由35886张表情图片构成,测试集28708张,公有验证集和私有验证集各3589张,每张图片是由大小为48×48像素的灰度图组成,分为7个类别,分别为中性、快乐、惊讶、悲伤、愤怒、厌恶、恐惧。图1展示了数据集中的几个样本。

6.VGG19表情分类网络的构建

现有网络存在的问题

近几年来,前馈神经网络(FNN)和卷积神经网络(CNN)也被用来提取表情特征。基于卷积神经网络(CNN)的新的识别框架在FER中已经取得了显著的结果。CNN中的多个卷积和汇集层可以提取整个面部或局部区域的更高和多层次的特征,且具有良好的面部表情图像特征的分类性能。经验证明,CNN比其它类型的神经网络在图像识别方面更为优秀。基于神经网络的方法也存在着两个问题:

(1)简单的神经网络(如FNN)忽略图像二维信息。

(2)浅层卷积网络所提取的特征,鲁棒性较差。

基本上面的人为设计特征与神经网络的缺陷,我们尝试着用深度卷积网络来解决表情识别的问题。

模型的设计

(1)我们采用深度卷积神经网络来将人脸表情特征提取与表情分类融合到一个end-to-end的网络中。分别采用了VGG19和Resnet18来完成表情的识别与分类。

(2)VGG19 的每一个小块是有一个卷积层,一个BatchNorm层,一个relu层和一个平均池化层来构成的。而resnet是由两个卷积层,两个BatchNorm层组成,而且每个resnet模块输入输出端还有快捷链接。

(3)在全连接层之前加入了dropout策略,增加了模型鲁棒性;

(4)我们都去掉了传统VGG19与Resnet18中的多个全连接层,直接在一个全连接层后直接分为7类去识别。

损失函数的设计

受到该博客的启发,我们探索了两种损失函数的计算方法,第一种是交叉熵损失函数。模型在全连接层之后,得到了每一类的输出概率,但此时概率是没有经过归一化的,我们通过一个softmax层,将概率归一化到1,更加易于数据处理。而交叉熵损失函数计算公式如下:
image.png

网络模型的改进

首先,参考该博客利用超深度卷积神经网络提取人脸表情特征。然后,通过卷积核大小是1×1的平均池化层对提取的特征进行降维。最后,采用带有动量的随机梯度方法对算法进行优化,通过softmax 函数来进行分类。
在训练过程中,改进后的网络结构的参数量如表1所示。表格只统计了网络结构中所有的卷积层,不包含其他网络层。相比原始VGG网络中140MB大小的参数量,减少了50MB左右,大大节省了计算资源和训练时间。
image.png

7.实验结果的分析

我们做了一系列的实验,它们都遵循这样一个过程:数据预处理(包括数据增强)-搭建神经网络-训练-测试-评估模型。其中一组实验单独使用CNN(VGG19)对FER2013进行了实验。经过约10小时250轮的训练获得训练模型并在测试集上进行测试。准确率为73.112%。我们在下图中分别记录了训练、验证,测试时的混淆矩阵。
PrivateTest_cm.png

8.代码实现

import torch.nn as nn
from torch.utils import data
from torchvision import transforms
from PIL import Image
from torchvision import models as MD
import torch
import torchvision.datasets as datasets
 
 
def  Make_data(path):
    img=datasets.ImageFolder(path,
                         tensform=transforms.Compose([transforms.Scale([48, 48]), transforms.ToTensor()]))
    imgs_load=data.DataLoader(img,batch_size=100,shuffle=True)
    return imgs_load
 
 
def train(dada_loader):
    model = MD.vgg19(pretrained=False)
    model.load_state_dict(torch.load("../models/???.pth"))
    num_input = model.classifier[6].in_features
    feature_model = list(model.classifier.children())
    feature_model.pop()
    feature_model.append(nn.Linear(num_input, 7))
    model.classifier = nn.Sequential(*feature_model)
    model = model.cuda()
    critersion = nn.CrossEntropyLoss()
    opt = torch.optim.SGD(model.parameters(), lr=0.001)
 
    for ench in range(200):
        sum = 0
        for i, data in enumerate(dada_loader):
            img, targe = data[1]
            targe = targe.cuda()
            img = img.cuda()
            output = model(img)
            loss = critersion(output, targe)
            opt.zero_grad()
            loss.backward()
            opt.step()
            sum += loss
        print(sum)
        if ench % 20 == 0:
            torch.save(model.state_dict(), "../models/" + str(ench) + ".pkl")
 
 
def test(dada_loader):
    model = MD.vgg19(pretrained=False)
    num_input = model.classifier[6].in_features
    feature_model = list(model.classifier.children())
    feature_model.pop()
    feature_model.append(nn.Linear(num_input, 7))
    model.classifier = nn.Sequential(*feature_model)
    # 加载训练过的模型进行测试
    model.load_state_dict(torch.load(""))
    model = model.cuda()
    for i, data in enumerate(dada_loader):
        img, targe = data[1]
        targe = targe.cuda()
        img = img.cuda()
        output = model(img)
        _, pred = torch.max(output.data, 1)
        print(torch.sum(pred == targe))
 
 
if __name__ == '__main__':
    trainpath="../train"
    trainimg=Make_data(trainpath)
    train(trainimg)
 
 
    testpath = "../test"
    testimg = Make_data(trainpath)
    test(testimg)

9.系统整合

下图源码&环境部署视频教程&表情数据集&自定义UI界面&训练
5.png

参考博客《Opencv基于改进VGG19的表情识别系统(源码&Fer2013&教程)》

10.参考文献

[1]王伟东,罗莹,王坤,等.基于核相关滤波的改进目标跟踪算法[J].数字技术与应用.2021,(7).DOI:10.19695/j.cnki.cn12-1369.2021.07.29.
[2]樊轲.基于迁移学习的癫痫发作预测方法[J].电子设计工程.2022,30(12).DOI:10.14022/j.issn1674-6236.2022.12.006.
[3]王彦博,王浩然,张剑书,等.基于计算机视觉的疼痛检测系统的设计与实现[J].电子元器件与信息技术.2021,(6).DOI:10.19772/j.cnki.2096-4455.2021.6.085.
[4]孙帅成,徐春融,刘瑞明.专注度识别应用研究[J].科技资讯.2021,(14).DOI:10.16661/j.cnki.1672-3791.2105-5042-3389.
[5]龙英潮,丁美荣,林桂锦,等.基于视听觉感知系统的多模态情感识别[J].计算机系统应用.2021,30(12).DOI:10.15888/j.cnki.csa.008235.
[6]牛犇.基于深度残差神经网络与迁移学习的微体化石小样本图像识别研究[D].2021
[7]邓爽,何小海,卿粼波,等.基于改进VGG网络的弱监督细粒度阿尔兹海默症分类方法[J].计算机应用.2022,42(1).DOI:10.11772/j.issn.1001-9081.2021020258.
[8]赵卓.手机端人脸表情迁移和虚拟角色面部表情生成研究与应用[D].2021
[9]何其霖,穆平安.VGG网络与多特征融合的遮挡人脸检测[J].电子测量技术.2021,44(18).DOI:10.19651/j.cnki.emt.2107045.
[10]刘文豪.基于图像处理与深度学习的车载式隧道衬砌裂缝检测系统及方法研究[D].2021
[11]孙观.基于风格迁移算法的拍摄美化类手机应用设计研究[D].2021
[12]赵雅.基于时空特征的动态手势识别方法研究[D].2021

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python基于OpenCV的人脸表情识别系统是一种基于计算机视觉技术的应用,能够自动识别人脸表情并输出对应的情感,具有非常广泛的应用前景。 该系统的核心代码基于Python编程语言,并利用OpenCV图像处理库来实现人脸识别和表情识别的功能。实现流程包括人脸检测、关键点检测、表情分类和输出等步骤。 具体实现过程包括:首先通过OpenCV中的Haar级联检测算法来进行人脸检测,然后利用dlib库中的68点关键点检测方法,精确地获取人脸中的关键特征点,包括眼睛、鼻子、嘴巴等位置。接下来,使用基于支持向量机(SVM)分类器的机器学习算法,对获取到的人脸表情数据进行训练,比如快乐、悲伤、惊讶等表情。最后,根据输入的图像和识别结果,将对应的情感输出给使用者。 该系统源码很复杂,需要先熟悉Python编程语言、OpenCV图像处理等技术,才能进行有效的开发和维护。此外,由于人脸的复杂性和表情多样性,该系统还需要定期进行模型训练、算法调优和数据更新等工作。 总之,Python基于OpenCV的人脸表情识别系统是一项非常有技术含量和实用价值的应用,能够为很多场景提供智能化解决方案。 ### 回答2: Python基于OpenCV的人脸表情识别系统源码是用于人脸表情识别的程序代码。该程序使用Python编程语言和OpenCV计算机视觉库来构建,可以运行在Windows、Mac OS和Linux等操作系统上。 该程序先通过OpenCV库中的人脸检测算法,以及Haar特征进行人脸检测,然后将检测到的人脸图像进行处理,提取出图像中的特征点。随后采用深度学习技术中的卷积神经网络(CNN)进行表情分类,将信息传递到卷积神经网络中,由CNN分类器对表情进行判断,并将预测结果进行输出。 该程序源码包括多个文件,其中主要的源码文件是用于实现人脸表情识别的图像处理和分类器模型的文件。同时,还包括一些辅助性文件,用于读取图像、显示结果、测试模型精度等。 该程序可作为实际项目的基础,可以为人脸识别应用提供支持,让系统更加人性化,并且能够识别人脸的情感状态,用户体验更佳。同时,也有助于人工智能领域的深度学习网络的训练和推广,逐步完善人脸识别领域的表情识别技术。 ### 回答3: Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,高度参与人们在现代世界中表达自己的情感,非常适合当前社交媒体以及各种在线活动。这个项目的主要功能是对人脸的表情进行识别和分类,帮助用户了解被拍摄者的情感状态。 从技术角度来说,这个项目主要依靠OpenCV这个强大的开源计算机视觉库。它提供了很多人脸识别以及情感识别的算法和模型,使得这个项目的功能十分强大。用户可通过使用系统的GUI界面,使用电脑自带的摄像头,拍摄照片后可以马上得出照片中的人的表情状态以及预测可能的下一秒表情等。 在实现这个项目之前,需要熟悉Python语言以及 OpenCV库的基本用法。还要具备一定的机器学习和模式识别知识。将各个算法和模型组合在一起,满足各种不同的情况,进行快速且准确的表情识别。最终目的是提供一个高效的、精确率较高的表情识别系统,以支持广大人们的日常活动。 总而言之,Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,它提供的高效、准确、精细的表情识别功能,将深刻影响我们的日常活动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值