面部表情识别:从PCA到MLP的实现
立即解锁
发布时间: 2025-09-01 01:15:14 阅读量: 7 订阅数: 16 AIGC 

# 面部表情识别:从PCA到MLP的实现
## 1. 面部情绪识别概述
在面部情绪识别任务中,找到最能描述数据的特征是整个学习任务的关键部分。除了常见的预处理方法,如均值减法和归一化,我们还将使用主成分分析(PCA)这一降维技术。PCA有助于处理高维数据,即使训练图片数量有限,也能帮助我们获得较好的结果。
## 2. 数据集处理
### 2.1 数据加载
我们编写了一个新的数据集解析器,定义了`load_collected_data`函数来加载训练数据,并返回收集的数据及其对应标签的元组。代码如下:
```python
def load_collected_data(path):
data, targets = [], []
with open(path, 'r', newline='') as infile:
reader = csv.reader(infile)
for label, sample in reader:
targets.append(label)
data.append(json.loads(sample))
return data, targets
```
### 2.2 特征提取
使用`pca_featurize`函数对所有样本执行PCA。与其他方法不同,该函数会考虑整个数据集的特征,而不是单独处理每个图像。它将返回训练数据和应用相同函数到测试数据所需的所有参数。函数签名如下:
```python
def pca_featurize(data) -> (np.ndarray, List)
```
## 3. 主成分分析(PCA)
### 3.1 PCA原理
PCA是一种降维技术,适用于处理高维数据。可以将图像看作高维空间中的一个点,将二维图像展平后可得到一个特征向量。为了描述所有可能的二维灰度图像,需要一个非常大的向量空间。而PCA的作用是找到一个更小、更紧凑的向量空间,同样能很好地描述这些图像。
### 3.2 PCA操作步骤
在OpenCV中执行PCA的步骤如下:
1. 将训练数据转换为NumPy二维数组:
```python
x_arr = np.array(training_data).reshape((len(training_data), -1)).astype(np.float32)
```
2. 调用`cv2.PCACompute`计算数据的中心和主成分:
```python
mean, eigvecs = cv2.PCACompute(x_arr, mean=None)
```
3. 选择最具信息量的成分:
```python
top_vecs = eigvecs[:num_components]
```
4. 将均值转换为一维向量表示数据的中心:
```python
center = mean.flatten()
```
5. 返回经过`_pca_featurize`函数处理的训练数据和应用相同转换所需的参数:
```python
args = (center, top_vecs)
return _pca_featurize(training_data, *args), args
```
### 3.3 PCA代码实现
```python
def _pca_featurize(data, center, top_vecs):
return np.array([np.dot(top_vecs, np.array(datum).flatten() - center)
for datum in data]).astype(np.float32)
```
## 4. 多层感知器(MLPs)
### 4.1 MLP概述
MLP是一种人工神经网络,用于将一组输入数据转换为一组输出数据。其核心是感知器,类似于生物神经元。通过将大量感知器组合成多层结构,MLP能够对输入数据做出非线性决策,并且可以使用反向传播算法进行训练,适用于监督学习任务。
### 4.2 感知器原理
感知器是一个二进制分类器,由Frank Rosenblatt在20世纪50年代发明。它计算输入的加权和,如果和超过阈值,则输出1,否则输出0。感知器的输入经过非线性激活函数处理后得到输出。在原始算法中,激活函数是Heaviside阶跃函数,而在现代实现中,激活函数可以是从sigmoid到双曲正切函数等多种类型。
### 4.3 深度架构
MLP通常由至少三层组成,第一层为输入层,每个节点对应数据集的一个输入特征;最后一层为输出层,每个节点对应一个类别标签;中间层为隐藏层。在前馈神经网络中,输入层的部分或所有节点连接到隐藏层的所有节点,隐藏层的部分或所有节点连接到输出层的部分或所有节点。
### 4.4 网络规模与性能
增加神经网络的神经元数量通常会使训练集的错误率降低,但测试集的错误率可能并非如此。随着模型复杂度的增加,测试误差会先达到最小值,之后再增加神经元数量将无法提高测试数据的性能。因此,需要找到一个合适的网络规模,避免欠拟
0
0
复制全文
相关推荐










