机器学习用户宝典:使用SVM解读情感 原创

发布于 2025-1-6 08:32
浏览
0收藏

有没有想过机器是如何识别人脸表情或分类物体的?答案在于支持向量机(SVM)。我们在这篇博文中将通过一个分步骤的项目来探究其工作原理。在介绍该项目之前,不妨简要介绍一下SVM。

支持向量机

支持向量机(SVM)可能听起来像一个复杂的术语,但它却是机器学习领域一种简单而强大的方法。你可以把它想象成一个智能边界划分者,帮助机器对数据进行分类。无论是分类垃圾邮件、识别人脸还是检测情感,SVM都能找到分离不同类别数据的最佳线(或超平面)。SVM之所以如此有效,是由于它不仅能够处理简单的任务,还能够轻松处理复杂的高维数据。我们在这篇博文中将深入探讨SVM是如何工作的以及为什么它改变了机器学习领域的游戏规则。

为什么是SVM?

SVM之所以脱颖而出,是由于它善于找到分离图像等复杂数据的最佳方法,只需要几个关键点。CNN和KNN等其他方法需要大量数据和强大算力,而SVM可以很好地处理较小的数据集、多维图像,仍然提供出色的结果。对于许多图像识别任务来说,它可靠、高效和完美,没有其他技术的繁重要求。此外,SVM避免了过拟合,使其适用于样本有限的数据集。

注意:虽然SVM以用于分类任务最为出名,但也可以用于回归,即用于预测连续值。

SVM是如何工作的?

SVM的工作原理是找到分离数据中不同类别的最佳边界(超平面)。支持向量是最接近该边界并帮助定义该边界的数据点。

SVM试图使边界与这些支持向量之间的距离尽可能大,这有助于提高准确率。如果数据无法用直线(或超平面)分离,SVM使用核函数(后面有进一步介绍)将数据转换到更高的空间,在那里它可以找到一个边界。

机器学习用户宝典:使用SVM解读情感-AI.x社区

项目概述

目标

首先,该项目旨在演示如何使用支持向量机(SVM)利用标记数据集将人脸表情分类为不同的情感。除此之外,它还旨在训练SVM模型,以便根据从人脸图像中提取的特征对表情进行准确的分类。

数据集、工具和库

这里演示的项目是使用人脸表情数据集创建而成的。该项目使用了一个含有大约28000个图像的数据集,包括八种不同的表情(比如愤怒、悲伤、快乐等)。为了实现SVM,可以使用Pandas、Scikit-learn、OpenCV和NumPy等Python库。

项目创建

有几个步骤与之相关。不妨逐一介绍。

第1步:数据分离和预处理

首先,我们要加载数据集。该项目中使用的数据集由代表不同情感的文件夹组成。每个文件夹至少包含3000个图像。为了确保数据集内容平衡,我们从每个文件夹中随机选择2000个图像,这样就不会对特定的情感产生偏见。此外,2000是中等的批大小,因此过拟合和欠拟合的可能性似乎较小。下面是执行相同功能的代码。

# Load the dataset
csv_path = './Dataset/labels.csv'  # Path to the label CSV file
data = pd.read_csv(csv_path)

# Define parameters
image_folder = './Dataset/'  # Folder containing images
classes = ['neutral', 'happy', 'sad', 'surprise', 'fear',
 'disgust', 'anger', 'contempt']  # Emotion classes
samples_per_class = 2000  # Number of samples to take per class
image_size = (96, 96)  # Resize all images to 96x96

现在,我们确保每个情感类都有相同数量的样本以获得平衡的训练过程。使用pandas.DataFrame.sample()对图像进行随机抽样,以避免类不平衡。任何少于2000个图像的类都会被跳过,以保持数据集的一致性。

一旦数据集准备好,我们将图像转换成灰度,这有助于简化图像数据。并提取方向梯度直方图(HOG)特征,用于提取图像的边缘和纹理信息。

