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的人脸识别实战,可以识别出照片中的人脸并进行分类。