特征人脸技术是最近发展起来的涉及人脸和一般刚体识别及其他人脸处理的方法。 首先,将一组脸部图像转换为称为“特征脸部”的特征向量集。 这些是第一组训练图像的基本组件。 识别的过程是将新图像投影到特征人脸空间中,根据其投影点在子空间中的位置和投影线的长度进行判定和识别。 将图像转换到另一个空间后,同级图像聚集在一起,不同类别的图像聚集的力比较远,在原像素空间中不同类别的图像在分布上很难用简单的线和面切分,转换到另一个空间,可以很好地将他们分开。 Eigenfaces选择的空间变换方法为PCA (主成分分析),利用PCA获得脸部分布的主成分。 具体而言,对训练集中所有人脸图像的协方差矩阵进行模态分解,得到对应的本征向量。 这些固有矢量是“特征脸”。 每个特征向量或特征面部相当于捕捉或描述人的面部之间的变化或特性。 这意味着每个人的脸都可以表现为这些特征脸的线性组合。 这里直接展示了基于特征人脸的人脸识别的实现过程。 原图像投影在该特征空间。 特别是,此时原始图像x的保存大小为n维的向量,即:
训练集是(其中p是采样图像的数量),并形成矩阵X[n][p]。 其中行表示像素,列表示每个面部图像。 从训练样本集中的人脸图像中减去平均人脸图像,计算离散差值,使训练图像中心化。
将中心化的图像设为n p大小的矩阵x :
将中心化图像组成的矩阵x乘以其转置矩阵,得到协方差矩阵:
求出协方差矩阵的k个非零特征量和相应的特征向量。 一般地,由于训练图像数量p远远小于一幅图像的像素值n,协方差矩阵具有与非零特征量最大对应的p个特征向量。 因此,如果按照kp .特征量从大到小的顺序排列特征向量,则与最大特征量对应的特征向量反映训练图像间的最大差,对应的特征量越小,反应图像间的差越小。 所有与的非零特征值相对应的特征向量构成特征空间,即所谓的“特征脸”空间。 计算本征值和本征向量。 其中u是对应于特征值的本征向量的集合。 排列特征向量:按照非零特征值从大到小的顺序排列对应的特征向量。 构成的特征向量矩阵是特征空间u,u的各列是特征向量。 由此,各脸部图像被投影到听歌时间的部分空间上。 因此,每个人脸图像对应于子空间中的一个点,同样子空间中的每个点对应一个图像。 下图显示了相应的图像。 这些图像与人脸相似,因此被称为“特征脸”。 在投影特征脸部训练图像而得到的特征脸部空间中,有这样的由“特征脸部”构成的降维特征子空间,中心化的脸部图像都通过以下的式子投影到特征脸部空间,可以得到一系列的坐标系数据。
本文将“Labeled Faces in the Wild”,akal fw :3358 vis-www.cs.umass.edu/lfw/lfw-funneled.tgz (233 MB )的数据集
将Eigenfaces和SVM组合起来进行脸部识别吧。
Python源代码:
from _ _ future _ import print _ functionfromtimeimporttimeimportloggingimportmatplotlib.pyplotaspltfromsklearn.mod earn idsearchcvfromsklearn.datasetsimportfetch _ lfw _ peoplefromsklearn.metrics ics sk learn.metricsimportconfusion _ matrixmation klearn.svmimportsvcprint (_ _ doc _ _ ) ) ) ) ) ) ) displayprogresslogsonstdoutlogging.basic config (level ) format=“% # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #。 ifnotalreadyondiskandloaditasnumpyarrayslfw _ people=fetch _ lfw _ people (min _ faces _ per _ person=70,resize )
machine learning we use the 2 data directly (as relative pixel# positions info is ignored by this model)X = lfw_people.datan_features = X.shape[1]# the label to predict is the id of the persony = lfw_people.targettarget_names = lfw_people.target_namesn_classes = target_names.shape[0]print(“Total dataset size:”)print(“n_samples: %d” % n_samples)print(“n_features: %d” % n_features)print(“n_classes: %d” % n_classes)# ############################################################################## Split into a training set and a test set using a stratified k fold# split into a training and testing setX_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=42)# ############################################################################## Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled# dataset): unsupervised feature extraction / dimensionality reductionn_components = 150print(“Extracting the top %d eigenfaces from %d faces” % (n_components, X_train.shape[0]))t0 = time()pca = PCA(n_components=n_components, svd_solver=’randomized’, whiten=True).fit(X_train)print(“done in %0.3fs” % (time() – t0))eigenfaces = pca.components_.reshape((n_components, h, w))print(“Projecting the input data on the eigenfaces orthonormal basis”)t0 = time()X_train_pca = pca.transform(X_train)X_test_pca = pca.transform(X_test)print(“done in %0.3fs” % (time() – t0))# ############################################################################## Train a SVM classification modelprint(“Fitting the classifier to the training set”)t0 = time()param_grid = {‘C’: [1e3, 5e3, 1e4, 5e4, 1e5], ‘gamma’: [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }clf = GridSearchCV(SVC(kernel=’rbf’, class_weight=’balanced’), param_grid)clf = clf.fit(X_train_pca, y_train)print(“done in %0.3fs” % (time() – t0))print(“Best estimator found by grid search:”)print(clf.best_estimator_)# ############################################################################## Quantitative evaluation of the model quality on the test setprint(“Predicting people’s names on the test set”)t0 = time()y_pred = clf.predict(X_test_pca)print(“done in %0.3fs” % (time() – t0))print(classification_report(y_test, y_pred, target_names=target_names))print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))# ############################################################################## Qualitative evaluation of the predictions using matplotlibdef plot_gallery(images, titles, h, w, n_row=3, n_col=4): “””Helper function to plot a gallery of portraits””” plt.figure(figsize=(1.8 * n_col, 2.4 * n_row)) plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35) for i in range(n_row * n_col): plt.subplot(n_row, n_col, i + 1) plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray) plt.title(titles[i], size=12) plt.xticks(()) plt.yticks(())# plot the result of the prediction on a portion of the test setdef title(y_pred, y_test, target_names, i): pred_name = target_names[y_pred[i]].rsplit(‘ ‘, 1)[-1] true_name = target_names[y_test[i]].rsplit(‘ ‘, 1)[-1] return ‘predicted: %s\ntrue: %s’ % (pred_name, true_name)prediction_titles = [title(y_pred, y_test, target_names, i) for i in range(y_pred.shape[0])]plot_gallery(X_test, prediction_titles, h, w)# plot the gallery of the most significative eigenfaceseigenface_titles = [“eigenface %d” % i for i in range(eigenfaces.shape[0])]plot_gallery(eigenfaces, eigenface_titles, h, w)plt.show()
Result: