基于深度学习的面部表情识别 含图片和视频的面部表情识别,含详细的代码运行说明文档。

在当今数字化时代,面部表情识别作为人工智能领域的一个重要研究方向,具有广泛的应用前景,如人机交互、情感分析、安防监控等。今天,咱们就来深入探讨一下基于深度学习实现含图片和视频的面部表情识别,并且附上详细的代码运行说明。

准备工作

在开始编码之前,需要确保安装了必要的库。主要涉及的库有OpenCV(用于图像处理和视频读取)、TensorFlow(深度学习框架)以及相关的辅助库如NumPy等。

pip install opencv - python
pip install tensorflow
pip install numpy

这些库将是我们实现面部表情识别的得力助手。

图片面部表情识别

数据集准备

对于面部表情识别,常用的数据集有FER2013(Facial Expression Recognition 2013)。它包含了35887张48x48像素的灰度图像,涵盖了7种基本表情:愤怒、厌恶、恐惧、快乐、悲伤、惊讶和中性。假设我们已经下载并解压好了数据集。

模型构建

利用TensorFlow构建一个简单的卷积神经网络(CNN)模型来处理图片数据。

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(7, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

代码分析:首先使用Conv2D层进行卷积操作,提取图像特征,activation='relu'使用ReLU激活函数来引入非线性。MaxPooling2D层则用于下采样,减少数据维度同时保留主要特征。之后通过Flatten层将多维数据展平为一维,再经过全连接的Dense层进行分类,最后输出7个类别的概率分布,softmax激活函数将输出值转换为概率。

数据预处理与训练

import numpy as np
from keras.preprocessing.image import ImageDataGenerator

# 假设训练数据和标签存储在x_train和y_train中
x_train = np.load('x_train.npy')
y_train = np.load('y_train.npy')

x_train = x_train.reshape(-1, 48, 48, 1).astype('float32') / 255.0

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

train_generator = train_datagen.flow(x_train, y_train, batch_size=32)

model.fit(train_generator, epochs=50, steps_per_epoch=train_generator.samples // train_generator.batch_size)

代码分析:先将加载的图像数据重塑为适合模型输入的形状,并归一化到0 - 1范围。ImageDataGenerator用于数据增强,在训练过程中随机对图像进行旋转、平移、缩放等操作,增加数据的多样性,提升模型泛化能力。flow方法将数据生成器与训练数据关联,按批次输出数据。最后使用fit方法训练模型,指定训练轮数和每轮的步数。

预测图片表情

import cv2
import numpy as np

emotion_dict = {0: "Angry", 1: "Disgust", 2: "Fear", 3: "Happy", 4: "Sad", 5: "Surprise", 6: "Neutral"}

# 加载训练好的模型
model.load_weights('emotion_model.h5')

# 读取图片
img = cv2.imread('test_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x, y, w, h) in faces:
    roi_gray = gray[y:y + h, x:x + w]
    cropped_img = np.expand_dims(np.expand_dims(cv2.resize(roi_gray, (48, 48)), -1), 0)
    prediction = model.predict(cropped_img)
    maxindex = int(np.argmax(prediction))
    cv2.putText(img, emotion_dict[maxindex], (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)

cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码分析:先定义表情字典,将模型预测的类别索引映射为实际表情名称。加载训练好的模型权重,读取测试图片并转换为灰度图,使用OpenCV的Haar级联分类器检测人脸。对于检测到的每张人脸,提取其ROI(感兴趣区域)并调整大小为48x48,进行必要的维度扩展后输入模型预测,根据预测结果在图片上标注表情,最后显示图片。

视频面部表情识别

视频其实就是连续的图片序列,所以基于图片的表情识别基础上,实现视频的表情识别就相对容易些。

import cv2
import numpy as np

emotion_dict = {0: "Angry", 1: "Disgust", 2: "Fear", 3: "Happy", 4: "Sad", 5: "Surprise", 6: "Neutral"}
model.load_weights('emotion_model.h5')

cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        roi_gray = gray[y:y + h, x:x + w]
        cropped_img = np.expand_dims(np.expand_dims(cv2.resize(roi_gray, (48, 48)), -1), 0)
        prediction = model.predict(cropped_img)
        maxindex = int(np.argmax(prediction))
        cv2.putText(frame, emotion_dict[maxindex], (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)

    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

代码分析:通过cv2.VideoCapture(0)打开摄像头(参数0表示默认摄像头,如果要读取视频文件则传入视频路径)。在循环中不断读取视频帧,转换为灰度图后检测人脸,对每张人脸同样进行ROI提取、预测和标注表情的操作,最后实时显示视频帧,按'q'键退出循环并释放摄像头资源,关闭窗口。

基于深度学习的面部表情识别 含图片和视频的面部表情识别,含详细的代码运行说明文档。

通过以上步骤,我们就完成了基于深度学习的含图片和视频的面部表情识别,并且详细说明了代码运行过程。希望这篇博文能帮助你踏入面部表情识别这个有趣的领域,大家可以在此基础上进一步优化模型和功能,探索更多可能。

更多推荐