不使用深度学习的人脸表情识别python代码实现
时间: 2023-10-25 10:07:26 浏览: 104
传统的人脸表情识别方法通常涉及到特征提取和分类器训练两个步骤。这里给出一个简单的基于特征提取和SVM分类器的人脸表情识别代码实现。
首先需要安装OpenCV和sklearn库,可以使用以下命令安装:
```
pip install opencv-python
pip install scikit-learn
```
然后,需要准备训练数据集和测试数据集。这里使用FER2013数据集,可以从Kaggle网站上下载。
接下来,将数据集中的图像转换成灰度图像,并进行特征提取。这里使用Haar特征,可以使用OpenCV库中的cv2.CascadeClassifier函数进行提取。代码如下:
```python
import cv2
def extract_features(image_path, face_cascade):
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) == 0:
return None
(x, y, w, h) = faces[0]
face = gray[y:y+w, x:x+h]
face = cv2.resize(face, (48,48))
return face.flatten()
```
然后,使用上述函数提取训练集和测试集中的所有图像的特征,并将其存储在一个NumPy数组中。代码如下:
```python
import os
import numpy as np
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
def load_dataset(dataset_path):
data = []
labels = []
for label in os.listdir(dataset_path):
label_path = os.path.join(dataset_path, label)
for image in os.listdir(label_path):
image_path = os.path.join(label_path, image)
features = extract_features(image_path, face_cascade)
if features is not None:
data.append(features)
labels.append(int(label))
return np.array(data), np.array(labels)
train_data, train_labels = load_dataset('train')
test_data, test_labels = load_dataset('test')
```
接下来,使用SVM分类器进行训练和测试。代码如下:
```python
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
svm = SVC(kernel='linear', C=1.0, random_state=0)
svm.fit(train_data, train_labels)
train_predictions = svm.predict(train_data)
train_accuracy = accuracy_score(train_labels, train_predictions)
print('Train accuracy:', train_accuracy)
test_predictions = svm.predict(test_data)
test_accuracy = accuracy_score(test_labels, test_predictions)
print('Test accuracy:', test_accuracy)
```
最后,可以使用训练好的模型对新的图像进行预测。代码如下:
```python
image_path = 'test_image.png'
features = extract_features(image_path, face_cascade)
prediction = svm.predict([features])
print('Prediction:', prediction)
```
需要注意的是,这种基于传统特征提取和分类器训练的方法在人脸表情识别领域已经被深度学习方法所替代,其准确率往往不如深度学习方法。
阅读全文