自己建网站写小说可行吗,网站开发集成软件,网站开发后台需要自己写吗,免费制作开业宣传视频人脸表情识别系统
1. 前言 在这个人工智能成为超级大热门的时代#xff0c;人脸表情识别已成为其中的一项研究热点#xff0c;而卷积神经网络、深度信念网络和多层感知器等相关算法在人脸面部表情识别领域的运用最为广泛。面部的表情中包含了太多的信息#xff0c;轻微的表…人脸表情识别系统
1. 前言 在这个人工智能成为超级大热门的时代人脸表情识别已成为其中的一项研究热点而卷积神经网络、深度信念网络和多层感知器等相关算法在人脸面部表情识别领域的运用最为广泛。面部的表情中包含了太多的信息轻微的表情变化都会反映出人心理的变化可想而知如果机器能敏锐地识别人脸中表达的情感该是多么令人兴奋的事。 学习和研究了挺久的深度学习偶然看到IEEE上面一篇质量很高的文章里面介绍的是利用深度神经网络实现的面部表情识别研读下来让我深受启发。于是自己动手做了这个项目如今SCI论文已投稿这里特此将前期工作作个总结希望能给类似工作的朋友带来一点帮助。由于论文尚未公开这里使用的是已有的模型——如今CNN的主流框架之mini_XCEPTION该模型性能也已是不错的了论文中改进的更高性能模型尚不便给出后面会分享给大家敬请关注。 2. 表情识别数据集 目前现有的公开的人脸表情数据集比较少并且数量级比较小。比较有名的广泛用于人脸表情识别系统的数据集Extended Cohn-Kanada (CK)是由P.Lucy收集的。CK数据集包含123 个对象的327 个被标记的表情图片序列共分为正常、生气、蔑视、厌恶、恐惧、开心和伤心七种表情。对于每一个图片序列只有最后一帧被提供了表情标签所以共有327 个图像被标记。为了增加数据我们把每个视频序列的最后三帧图像作为训练样本。这样CK数据总共被标记的有981 张图片。这个数据库是人脸表情识别中比较流行的一个数据库很多文章都会用到这个数据做测试可通过下面的链接下载。 官网链接The Extended Cohn-Kanade Dataset(CK) 网盘链接百度网盘下载提取码8r15 Kaggle是Kaggle人脸表情分析比赛提供的一个数据集。该数据集含28709 张训练样本3859 张验证数据集和3859 张测试样本共35887 张包含生气、厌恶、恐惧、高兴、悲伤、惊讶和正常七种类别的图像图像分辨率为48×48。该数据集中的图像大都在平面和非平面上有旋转并且很多图像都有手、头发和围巾等的遮挡物的遮挡。该数据库是2013年Kaggle比赛的数据由于这个数据库大多是从网络爬虫下载的存在一定的误差性。这个数据库的人为准确率是65%±5%。 官网链接FER2013 网盘链接百度网盘下载提取码t7xj 由于FER2013数据集数据更加齐全同时更加符合实际生活的场景所以这里主要选取FER2013训练和测试模型。为了防止网络过快地过拟合可以人为的做一些图像变换例如翻转旋转切割等。上述操作称为数据增强。数据操作还有另一大好处是扩大数据库的数据量使得训练的网络鲁棒性更强。下载数据集保存在fer2013的文件夹下为了对数据集进行处理采用如下代码载入和进行图片预处理
import pandas as pd
import cv2
import numpy as npdataset_path fer2013/fer2013/fer2013.csv # 文件保存位置
image_size(48,48) # 图片大小# 载入数据
def load_fer2013():data pd.read_csv(dataset_path)pixels data[pixels].tolist()width, height 48, 48faces []for pixel_sequence in pixels:face [int(pixel) for pixel in pixel_sequence.split( )]face np.asarray(face).reshape(width, height)face cv2.resize(face.astype(uint8),image_size)faces.append(face.astype(float32))faces np.asarray(faces)faces np.expand_dims(faces, -1)emotions pd.get_dummies(data[emotion]).as_matrix()return faces, emotions# 将数据归一化
def preprocess_input(x, v2True):x x.astype(float32)x x / 255.0if v2:x x - 0.5x x * 2.0return x载入数据后将数据集划分为训练集和测试集在程序中调用上面的函数代码如下
from load_and_process import load_fer2013
from load_and_process import preprocess_input
from sklearn.model_selection import train_test_split# 载入数据集
faces, emotions load_fer2013()
faces preprocess_input(faces)
num_samples, num_classes emotions.shape# 划分训练、测试集
xtrain, xtest,ytrain,ytest train_test_split(faces, emotions,test_size0.2,shuffleTrue)3. 搭建表情识别的模型 接下来就是搭建表情识别的模型了这里用到的是CNN的主流框架之mini_XCEPTION。XCEPTION是Google继Inception后提出的对Inception v3的另一种改进主要是采用深度可分离的卷积depthwise separable convolution来替换原来Inception v3中的卷积操作。XCEPTION的网络结构在ImageNet数据集Inception v3的设计解决目标上略优于Inception v3并且在包含3.5亿个图像甚至更大的图像分类数据集上明显优于Inception v3而两个结构保持了相同数目的参数性能增益来自于更加有效地使用模型参数详细可参考论文Xception: Deep Learning with Depthwise Separable Convolutions论文Real-time Convolutional Neural Networks for Emotion and Gender Classification等。 既然这样的网络能获得更好结果又是主流那当然有必要作为对比算法实现以下了这里博主模型这部分的代码引用了GitHub:https://github.com/oarriaga/face_classification中的模型其他地方也能找到这个模型的类似代码模型框图如上图所示其代码如下
def mini_XCEPTION(input_shape, num_classes, l2_regularization0.01):regularization l2(l2_regularization)# baseimg_input Input(input_shape)x Conv2D(8, (3, 3), strides(1, 1), kernel_regularizerregularization,use_biasFalse)(img_input)x BatchNormalization()(x)x Activation(relu)(x)x Conv2D(8, (3, 3), strides(1, 1), kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x Activation(relu)(x)# module 1residual Conv2D(16, (1, 1), strides(2, 2),paddingsame, use_biasFalse)(x)residual BatchNormalization()(residual)x SeparableConv2D(16, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x Activation(relu)(x)x SeparableConv2D(16, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x MaxPooling2D((3, 3), strides(2, 2), paddingsame)(x)x layers.add([x, residual])# module 2residual Conv2D(32, (1, 1), strides(2, 2),paddingsame, use_biasFalse)(x)residual BatchNormalization()(residual)x SeparableConv2D(32, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x Activation(relu)(x)x SeparableConv2D(32, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x MaxPooling2D((3, 3), strides(2, 2), paddingsame)(x)x layers.add([x, residual])# module 3residual Conv2D(64, (1, 1), strides(2, 2),paddingsame, use_biasFalse)(x)residual BatchNormalization()(residual)x SeparableConv2D(64, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x Activation(relu)(x)x SeparableConv2D(64, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x MaxPooling2D((3, 3), strides(2, 2), paddingsame)(x)x layers.add([x, residual])# module 4residual Conv2D(128, (1, 1), strides(2, 2),paddingsame, use_biasFalse)(x)residual BatchNormalization()(residual)x SeparableConv2D(128, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x Activation(relu)(x)x SeparableConv2D(128, (3, 3), paddingsame,kernel_regularizerregularization,use_biasFalse)(x)x BatchNormalization()(x)x MaxPooling2D((3, 3), strides(2, 2), paddingsame)(x)x layers.add([x, residual])x Conv2D(num_classes, (3, 3),#kernel_regularizerregularization,paddingsame)(x)x GlobalAveragePooling2D()(x)output Activation(softmax,namepredictions)(x)model Model(img_input, output)return model4. 数据增强的批量训练 神经网络的训练需要大量的数据数据的量决定了网络模型可以达到的高度网络模型尽量地逼近这个高度。然而对于人脸表情的数据来说都只存在少量的数据Extended Cohn-Kanada (CK)的数据量是远远不够的并且CK多是比较夸张的数据。Kaggle Fer2013数据集也不过只有3万多数据量而且有很多遮挡、角度等外界影响因素。既然收集数据要花费很大的人力物力那么我们就用技术解决这个问题为避免重复开发首先还是看看有没有写好的库。博主又通读了遍Keras官方文档其中ImageDataGenerator的图片生成器就可完成这一目标。 为了尽量利用我们有限的训练数据我们将通过一系列随机变换堆数据进行提升这样我们的模型将看不到任何两张完全相同的图片这有利于我们抑制过拟合使得模型的泛化能力更好。在Keras中这个步骤可以通过keras.preprocessing.image.ImageGenerator来实现这个类使你可以在训练过程中设置要施行的随机变换通过.flow或.flow_from_directory(directory)方法实例化一个针对图像batch的生成器这些生成器可以被用作keras模型相关方法的输入如fit_generatorevaluate_generator和predict_generator。——Keras官方文档 ImageDataGenerator()是一个图片生成器同时也可以在batch中对数据进行增强扩充数据集大小比如进行旋转变形归一化等增强模型的泛化能力。结合前面的模型和数据训练部分的代码如下 Description: 训练人脸表情识别程序
from keras.callbacks import CSVLogger, ModelCheckpoint, EarlyStopping
from keras.callbacks import ReduceLROnPlateau
from keras.preprocessing.image import ImageDataGenerator
from load_and_process import load_fer2013
from load_and_process import preprocess_input
from models.cnn import mini_XCEPTION
from sklearn.model_selection import train_test_split# 参数
batch_size 32
num_epochs 10000
input_shape (48, 48, 1)
validation_split .2
verbose 1
num_classes 7
patience 50
base_path models/# 构建模型
model mini_XCEPTION(input_shape, num_classes)
model.compile(optimizeradam, # 优化器采用adamlosscategorical_crossentropy, # 多分类的对数损失函数metrics[accuracy])
model.summary()# 定义回调函数 Callbacks 用于训练过程
log_file_path base_path _emotion_training.log
csv_logger CSVLogger(log_file_path, appendFalse)
early_stop EarlyStopping(val_loss, patiencepatience)
reduce_lr ReduceLROnPlateau(val_loss, factor0.1,patienceint(patience/4),verbose1)
# 模型位置及命名
trained_models_path base_path _mini_XCEPTION
model_names trained_models_path .{epoch:02d}-{val_acc:.2f}.hdf5# 定义模型权重位置、命名等
model_checkpoint ModelCheckpoint(model_names,val_loss, verbose1,save_best_onlyTrue)
callbacks [model_checkpoint, csv_logger, early_stop, reduce_lr]# 载入数据集
faces, emotions load_fer2013()
faces preprocess_input(faces)
num_samples, num_classes emotions.shape# 划分训练、测试集
xtrain, xtest,ytrain,ytest train_test_split(faces, emotions,test_size0.2,shuffleTrue)# 图片产生器在批量中对数据进行增强扩充数据集大小
data_generator ImageDataGenerator(featurewise_centerFalse,featurewise_std_normalizationFalse,rotation_range10,width_shift_range0.1,height_shift_range0.1,zoom_range.1,horizontal_flipTrue)# 利用数据增强进行训练
model.fit_generator(data_generator.flow(xtrain, ytrain, batch_size),steps_per_epochlen(xtrain) / batch_size,epochsnum_epochs,verbose1, callbackscallbacks,validation_data(xtest,ytest))5. 系统UI界面的实现 上面的模型训练好了但对于我们来说它的作用就只是知道了其准确率还行其实深度学习的目的最重要还是应用是时候用上面的模型做点酷酷的东西了。可不可以用上面的模型识别下自己表达的情绪呢不如做个系统调取摄像头对实时画面中的表情进行识别并显示识别结果既能可视化的检测模型的实用性能同时使得整个项目生动有趣激发自己的创造性当你向别人介绍你的项目时也显得高大上。这里采用PyQt5进行设计首先看一下最后的效果图运行后的界面如下 设计功能一、可选择模型文件后基于该模型进行识别二、打开摄像头识别实时画面中的人脸表情三、选择一张人脸图片对其中的表情进行识别。选择一张图片测试识别效果如下图所示 本文转载自思绪无限人脸表情识别系统介绍——上篇python实现含UI界面及完整代码_思绪无限的博客-CSDN博客_人脸表情识别系统
感谢大家的支持。