【机器学习实战入门项目】使用深度学习创建您自己的表情符号

news2025/1/19 14:28:02

在这里插入图片描述

深度学习项目入门——让你更接近数据科学的梦想

表情符号或头像是表示非语言暗示的方式。这些暗示已成为在线聊天、产品评论、品牌情感等的重要组成部分。这也促使数据科学领域越来越多的研究致力于表情驱动的故事讲述。

随着计算机视觉和深度学习的进步,现在可以从图像中检测人类情感。在这个深度学习项目中,我们将对人类面部表情进行分类,并过滤和映射相应的表情符号或头像。

关于数据集

面部表情识别数据集(FER2013)包含48*48像素的灰度人脸图像。这些图像中心对齐,并且占据相同的空间。该数据集包含以下类别的面部情绪:

  • 0: 愤怒
  • 1: 厌恶
  • 2: 恐惧
  • 3: 快乐
  • 4: 悲伤
  • 5: 惊讶
  • 6: 自然

下载项目代码 数据集: 链接: 使用深度学习创建您自己的表情符号 源代码与数据集

使用深度学习创建你的表情

在这里插入图片描述

我们将构建一个深度学习模型来分类图像中的面部表情,然后将分类的情绪映射到表情符号或头像。

使用CNN进行面部情绪识别

在以下步骤中,我们将构建一个卷积神经网络架构,并在FER2013数据集上训练模型,以从图像中识别情绪。

  1. 导入库:

    import numpy as np
    import cv2
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Flatten
    from keras.layers import Conv2D
    from keras.optimizers import Adam
    from keras.layers import MaxPooling2D
    from keras.preprocessing.image import ImageDataGenerator
    
  2. 初始化训练和验证生成器:

    train_dir = 'data/train'
    val_dir = 'data/test'
    train_datagen = ImageDataGenerator(rescale=1./255)
    val_datagen = ImageDataGenerator(rescale=1./255)
    train_generator = train_datagen.flow_from_directory(
            train_dir,
            target_size=(48,48),
            batch_size=64,
            color_mode="grayscale",
            class_mode='categorical')
    validation_generator = val_datagen.flow_from_directory(
            val_dir,
            target_size=(48,48),
            batch_size=64,
            color_mode="grayscale",
            class_mode='categorical')
    
  3. 构建卷积网络架构:

    emotion_model = Sequential()
    emotion_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1)))
    emotion_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
    emotion_model.add(Dropout(0.25))
    emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
    emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
    emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
    emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
    emotion_model.add(Dropout(0.25))
    emotion_model.add(Flatten())
    emotion_model.add(Dense(1024, activation='relu'))
    emotion_model.add(Dropout(0.5))
    emotion_model.add(Dense(7, activation='softmax'))
    
  4. 编译和训练模型:

    emotion_model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001, decay=1e-6), metrics=['accuracy'])
    emotion_model_info = emotion_model.fit_generator(
            train_generator,
            steps_per_epoch=28709 // 64,
            epochs=50,
            validation_data=validation_generator,
            validation_steps=7178 // 64)
    
  5. 保存模型权重:

    emotion_model.save_weights('model.h5')
    
  6. 使用OpenCV的haarcascade xml检测网络摄像头中人脸的边界框,并预测情绪:

    cv2.ocl.setUseOpenCL(False)
    emotion_dict = {0: "Angry", 1: "Disgusted", 2: "Fearful", 3: "Happy", 4: "Neutral", 5: "Sad", 6: "Surprised"}
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        bounding_box = cv2.CascadeClassifier('/home/shivam/.local/lib/python3.6/site-packages/cv2/data/haarcascade_frontalface_default.xml')
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        num_faces = bounding_box.detectMultiScale(gray_frame, scaleFactor=1.3, minNeighbors=5)
        for (x, y, w, h) in num_faces:
            cv2.rectangle(frame, (x, y-50), (x+w, y+h+10), (255, 0, 0), 2)
            roi_gray_frame = gray_frame[y:y + h, x:x + w]
            cropped_img = np.expand_dims(np.expand_dims(cv2.resize(roi_gray_frame, (48, 48)), -1), 0)
            emotion_prediction = emotion_model.predict(cropped_img)
            maxindex = int(np.argmax(emotion_prediction))
            cv2.putText(frame, emotion_dict[maxindex], (x+20, y-60), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
        cv2.imshow('Video', cv2.resize(frame, (1200,860), interpolation=cv2.INTER_CUBIC))
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
    

GUI和表情符号映射的代码

创建一个名为emojis的文件夹,并保存数据集中每种情绪对应的表情符号。

将以下代码粘贴到gui.py中并运行文件。

import tkinter as tk
from tkinter import *
import cv2
from PIL import Image, ImageTk
import os
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D
from keras.optimizers import Adam
from keras.layers import MaxPooling2D

emotion_model = Sequential()
emotion_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1)))
emotion_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Dropout(0.25))
emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Dropout(0.25))
emotion_model.add(Flatten())
emotion_model.add(Dense(1024, activation='relu'))
emotion_model.add(Dropout(0.5))
emotion_model.add(Dense(7, activation='softmax'))
emotion_model.load_weights('model.h5')

