表情识别-情感分析-人脸识别(代码+教程)

这篇具有很好参考价值的文章主要介绍了表情识别-情感分析-人脸识别(代码+教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

表情识别

面部情绪识别(FER)是指根据面部表情识别和分类人类情绪的过程。通过分析面部特征和模式,机器可以对一个人的情绪状态作出有根据的推断。这个面部识别的子领域高度跨学科,涉及计算机视觉、机器学习和心理学等领域的知识。

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析

应用领域

以下是一些关键领域,其中这项技术可能有所帮助:

社交和内容创作平台:

根据情感反馈个性化用户体验。
自适应学习系统根据学习者的情绪状态调整内容,提供更具针对性的建议。

医疗研究:

监测患者是否存在抑郁、焦虑或其他情绪障碍的迹象。
协助治疗师在治疗过程中跟踪患者的进展或反应。
实时监测应激水平。

驾驶员安全机制:

监测驾驶员是否出现疲劳、注意力分散、压力或昏昏欲睡的迹象。

营销和市场研究:

实时分析观众对广告的反应。
根据观众的情绪状态定制广告内容。
产品测试和反馈。

安全和监控:

在拥挤区域检测可疑或异常行为。
分析公共事件中人群的反应,以确保安全。

构建面部情绪识别系统

本节深入探讨构建面部情绪识别系统的复杂性。我们首先探讨一个专门为面部情绪识别设计的数据集,确保我们的模型有稳健的基础。接下来,我们将介绍一种自定义的VGG13模型架构,该架构以其在分类任务中的效率和准确性而闻名,并阐明其与我们情绪识别目标的相关性。

最后,我们花费一些时间在实验结果部分,提供全面的评估,阐明系统的性能指标及其潜在应用。

面部情绪识别数据集(FER +)

FER + 数据集是原始面部表情识别(FER)数据集的一个重要扩展。为了改进原始数据集的局限性,FER + 提供了更精细和细致的面部表情标签。虽然原始FER数据集将面部表情分类为六种基本情绪——快乐、悲伤、愤怒、惊讶、恐惧和厌恶——但FER + 根据这一基础更进一步引入了两个额外的类别:中性和蔑视。

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析

用于人脸检测的RFB-320

Single Shot Multibox Detector (SSD)模型 在识别情绪之前,需要在输入帧中检测人脸。为此,使用了超轻量级人脸检测模型RFB-320。它是一种针对边缘计算设备进行优化的创新人脸检测模型。该模型采用了改进的感受野块(RFB)模块,在不增加计算负担的情况下有效地捕捉多尺度的上下文信息。它在多样化的WIDER FACE数据集上进行训练,并针对320×240的输入分辨率进行优化,具有出色的效率平衡,计算速度为0.2106 GFLOPs,参数量仅为0.3004百万个。该模型基于PyTorch框架开发,取得了令人称赞的平均精度(mAP)为84.78%,在资源受限环境中成为高效人脸检测的强大解决方案。在此实现中,RFB-320 SSD模型以Caffe格式使用。

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析

自定义的VGG13模型架构

情绪识别分类模型采用了定制的VGG13架构,专为64×64灰度图像设计。它使用具有最大池化和dropout的卷积层将图像分类为八个情绪类别,以防止过拟合。该架构开始于两个具有64个卷积核的卷积层,然后是最大池化和25%的dropout。额外的卷积层捕捉复杂的特征,两个具有1024个节点的密集层聚合信息,然后是50%的dropout。一个softmax输出层预测情绪类别。

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析

让我们编写一些代码来实现这个系统。

首先,需要初始化一些重要的参数。


image_mean = np.array([127, 127, 127])
image_std = 128.0
iou_threshold = 0.3
center_variance = 0.1
size_variance = 0.2
min_boxes = [
    [10.0, 16.0, 24.0], 
    [32.0, 48.0], 
    [64.0, 96.0], 
    [128.0, 192.0, 256.0]
]
strides = [8.0, 16.0, 32.0, 64.0]
threshold = 0.5

image_mean: 在RGB通道上进行图像归一化的均值。
image_std: 图像归一化的标准差。
iou_threshold: 确定边界框匹配的交并比(IoU)度量的阈值。
center_variance: 预测的边界框中心坐标的缩放因子。
size_variance: 预测的边界框尺寸的缩放因子。
min_boxes: 不同尺寸对象的最小边界框尺寸。
strides: 根据图像大小控制特征图的尺度。
threshold: 目标检测的置信度阈值。


def define_img_size(image_size):
    shrinkage_list = []
    feature_map_w_h_list = []
    for size in image_size:
        feature_map = [int(ceil(size / stride)) for stride in strides]
        feature_map_w_h_list.append(feature_map)
 
    for i in range(0, len(image_size)):
        shrinkage_list.append(strides)
    priors = generate_priors(
        feature_map_w_h_list, shrinkage_list, image_size, min_boxes
    )
    return priors

上述的 define_img_size 函数旨在为目标检测任务生成先验边界框(priors)。该函数以 image_size 参数作为输入,根据提供的图像尺寸和一组预定义的步长值计算特征图的尺寸。这些特征图的尺寸反映了卷积神经网络(CNN)层对不同输入图像尺度的期望输出尺寸。实质上,SSD中的先验边界框提供了一种高效的方法,可以在网络的单次前向传递中同时预测多个边界框及其关联的类别得分,从而实现实时目标检测。

def FER_live_cam():
    emotion_dict = {
        0: 'neutral', 
        1: 'happiness', 
        2: 'surprise', 
        3: 'sadness',
        4: 'anger', 
        5: 'disgust', 
        6: 'fear'
    }
 
    # cap = cv2.VideoCapture('video1.mp4')
    cap = cv2.VideoCapture(0)
 
    frame_width = int(cap.get(3))
    frame_height = int(cap.get(4))
    size = (frame_width, frame_height)
    result = cv2.VideoWriter('result.avi', 
                         cv2.VideoWriter_fourcc(*'MJPG'),
                         10, size)
 
    # Read ONNX model
    model = 'onnx_model.onnx'
    model = cv2.dnn.readNetFromONNX('emotion-ferplus-8.onnx')
     
    # Read the Caffe face detector.
    model_path = 'RFB-320/RFB-320.caffemodel'
    proto_path = 'RFB-320/RFB-320.prototxt'
    net = dnn.readNetFromCaffe(proto_path, model_path)
    input_size = [320, 240]
    width = input_size[0]
    height = input_size[1]
    priors = define_img_size(input_size)
 
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            img_ori = frame
            #print("frame size: ", frame.shape)
            rect = cv2.resize(img_ori, (width, height))
            rect = cv2.cvtColor(rect, cv2.COLOR_BGR2RGB)
            net.setInput(dnn.blobFromImage(
                rect, 1 / image_std, (width, height), 127)
            )
            start_time = time.time()
            boxes, scores = net.forward(["boxes", "scores"])
            boxes = np.expand_dims(np.reshape(boxes, (-1, 4)), axis=0)
            scores = np.expand_dims(np.reshape(scores, (-1, 2)), axis=0)
            boxes = convert_locations_to_boxes(
                boxes, priors, center_variance, size_variance
            )
            boxes = center_form_to_corner_form(boxes)
            boxes, labels, probs = predict(
                img_ori.shape[1], 
                img_ori.shape[0], 
                scores, 
                boxes, 
                threshold
            )
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            for (x1, y1, x2, y2) in boxes:
                w = x2 - x1
                h = y2 - y1
                cv2.rectangle(frame, (x1,y1), (x2, y2), (255,0,0), 2)
                resize_frame = cv2.resize(
                    gray[y1:y1 + h, x1:x1 + w], (64, 64)
                )
                resize_frame = resize_frame.reshape(1, 1, 64, 64)
                model.setInput(resize_frame)
                output = model.forward()
                end_time = time.time()
                fps = 1 / (end_time - start_time)
                print(f"FPS: {fps:.1f}")
                pred = emotion_dict[list(output[0]).index(max(output[0]))]
                cv2.rectangle(
                    img_ori, 
                    (x1, y1), 
                    (x2, y2), 
                    (0, 255, 0), 
                    2,
                    lineType=cv2.LINE_AA
                )
                cv2.putText(
                    frame, 
                    pred, 
                    (x1, y1), 
                    cv2.FONT_HERSHEY_SIMPLEX, 
                    0.8, 
                    (0, 255, 0), 
                    2,
                    lineType=cv2.LINE_AA
                )
 
            result.write(frame)
         
            cv2.imshow('frame', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
 
    cap.release()
    result.release()
    cv2.destroyAllWindows()

FER_live_cam() 函数对视频帧进行实时的面部情绪识别。首先,它设置了一个字典 emotion_dict,将数字情绪类别索引映射到可读的情绪标签。视频源被初始化,尽管也可以使用网络摄像头输入。该函数还初始化了一个输出视频写入器,用于保存带有情绪注释的处理过的帧。主要的情绪预测模型以ONNX格式保存,在使用OpenCV DNN的 readNetFromONNX 方法读取并与以Caffe格式保存的RFB-30 SSD人脸检测模型一起加载。在逐帧处理视频时,人脸检测模型通过边界框识别出人脸。

检测到的人脸在输入情绪识别模型之前经过预处理,包括调整大小和转换为灰度图像。通过从模型的输出分数中选择最大值确定识别出的情绪,并使用 emotion_dict 将其映射到标签。然后,在检测到的人脸周围添加矩形框和情绪标签,将帧保存到输出视频文件中,并实时显示。用户可以通过按下 ‘q’ 键停止视频显示。一旦视频处理完成或中断,资源如视频捕获和写入器将被释放,并关闭任何打开的窗口。值得注意的是,该函数引用了一些在其作用域内未定义的变量和辅助函数,这表明它们是整个代码库的一部分。

推理结果

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析

表情识别-情感分析-人脸识别(代码+教程),表情识别,人脸识别与跟踪,情感分析
框和情绪标签,将帧保存到输出视频文件中,并实时显示。用户可以通过按下 ‘q’ 键停止视频显示。一旦视频处理完成或中断,资源如视频捕获和写入器将被释放,并关闭任何打开的窗口。值得注意的是,该函数引用了一些在其作用域内未定义的变量和辅助函数,这表明它们是整个代码库的一部分。文章来源地址https://www.toymoban.com/news/detail-706031.html

写在最后

论文辅导,代码获取,作业辅助等联系我扣扣1309399183

到了这里,关于表情识别-情感分析-人脸识别(代码+教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用PYTHON编写人脸表情识别系统

    最近闲来无事,和一个学妹完成了一个SRT,主要是关于元宇宙什么的,不过我在其中主要的工作是用python写一个人脸识别系统,发到这里和大家分享一下 注:我利用了几个包,包括opencv,dlib,numpy等,所有包都会显示在代码开头import后 第一步,利用PyCharm先做灰度图 想要识别

    2024年02月08日
    浏览(42)
  • 《论文阅读》用于情感分析的融合预训练表情符号特征增强

    前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小白如何从零读懂论文?和我一起来探索吧! 今天为大家带来的是《Fusion Pre-trained Emoji Feature Enhancement for Sentiment Analysis》 出版:2023 Association for Computing Machiner

    2024年02月09日
    浏览(41)
  • 基于OpenCV+Keras+tensorflow 实现的变电站作业管控平台源代码。含人脸识别考勤,移动目标跟踪,越线检测,安全措施检测,姿态识别等功能

    #综述 使用该作业现场安全生产智能管控平台来实现变电站的安全生产的智能化管理,通过人脸识别功能进行人员的考勤; 通过人员、车辆的检测和识别来实现变电站的智能化管理;通过安全行为识别和安全区域报警功能来实现对变电站内人员和设备安全的监督; 完整代码下

    2024年02月10日
    浏览(33)
  • 毕业设计-基于深度学习的人脸表情识别

    目录 前言 课题背景和意义 实现技术思路 一、深度学习理论基础  二、AdaBoost 结合 SVM 算法表情识别  三、基于 MTCNN 算法的人脸表情识别 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计

    2024年02月01日
    浏览(39)
  • 【face-api.js】前端实现,人脸捕获、表情识别、年龄性别识别、人脸比对、视频人脸追踪、摄像头人物识别

    官网看下简介,在线预览看下效果 官方的github文件拷下来 npm i face-api.js 把模型文件拷进你的项目 主要是在图片或视频元素上,盖一个相同大小的canvas 先是录入一些图片的描述信息,然后比较描述信息,判断人脸的相似度 人脸检测器有两种, SSD 和 Tiny 两种,SSD较大,Tiny用

    2024年02月11日
    浏览(41)
  • 基于深度学习的人脸表情识别 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 面部表情识别技术源于1971年心理学家Ekman和Friesen的一项研究,他们提出人类主要有

    2024年02月06日
    浏览(46)
  • MATLAB【数字图像处理】 大作业:人脸表情识别

    运用已掌握的知识以及查阅相关资料,设计方案能够识别人脸表情中的高兴、厌恶、生气、悲伤、面无表情这五类表情。 本系统是基于PCA算法的人脸特征提取。运用PCA算法来实现人脸特征提取,然后通过计算欧式距离来判别待识别测试人脸。 整个系统的流程是首先是人面部

    2024年02月06日
    浏览(27)
  • 深度学习之基于Tensorflow人脸面部表情识别系统

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。   基于Tensorflow的人脸面部表情识别系统是一种基于深度学习技术的图像处理应用,该系统主要通过人脸图像数据进行面部表情识别,并且识别准确度较高,其设计过程如下: 数据获取和处理

    2024年02月05日
    浏览(42)
  • 计算机竞赛 基于深度学习的人脸表情识别

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 面部表情识别技术源于1971年心理学家Ekman和Friesen的一项研究,他们提出人类主要有

    2024年02月10日
    浏览(50)
  • 使用OpenCV实现人脸特征点检测与实时表情识别

    引言:         本文介绍了如何利用 OpenCV 库实现人脸特征点检测,并进一步实现实时表情识别的案例。首先,通过 OpenCV 的Dlib库进行人脸特征点的定位,然后基于特征点的变化来识别不同的表情。这种方法不仅准确度高,而且实时性好,可以广泛应用于人脸表情分析、人

    2024年04月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包