人脸表情识别 (3) 环境配置+模型训练代码

近来大家对这个项目比较关注,也有好些人催我继续更新这个系列,因为博主前段时间一直在准备推免的事情,后来也一直在刷题,所以真的没有时间写,现在趁着这个暑假的小尾巴,更新一波,能写到哪里也不一定,但是我会确保每一步都不会让你走弯路的,也谢谢大家的支持喽。

上一篇写到数据增强,数据增强应该算是数据预处理的一部分,而数据预处理对于模型的训练的重要性,相必大家也都清楚,从我自己的经验来说,进行完数据增强之后可以提高比较大的识别率,特别是那些训练样本数量较少的类别,提升更加明显。做好数据增强,就可以训练模型了,当然前提是已经配置好了运行的环境。

配置这个运行的环境真的不容易,最好是装双系统或者就在Ubuntu系统上运行,千万千万别想用虚拟机,太慢了,我给大家列一个环境的清单吧,大家自己配置一下,或者可以使用我在这个系列第一篇文章中推荐的易学智能GPU云平台,能省很多事,也不算太贵,看需求啦。

如果自己配置的话,清单如下:

安装Ubuntu16.04系统(建议双系统,教程我的博客也有,当然看别人的也行)

在Ubuntu16.04系统上安装python3.6.5环境(好像可以通过安装anaconda3安装?我有点忘了,见谅)

安装tensorflow框架,keras框架,CUDA框架,显卡驱动,opencv框架等等,版本千万要注意!我也不好直接给出版本,因为这个和你本机的硬件有关,尤其这个CUDA框架,用于调用GPU进行并行计算的,如果没有使用GPU进行计算,那效率真的会低得可怜的。

博主我配置这个环境配了两天左右呢,大家也要多点耐心呀,哈哈哈哈哈哈。

别希望能使用CPU跑!你等不到结果出来的那一天的。为了说服各位,我特意试了试在windows下的效率,每个epoch四分多钟,要训练40个epoch,具体多久我就不去算了哈。

代码如下:

from keras.preprocessing import image
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import BatchNormalization
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import regularizers
import matplotlib.pyplot as plt
import os,shutil
from matplotlib import pyplot as plt
from keras.models import load_model
import numpy as np

train_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\train'
val_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\val'
test_dir=r'E:\BaiduNetdiskDownload\fer2013\fer2013_dataAug\test'

train_datagen=ImageDataGenerator()
test_datagen=ImageDataGenerator()

train_generator=train_datagen.flow_from_directory(
    train_dir,
    target_size=(48,48),
    batch_size=128,
    class_mode='categorical'
)
validation_generator=test_datagen.flow_from_directory(
    val_dir,
    target_size=(48,48),
    batch_size=128,
    class_mode='categorical'
)

test_generator=test_datagen.flow_from_directory(
    test_dir,
    target_size=(48,48),
    batch_size=128,
    class_mode='categorical'
)

#kernel_regularizer=regularizers.l2(0.01),
model = Sequential()
model.add(Conv2D(64, kernel_size=(5, 5), strides=(1, 1),
                 activation='relu',
                 padding='same',input_shape=(48,48,3)))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.4))
model.add(Conv2D(128, kernel_size=(5, 5), strides=(1, 1),
                 activation='relu',
                 padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.4))
