Python机器学习之人脸识别实战 人脸识别是目前比较火热的课题之一,也是机器学习中常见的应用场景之一。本文将用Python语言进行人脸识别实战,具体实现过程如下。 一、准备数据集 首先需要准备一些含有人脸的照片,这里我们选择使用LFW(Labeled Faces in the Wild)数据集作为数据集。该数据集包含超过13,000张人脸照片,是一个常用的人脸识别数据集。 二、安装必要的库 我们需要安装以下几个库来对数据进行处理、训练和测试: - numpy:用于对数据进行矩阵操作 - scikit-learn:用于训练和测试模型 - matplotlib:用于将结果可视化 - opencv-python:用于对图像进行处理和分析 安装方法是直接使用pip命令进行,如下所示: ``` pip install numpy pip install scikit-learn pip install matplotlib pip install opencv-python ``` 三、准备数据 我们需要把数据集中的图片进行处理,提取出每张图片中的人脸,然后将人脸数据保存为矩阵,便于后续的训练和测试。 下面是数据处理的代码: ```python import os import numpy as np import cv2 from sklearn.model_selection import train_test_split def read_images(folder): np.random.seed(42) data = [] labels = [] for root, dirs, files in os.walk(folder): for file in files: if file.endswith("jpg") or file.endswith("png"): filepath = os.path.join(root, file) image = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE) if image is not None: image = cv2.resize(image, (100, 100)) data.append(np.asarray(image, dtype=np.uint8)) labels.append(len(labels)) return data, labels def prepare_data(): data, labels = read_images("lfw") X_train, X_test, y_train, y_test = train_test_split(np.asarray(data, dtype=np.float32), np.asarray(labels, dtype=np.int32), test_size=0.2) return X_train, X_test, y_train, y_test ``` 这里我们用了opencv-python库来读取和处理图像,将图像转换为灰度图,然后将每张图像的像素点作为一个向量呈现。 四、训练模型 我们选择使用PCA(Principal Component Analysis)算法来进行人脸识别模型的训练。PCA算法是一种常用的降维算法,可以将高维数据转换为低维数据,从而减小计算复杂度。我们先对训练数据进行PCA降维,然后使用KNN(K-Nearest Neighbors)算法进行分类训练。 下面是训练模型的代码: ```python from sklearn.decomposition import PCA from sklearn.neighbors import KNeighborsClassifier def train_model(X_train, X_test, y_train, y_test, n_components=100): pca = PCA(n_components=n_components, svd_solver="randomized", whiten=True).fit(X_train) X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train_pca, y_train) return knn, pca ``` 五、测试模型 完成模型的训练后,我们需要进行模型的测试。我们选择使用测试集中的数据进行测试,并将结果可视化。 下面是测试模型的代码: ```python import matplotlib.pyplot as plt def test_model(knn, pca, X_test, y_test): y_pred = knn.predict(pca.transform(X_test)) correct = np.count_nonzero(y_pred == y_test) accuracy = correct / y_test.size print("Accuracy: {:.2f}%".format(accuracy * 100)) fig, ax = plt.subplots(nrows=2, ncols=5, figsize=(10, 5), subplot_kw={'xticks': [], 'yticks': []}) for i, axi in enumerate(ax.flat): axi.imshow(X_test[i].reshape(100, 100), cmap='gray') axi.set_title("Prediction: {}".format(y_pred[i])) plt.show() ``` 这里我们使用了matplotlib库来显示测试结果。 六、完整代码 将以上代码整合起来,即可得到完整的Python人脸识别实战代码,如下所示: ```python import os import numpy as np import cv2 from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt def read_images(folder): np.random.seed(42) data = [] labels = [] for root, dirs, files in os.walk(folder): for file in files: if file.endswith("jpg") or file.endswith("png"): filepath = os.path.join(root, file) image = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE) if image is not None: image = cv2.resize(image, (100, 100)) data.append(np.asarray(image, dtype=np.uint8)) labels.append(len(labels)) return data, labels def prepare_data(): data, labels = read_images("lfw") X_train, X_test, y_train, y_test = train_test_split(np.asarray(data, dtype=np.float32), np.asarray(labels, dtype=np.int32), test_size=0.2) return X_train, X_test, y_train, y_test def train_model(X_train, X_test, y_train, y_test, n_components=100): pca = PCA(n_components=n_components, svd_solver="randomized", whiten=True).fit(X_train) X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train_pca, y_train) return knn, pca def test_model(knn, pca, X_test, y_test): y_pred = knn.predict(pca.transform(X_test)) correct = np.count_nonzero(y_pred == y_test) accuracy = correct / y_test.size print("Accuracy: {:.2f}%".format(accuracy * 100)) fig, ax = plt.subplots(nrows=2, ncols=5, figsize=(10, 5), subplot_kw={'xticks': [], 'yticks': []}) for i, axi in enumerate(ax.flat): axi.imshow(X_test[i].reshape(100, 100), cmap='gray') axi.set_title("Prediction: {}".format(y_pred[i])) plt.show() if __name__ == '__main__': X_train, X_test, y_train, y_test = prepare_data() knn, pca = train_model(X_train, X_test, y_train, y_test) test_model(knn, pca, X_test, y_test) ``` 通过以上代码的实现,我们已经实现了基于Python的人脸识别实战,可以识别出照片中的人脸并进行分类。