能否提供一个用Python实现的基于卷积神经网络(CNN)的人脸表情识别详细代码示例?
时间: 2024-10-27 12:03:47 浏览: 18
当然可以。以下是一个简单的Python代码示例,使用Keras库(它是TensorFlow的一个高级API)来构建一个基于卷积神经网络(CNN)的人脸表情识别模型。这个例子使用的是FER2013数据集,它包含7种基本的表情类别。
```python
# 导入所需库
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
import numpy as np
from keras.preprocessing.image import img_to_array, load_img
# 加载预处理的数据
def load_data(data_path):
images = []
labels = []
for folder in os.listdir(data_path):
if not folder.startswith('.'):
label = int(folder)
emotion_folder = os.path.join(data_path, folder)
for img in os.listdir(emotion_folder):
img_path = os.path.join(emotion_folder, img)
img = load_img(img_path, target_size=(48, 48))
img_array = img_to_array(img) / 255.0
images.append(img_array)
labels.append(label)
return np.array(images), np.array(labels)
# 加载并预处理数据
data_path = 'fer2013'
images, labels = load_data(data_path)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(images, labels, test_size=0.2, random_state=42)
# 构建CNN模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(len(np.unique(labels)), activation='softmax')) # 输出层的节点数等于表情种类数
# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
# 相关问题--
1. 这个代码需要哪些额外的库才能运行?
2. CNN模型中的"Flatten()"层的作用是什么?
3. 如何评估模型的表现?
阅读全文