cv2.ocl.setUseOpenCL(False)
emotion_dict = {0: "   Angry   ", 1: "Disgusted", 2: "  Fearful  ", 3: "   Happy   ", 4: "  Neutral  ", 5: "    Sad    ", 6: "Surprised"}
emoji_dist={0:"./emojis/angry.png", 1:"./emojis/disgusted.png", 2:"./emojis/fearful.png", 3:"./emojis/happy.png", 4:"./emojis/neutral.png", 5:"./emojis/sad.png", 6:"./emojis/surprised.png"}

global last_frame1
last_frame1 = np.zeros((480, 640, 3), dtype=np.uint8)
global cap1
show_text=[0]

def show_vid():
    cap1 = cv2.VideoCapture(0)
    if not cap1.isOpened():
        print("cant open the camera1")
    flag1, frame1 = cap1.read()
    frame1 = cv2.resize(frame1, (600,500))
    bounding_box = cv2.CascadeClassifier('/home/shivam/.local/lib/python3.6/site-packages/cv2/data/haarcascade_frontalface_default.xml')
    gray_frame = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    num_faces = bounding_box.detectMultiScale(gray_frame, scaleFactor=1.3, minNeighbors=5)
    for (x, y, w, h) in num_faces:
        cv2.rectangle(frame1, (x, y-50), (x+w, y+h+10), (255, 0, 0), 2)
        roi_gray_frame = gray_frame[y:y + h, x:x + w]
        cropped_img = np.expand_dims(np.expand_dims(cv2.resize(roi_gray_frame, (48, 48)), -1), 0)
        prediction = emotion_model.predict(cropped_img)
        maxindex = int(np.argmax(prediction))
        cv2.putText(frame1, emotion_dict[maxindex], (x+20, y-60), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
        show_text[0]=maxindex
    if flag1 is None:
        print("Major error!")
    elif flag1:
        global last_frame1
        last_frame1 = frame1.copy()
        pic = cv2.cvtColor(last_frame1, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(pic)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        lmain.after(10, show_vid)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        exit()

def show_vid2():
    frame2 = cv2.imread(emoji_dist[show_text[0]])
    pic2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2RGB)
    img2 = Image.fromarray(pic2)
    imgtk2 = ImageTk.PhotoImage(image=img2)
    lmain2.imgtk2 = imgtk2
    lmain3.configure(text=emotion_dict[show_text[0]], font=('arial',45,'bold'))
    lmain2.configure(image=imgtk2)
    lmain2.after(10, show_vid2)

if __name__ == '__main__':
    root = tk.Tk()
    img = ImageTk.PhotoImage(Image.open("logo.png"))
    heading = Label(root, image=img, bg='black')
    heading.pack()
    heading2 = Label(root, text="Photo to Emoji", pady=20, font=('arial',45,'bold'), bg='black', fg='#CDCDCD')
    heading2.pack()
    lmain = tk.Label(master=root, padx=50, bd=10)
    lmain2 = tk.Label(master=root, bd=10)
    lmain3 = tk.Label(master=root, bd=10, fg="#CDCDCD", bg='black')
    lmain.pack(side=LEFT)
    lmain.place(x=50,y=250)
    lmain3.pack()
    lmain3.place(x=960,y=250)
    lmain2.pack(side=RIGHT)
    lmain2.place(x=900,y=350)
    root.title("Photo To Emoji")
    root.geometry("1400x900+100+10")
    root['bg']='black'
    exitbutton = Button(root, text='Quit', fg="red", command=root.destroy, font=('arial',25,'bold')).pack(side = BOTTOM)
    show_vid()
    show_vid2()
    root.mainloop()

总结

在这个面向初学者的深度学习项目中,我们构建了一个卷积神经网络来识别面部情绪。我们在FER2013数据集上训练了我们的模型,然后将这些情绪映射到相应的情绪符号或头像。

使用OpenCV的haar cascade xml,我们获得了网络摄像头中人脸的边界框,然后将这些框输入到训练好的模型中进行分类。

DataFlair致力于为用户提供成为数据科学家所需的所有资源,包括详细的教程、实践、用例以及项目源代码。


参考资料

参考资料名称链接
FER2013数据集Kaggle FER2013 Dataset
Keras官方文档Keras Official Documentation
OpenCV官方文档OpenCV Official Documentation
TensorFlow官方文档TensorFlow Official Documentation
数据科学教程DataFlair Data Science Tutorials
深度学习项目DataFlair Deep Learning Projects
图像分类教程Image Classification Tutorial
CNN架构详解CNN Architecture Explained
数据增强技术Data Augmentation Techniques
GUI编程指南GUI Programming Guide
表情符号使用指南Emoji Usage Guide
情感分析研究Emotion Recognition Research
深度学习框架比较Deep Learning Framework Comparison
计算机视觉应用Computer Vision Applications

本项目数据集合介绍:
数据介绍:

FER-2013

从图像中学习面部表情

概述
FER-2013(Facial Expression Recognition 2013)是一个用于面部表情识别的经典数据集,旨在通过图像数据训练模型,使其能够识别人类面部表情所表达的情感。该数据集广泛应用于计算机视觉和情感分析领域,特别是在深度学习模型的训练和评估中。

数据集特点

  1. 图像格式

    • 图像为48x48像素的灰度图像,每个像素的灰度值范围为0到255。
    • 图像已经过预处理,确保面部居中并占据图像的主要部分。
  2. 情感类别

    • 数据集将面部表情分为七种情感类别:
      0 = 愤怒(Angry)
      1 = 厌恶(Disgust)
      2 = 恐惧(Fear)
      3 = 快乐(Happy)
      4 = 悲伤(Sad)
      5 = 惊讶(Surprise)
      6 = 中性(Neutral)
      在这里插入图片描述
  3. 数据集规模

    • 训练集:28,709张图像 在这里插入图片描述
    • 测试集:3,589张图像
      在这里插入图片描述

任务目标

  • 训练一个模型,使其能够根据输入的面部图像,准确分类出对应的情感类别。
  • 该任务属于多分类问题,适合使用深度学习模型(如卷积神经网络)来解决。

技术实现

  1. 数据预处理

    • 将图像像素值归一化到[0, 1]范围,以加速模型训练。
    • 可以使用数据增强技术(如旋转、翻转、缩放等)来增加数据多样性,提升模型的泛化能力。
  2. 模型选择

    • 卷积神经网络(CNN):由于图像数据的特点,CNN是最常用的模型架构。可以设计一个简单的CNN模型,或者使用预训练模型(如VGG、ResNet)进行迁移学习。
    • 其他模型:如果计算资源有限,可以尝试使用传统机器学习方法(如SVM、随机森林),但性能可能不如深度学习模型。
  3. 模型训练

    • 使用训练集(28,709张图像)进行模型训练。
    • 通过交叉验证或验证集调整超参数,防止过拟合。
  4. 模型评估

    • 使用测试集(3,589张图像)评估模型性能。
    • 主要评估指标包括准确率、混淆矩阵和F1分数。
    • 特别关注模型在少数类别(如“厌恶”)上的表现,避免类别不平衡问题。
  5. 优化与改进

    • 如果模型表现不佳,可以尝试以下方法:
      • 增加数据增强的多样性。
      • 调整模型架构(如增加卷积层或全连接层)。
      • 使用正则化技术(如Dropout、L2正则化)防止过拟合。
      • 对少数类别进行过采样或调整损失函数权重。

应用场景

  1. 情感分析
    • 用于分析用户的情感状态,例如在社交媒体、客户反馈或视频会议中识别用户的情感。
  2. 人机交互
    • 改进智能助手、机器人等系统的交互体验,使其能够更好地理解用户的情感。
  3. 心理健康
    • 用于心理健康监测,帮助识别用户的情感波动或潜在的心理问题。

总结
FER-2013数据集为面部表情识别任务提供了一个标准化的基准,适合用于训练和评估深度学习模型。通过合理的数据预处理、模型设计和优化,可以开发出高性能的情感识别系统,广泛应用于情感分析、人机交互和心理健康等领域。

源代码介绍:
使用深度学习创建表情符号——创建您自己的表情符号的项目
学习如何创建一个用于表情符号创建的深度学习模型。我们将实时分析视频流以捕捉面部并识别表情。然后,我们将对表情进行分类并将其映射到相应的头像。

在这个项目中,我们将构建一个卷积神经网络架构,并在FER2013数据集上训练模型,以实现从图像中进行情感识别。

深度学习是人工智能(AI)中机器学习的一个子集,其网络能够从非结构化或未标记的数据中进行无监督学习。您是否想掌握深度学习?快来尝试这些令人惊叹的深度学习项目吧!

类别:深度学习、机器学习、人工智能
编程语言:Python
工具与库:OpenCV haarcascade
IDE:Google Colab
前端:无
后端:Python
先决条件:Python、深度学习、机器学习
目标受众:教育、开发人员、数据科学家、AI专业人士

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2278952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows 搭建flutter环境,开发windows程序

环境安装配置: 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后,随便找个地方解压,然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了&#xff0…

【Linux】15.Linux进程概念(4)

文章目录 程序地址空间前景回顾C语言空间布局图:代码1代码2代码3代码4代码5代码6代码7 程序地址空间前景回顾 历史核心问题: pid_t id fork(); if(id 0) else if(id>0) 为什么一个id可以放两个值呢?之前没有仔细讲。 C语言空间布局图&am…

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡,全称主机总线适配器(Host Bus Adapter) ,是服务器与存储装置间的关键纽带,承担着输入 / 输出(I/O)处理及物理连接的重任。作为一种电路板或集成电路适配器,HBA…

oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法

问题概述 使用oracle的case when函数时,报错提示ORA-12704字符集不匹配,如下图,接下来分析报错原因并提出解决方法。 样例演示 现在有一个TESTTABLE表,本表包含的字段如下图所示,COL01字段是NVARCHAR2类型&#xff0…

Linux-----线程同步(条件变量)

目录 相关API restrict关键字 线程间条件切换函数 条件变量pthread_cond_t 案例 在前面的锁的基础上进一步提高线程同步效率,也就是两个线程只用锁去执行的话依然会存在资源竞争的情况,也就是抢锁,这里就需要在锁的这边加上限制&#xf…

每日进步一点点(网安)

今日练习题目是PHP反序列化,也学习一下说明是序列化和反序列化 1.PHP序列化 序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式,以便在不同系统和应用程序之间进行传输或存储 在PHP中&…

Java-数据结构-二叉树习题(1)

对于二叉树的学习,主要的还是得多多练习~毕竟二叉树属于新的知识,并且也并不是线性结构,再加上经常使用递归的方法解决二叉树的问题,所以代码的具体流程还是无法看到的,只能通过画图想象,所以还是必须多加练…

(二)afsim第三方库编译(qt编译)

注意:源码编译的路径不能有中文否则报错,压缩包必须用官网下载的xz格式解压的才可以,否则sudo ./configure命令找不到 先编译openssl3.1.1软件包,否则编译的qt库将不支持network,相关库的编译(上文(一&…

【QT用户登录与界面跳转】

【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中,实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

搜维尔科技:Xsens人形机器人解决方案的优势

Xsens 致力于推动人形机器人技术的发展,塑造机器人与人类环境无缝融合的未来,通过创新精确和协作,协助生产和服务,改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据,使机器人能够学习类人的动作&#x…

国内微电子(集成电路)领域重点高校的特色与优势

本文旨在梳理国内微电子(集成电路)领域重点高校的特色与优势,为有志于从事相关领域的学生提供参考。文章将从学科特色、科研实力(以ISSCC论文为参考之一)、行业认可度等方面进行分析,并强调实验室、导师、研…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答,这样的好处是,不管是头节点还是中间的节点都可以当成是中间节点来处理,用同一套方法就可以进行处理,而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

数据结构-栈队列OJ题

文章目录 一、有效的括号二、用队列实现栈三、用栈实现队列四、设计循环队列 一、有效的括号 (链接:ValidParentheses) 这道题用栈这种数据结构解决最好,因为栈有后进先出的性质。简单分析一下这道题:所给字符串不是空的也就是一定至少存在一…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确,因为叠加平均有不同的计算方法,一种是直接将每个通道的5分钟实时长单独进行叠加平均,另一种是将通道划分为1分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器,集成了先进的 AI 技术,旨在提升编程效率。以下是其主要特点和功能&a…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一,它的作用是为电脑的各个部件提供冷却,防止电脑过热。然而,有时候我们会发现电脑风扇的声音特别大,不仅影响我们的使用体验,也可能是电脑出现了一些问题。那么,电脑风扇声音大…

SpringBoot错误码国际化

先看测试效果: 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介:网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介:系统分…