model.add(Conv2D(256, kernel_size=(5, 5), strides=(1, 1),
                 padding='same',
                 activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Flatten())
model.add(Dropout(0.3))
model.add(Dense(2048, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(512, activation='relu'))
model.add(Dense(7, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.rmsprop(lr=0.0001),  #need to train a lot of epochs
              metrics=['accuracy'])

history=model.fit_generator(
    train_generator,
    steps_per_epoch=650,
    epochs=40,
    validation_data=validation_generator,
    validation_steps=32
)

model.save('myModel_DataGenerator_myfile_Three.h5')

acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']

epochs=range(1,len(acc)+1)
plt.figure("acc")
plt.plot(epochs,acc,'r-',label='Training acc')
plt.plot(epochs,val_acc,'b',label='validation acc')
plt.title('The comparision of train_acc and val_acc')
plt.legend()
plt.show()

plt.figure("loss")
plt.plot(epochs,loss,'r-',label='Training loss')
plt.plot(epochs,val_loss,'b',label='validation loss')
plt.title('The comparision of train_loss and val_loss')
plt.legend()
plt.show()

 

train_dir,val_dir,test_dir分别是数据增强后的训练集合数据,验证集数据和测试集数据的文件路径,数据都应该为图片,验证集数据和测试集数据无需数据增强。这个数据集合我有处理完的版本,直接可以拿来使用,有需要的留下邮箱我看到消息会给你发送资源的,请注意查收。压缩包长这样,解压后里边三个文件夹,意思应该也不需要我多解释,train文件夹,val文件夹,test文件夹里边都是有七个子文件夹,按照序号0-6顺序分类,代码会根据图片所属的文件夹自动判定类别的,是keras框架所提供的功能,大家不用深入研究。

训练完模型会对模型进行绘制一个学习曲线和损失函数曲线,同时还会利用keras框架,对当前训练好的模型进行保存,所使用的语句为model.save('myModel_DataGenerator_myfile_Three.h5'),默认在当前脚本的文件夹下,保存好的模型可以在下次使用的时候直接调用,无需再次训练。

 

 

 

  • 19
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
人脸表情识别 2020.8.22,重构了整个仓库代码,改用Tensorflow2中的keras api实现整个系统。考虑到很多反映jupyter notebook写的train使用起来不太方便,这里改成了py脚本实现。 2020.12.18,根据反馈,修改了Jaffe的优化器设置。 简介 使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。 环境部署 基于Python3和Keras2(TensorFlow后端),具体依赖安装如下(推荐使用conda虚拟环境)。 git clone https://github.com/luanshiyinyang/FacialExpressionRecognition.git cd FacialExpressionRecognition conda create -n FER python=3.6 source activate FER conda install cudatoolkit=10.1 conda install cudnn=7.6.5 pip install -r requirements.txt 如果你是Linux用户,直接执行根目录下的env.sh即可一键配置环境,执行命令为bash env.sh。 数据准备 数据集和预训练模型均已经上传到百度网盘,链接给出,提取密码为2pmd。下载后将model.zip移动到根目录下的models文件夹下并解压得到一个*.h5的模型参数文件,将data.zip移动到根目录下的dataset文件夹下并解压得到包含多个数据集压缩文件,均解压即可得到包含图像的数据集(其中rar后缀的为原始jaffe数据集,这里建议使用我处理好的)。 项目说明 传统方法 数据预处理 图片降噪 人脸检测(HAAR分类器检测(opencv)) 特征工程 人脸特征提取 LBP Gabor 分类器 SVM 深度方法 人脸检测 HAAR分类器 MTCNN(效果更好) 卷积神经网络 用于特征提取+分类 网络设计 使用经典的卷积神经网络,模型的构建主要参考2018年CVPR几篇论文以及谷歌的Going Deeper设计如下网络结构,输入层后加入(1,1)卷积层增加非线性表示且模型层次较浅,参数较少(大量参数集中在全连接层)。 模型训练 主要在FER2013、JAFFE、CK+上进行训练,JAFFE给出的是半身图因此做了人脸检测。最后在FER2013上Pub Test和Pri Test均达到67%左右准确率(该数据集爬虫采集存在标签错误、水印、动画图片等问题),JAFFE和CK+5折交叉验证均达到99%左右准确率(这两个数据集为实验室采集,较为准确标准)。 执行下面的命令将在指定的数据集(fer2013或jaffe或ck+)上按照指定的batch_size训练指定的轮次。训练会生成对应的可视化训练过程,下图为在三个数据集上训练过程的共同绘图。 python src/train.py --dataset fer2013 --epochs 300 --batch_size 32 模型应用 与传统方法相比,卷积神经网络表现更好,使用该模型构建识别系统,提供GUI界面和摄像头实时检测(摄像必须保证补光足够)。预测时对一张图片进行水平翻转、偏转15度、平移等增广得到多个概率分布,将这些概率分布加权求和得到最后的概率分布,此时概率最大的作为标签(也就是使用了推理数据增强)。 GUI界面 注意,GUI界面预测只显示最可能是人脸的那个脸表情,但是对所有检测到的人脸都会框定预测结果并在图片上标记,标记后的图片在output目录下。 执行下面的命令即可打开GUI程序,该程序依赖PyQT设计,在一个测试图片(来源于网络)上进行测试效果如下图。 python src/gui.py 上图的GUI反馈的同时,会对图片上每个人脸进行检测并表情识别,处理后如下图。 实时检测 实时检测基于Opencv进行设计,旨在用摄像头对实时视频流进行预测,同时考虑到有些人的反馈,当没有摄像头想通过视频进行测试则修改命令行参数即可。 使用下面的命令会打开摄像头进行实时检测(ESC键退出),若要指定视频进行进行检测,则使用下面的第二个命令。 python src/recognition_camera.py python src/recognition_camera.py --source 1 --video_path 视频绝对路径或者相对于该项目的根目录的相对路径 下图是动态演示的在Youtube上某个视频上的识别结果。
### 回答1: 实时人脸表情识别是一种基于人工智能和计算机视觉的技术,结合Python编程语言进行毕业设计的主题。该项目旨在实现对人脸表情的实时识别和分类,通过分析和判断人脸表情的变化,进而实现情感识别和情感分析。 首先,为了实现实时人脸表情识别,我们需要采集一组包含不同表情的人脸图像数据集。此数据集可以通过网络资源、开源数据集或自己采集得到。接下来,我们使用Python中的图像处理库OpenCV来获取实时视频流,并使用面部检测算法定位和提取视频流中的人脸。 然后,我们需要使用深度学习方法来训练一个人脸表情分类器。可以使用所采集到的人脸图像数据集,使用Python中的深度学习框架如TensorFlow或PyTorch来构建一个卷积神经网络(CNN模型。该模型将接受人脸图像作为输入,经过多个卷积层和池化层进行特征提取,并使用全连接层进行分类预测。 在训练好的模型基础上,我们可以将其应用于实时人脸表情识别。通过将每一帧的人脸图像传入该模型,可以获取到实时的人脸表情分类结果。可以根据分类结果,判断人脸表情是开心、生气、惊讶等不同的情绪。 最后,为了更好地展示实时人脸表情识别的效果,我们可以将识别结果通过图像或视频的方式展示出来,比如将分类结果添加在人脸图像上方,或者在视频中不同表情时变换特定符号或贴图。 总结来说,实时人脸表情识别的毕业设计将采用Python编程语言,结合图像处理库和深度学习框架,通过建立和训练卷积神经网络模型,实现对实时人脸表情的识别和分类,并将识别结果进行展示。该项目对于理解和实践人工智能、计算机视觉和深度学习等相关领域的知识具有重要意义。 ### 回答2: 实时人脸表情识别是一种使用计算机视觉技术来检测和识别人脸表情的方法。而使用Python语言进行实时人脸表情识别的毕业设计,可以通过以下步骤来完成: 1. 数据集准备:首先需要准备一个包含多种表情的人脸图像数据集。可以使用公开的人脸表情数据集,如FER2013、CK+等,或者自己构建数据集。 2. 数据预处理:对数据集进行预处理,包括将图像进行裁剪和缩放,使其符合模型输入的要求。还可以使用数据增强技术来扩充数据集,以提高模型的泛化能力。 3. 特征提取:利用深度学习模型,如卷积神经网络(CNN),来提取人脸图像的特征。可以使用已经预训练好的CNN模型,如VGGNet、ResNet等,也可以根据具体需求自己搭建模型。 4. 模型训练:使用提取到的特征作为输入,利用训练集进行模型训练。可以使用Python的深度学习库,如TensorflowKeras等,来搭建和训练模型。在训练过程中,可以使用交叉验证等技术来评估模型的性能。 5. 模型验证:使用测试集对训练好的模型进行验证,评估其在实时人脸表情识别任务上的性能。可以计算模型的准确率、召回率等评价指标,或者通过混淆矩阵来分析不同表情类别的识别结果。 6. 实时表情识别:将训练好的模型应用到实时视频流中,进行人脸表情的实时识别。可以使用Python的图像处理和视频处理库来实现这一步骤,如OpenCV、Dlib等。通过实时检测人脸区域,并对每个人脸区域进行表情分类。 7. 界面设计和优化:将实时人脸表情识别算法与用户界面结合,可以使用Python的GUI库,如Tkinter等,设计一个友好的界面,使用户可以方便地进行实时人脸表情的测试和观察。 通过以上步骤的实现,我们可以完成一个基于Python的实时人脸表情识别系统。该系统可以用于情感分析、人机交互等领域,具有一定的实际应用价值。 ### 回答3: 实时人脸表情识别是一种通过使用Python编程语言开发的技术,用于实时检测和识别人脸表情。它可以分析人脸上的特征,并根据这些特征识别出人脸表情的种类,例如开心、悲伤、惊讶等。 实时人脸表情识别的毕业设计主要包括以下几个步骤: 1. 数据集准备:首先,需要准备一份包含人脸表情样本的数据集。可以通过收集照片、视频或者使用现有的数据集来构建。 2. 数据预处理:对数据进行预处理是非常重要的一步。可以使用Python图像处理库如OpenCV对图像进行裁剪、缩放和灰度化等处理,以提升后续的算法准确度。 3. 特征提取:接下来,使用Python中常用的机器学习库,如Scikit-learn或Tensorflow等,进行特征提取。可以使用基于人脸的特征提取算法,例如局部二值模式(Local Binary Patterns,LBP)或主成分分析(Principal Component Analysis,PCA),来提取人脸表情的特征。 4. 训练模型:使用已经提取的特征,建立分类器模型。可以使用各种机器学习算法,例如支持向量机(Support Vector Machine,SVM)或卷积神经网络(Convolutional Neural Network,CNN),对数据集进行训练,以使模型能够准确地识别人脸表情。 5. 实时检测和识别:最后,使用摄像头采集实时视频流,并对每一帧图像进行处理和分析,以实现人脸表情的实时检测和识别。可以使用Python库如Dlib或OpenCV中的人脸检测器和分类器,对视频流中的人脸进行定位和分类。 总结来说,实时人脸表情识别的毕业设计将通过预处理、特征提取、模型训练和实时检测等步骤,利用Python编程语言实现对人脸表情的实时检测和识别。这项技术可以应用于许多领域,例如情感分析、人机交互等,具有广泛的应用前景。
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值