X = []
y = []
for _, row in balanced_data.iterrows():
    image_path = os.path.join(image_folder, row['pth'])  # Assuming 'pth' column contains image file paths
    if os.path.exists(image_path):
        # Read the image and convert to grayscale
        image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
        image = cv2.resize(image, image_size)

        # Extract HOG features
        features, _ = hog(image, orientations=9, pixels_per_cell=(8, 8),
                          cells_per_block=(2, 2), visualize=True, channel_axis=None)
        X.append(features)
        y.append(row['label'])
    else:
        print(f"Image not found: {image_path}")

第2步:降维和训练

在对数据集进行归一化之后,PCA和LDA等降维方法就可以派上用场了,以便通过只保留重要的模式、去除噪声以及分别分离类,以减少特征的数量。

现在,训练前的最后一步是将数据集分成训练集和测试集,以评估模型针对未见过的数据时的性能。

pca = PCA(n_components=0.95) 
X_pca = pca.fit_transform(X)

lda = LDA(n_components=7)  
X_lda = lda.fit_transform(X_pca, y)

#Spliting into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X_lda, y, test_size=0.2, random_state=42, stratify=y)

第3步:训练和评估模型

接下来是最重要的部分:训练。SVM模型使用线性核来训练,线性核有助于绘制一个直超平面来分离特征空间中的情感类。100的C值控制了最大化边际和最小化分类错误之间的平衡,兼顾了复杂性和准确性。此外,class_weight='balanced'参数确保模型有效地处理类不平衡,使其面对不同的情感类别时有稳定可靠的表现。使用训练数据拟合模型后,SVM就可以准备使用测试集进行性能评估了。

#Train the SVM model with fixed C value
svm = SVC(C=100, kernel='linear', gamma='scale', class_weight='balanced')
svm.fit(X_train, y_train)

#Evaluating the model
y_pred = svm.predict(X_test)

机器学习用户宝典:使用SVM解读情感-AI.x社区

图1. 线性核的图像表示

注意:这里之所以使用线性核,是由于数据是线性可分的,它很适用于高维数据。

第4步:结论:结果和分析

Accuracy: 73.94%
Classification Report:
              precision    recall     f1-score    support

     neutral       0.71      0.73      0.72      1600
      happy       0.88      0.88      0.88      1600
        sad       0.68      0.68      0.68      1600
    surprise       0.69      0.68      0.69      1600
      anger       0.74      0.73      0.73      1600
    contempt      0.71      0.71      0.72      1600
       fear       0.74      0.72      0.73      1600
     disgust       0.71      0.71      0.73      1600

    accuracy                          0.74      8000
   macro avg       0.74      0.74      0.74      8000
weighted avg       0.74      0.74      0.74      8000

分析

我们的模型达到了73.94%的准确率,面对Happy(快乐)类表现最好,精准率和召回率为0.88,面对中性、愤怒、厌恶和蔑视类表现良好(约0.70-0.74)。然而,它在面对悲伤和惊喜类时表现欠佳(精准率和召回率为0.68-0.69),可能是由于特征重叠。均衡的宏和加权平均值为0.74,表明面对各情感类,总体上性能一致。

模型的部署

在训练模型之后,我们还创建了一个网页,让用户以互动的方式检测自己的情感。该网页还没有部署,但是你仍然可以在这里查看如何描述输出的结果。

机器学习用户宝典:使用SVM解读情感-AI.x社区

结论

我们已经发掘了SVM的力量来解读从快乐到惊喜的各种情感。结合使用关键概念、编码和一些模型调优,我们看到了SVM如何帮助机器更好地理解我们人类的情感。完善模型可能需要一番调整,但SVM是一种强大的情感检测工具。

当我们继续探索令人着迷的AI世界时,想想机器如何慢慢地在识别和理解人类情感方面变得更好确实令人叹为惊讶。不断学习,不断尝试!

原文标题:​Expressions Unveiled: Using SVM to Decode Emotions with Machine Learning​,作者:Jay Mangukiya

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