Введение
В этом практическом занятии (лабораторной работе) вы узнаете, как выполнять распознавание лиц с использованием собственных лиц (eigenfaces) и методов опорных векторов (Support Vector Machines, SVM). В качестве набора данных в этом практическом занятии используется предварительно обработанный фрагмент набора данных "Labeled Faces in the Wild".
Советы по виртуальной машине
После запуска виртуальной машины нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если у вас возникнут проблемы во время обучения, не стесняйтесь обращаться к Labby. После занятия оставьте отзыв, и мы оперативно решим проблему для вас.
Импорт библиотек
from time import time
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import RandomizedSearchCV
from sklearn.datasets import fetch_lfw_people
from sklearn.metrics import classification_report
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from scipy.stats import loguniform
Сначала нам нужно импортировать все необходимые библиотеки.
Загрузка и исследование набора данных
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
n_samples, h, w = lfw_people.images.shape
X = lfw_people.data
n_features = X.shape[1]
y = lfw_people.target
target_names = lfw_people.target_names
n_classes = target_names.shape[0]
Мы загружаем набор данных с помощью функции fetch_lfw_people() из библиотеки scikit-learn. Затем мы исследуем набор данных, получая количество образцов, высоту и ширину изображений. Мы также получаем входные данные X, целевую переменную y, имена классов target_names и количество классов n_classes.
Предварительная обработка данных
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
Мы разбиваем набор данных на обучающую и тестовую выборки и выполняем предварительную обработку данных, масштабируя входные данные с помощью функции StandardScaler().
Выполнение метода главных компонент (PCA)
n_components = 150
pca = PCA(n_components=n_components, svd_solver="randomized", whiten=True).fit(X_train)
eigenfaces = pca.components_.reshape((n_components, h, w))
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
Мы выполняем метод главных компонент (Principal Component Analysis, PCA) для извлечения признаков из входных данных. Мы устанавливаем количество компонентов равным 150 и обучаем модель PCA на обучающих данных. Затем мы получаем собственные лица (eigenfaces) и преобразуем входные данные в главные компоненты.
Обучение модели классификации на основе метода опорных векторов (Support Vector Machine, SVM)
param_grid = {
"C": loguniform(1e3, 1e5),
"gamma": loguniform(1e-4, 1e-1),
}
clf = RandomizedSearchCV(
SVC(kernel="rbf", class_weight="balanced"), param_grid, n_iter=10
)
clf = clf.fit(X_train_pca, y_train)
Мы обучаем модель классификации SVM с использованием преобразованных данных. Мы используем функцию RandomizedSearchCV() для нахождения наилучших гиперпараметров для модели SVM.
Оценка производительности модели
y_pred = clf.predict(X_test_pca)
print(classification_report(y_test, y_pred, target_names=target_names))
ConfusionMatrixDisplay.from_estimator(
clf, X_test_pca, y_test, display_labels=target_names, xticks_rotation="vertical"
)
Мы предсказываем целевые значения с использованием тестовых данных и оцениваем производительность модели с помощью функции classification_report(). Мы также строим матрицу ошибок (confusion matrix) с использованием функции ConfusionMatrixDisplay().
Визуализация предсказаний
def 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=0.01, right=0.99, top=0.90, hspace=0.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(())
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)
Мы визуализируем предсказания, отобразив галерею портретов с их предсказанными и истинными именами.
Визуализация собственных лиц (eigenfaces)
eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)
plt.show()
Мы также строим графики собственных лиц (eigenfaces), чтобы визуализировать признаки, извлеченные из входных данных.
Резюме
В этом практическом занятии (лабораторной работе) мы научились выполнять распознавание лиц с использованием собственных лиц (eigenfaces) и методов опорных векторов (SVM). Сначала мы загрузили и исследовали набор данных, затем выполнили предварительную обработку данных, масштабировав входные данные. Затем мы применили метод главных компонент (PCA) для извлечения признаков из входных данных и обучили модель классификации на основе SVM. Мы оценили производительность модели и визуализировали предсказания и собственные лица (eigenfaces).