使用多输出估计器完成人脸图像

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验展示了如何使用多输出估计器来完成图像。目标是根据人脸的上半部分预测其下半部分。将使用不同的算法,如极端随机树、k 近邻、线性回归和岭回归来完成人脸的下半部分。完成后的人脸将与原始人脸进行比较,以评估算法的性能。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

加载数据

第一步是加载 Olivetti 人脸数据集,该数据集包含 400 张 64x64 像素的灰度图像。数据被分为训练集和测试集。训练集包含 30 个人的人脸,测试集包含其余人的人脸。对于本实验,我们将在五个人的子集上测试算法。

## 加载人脸数据集
data, targets = fetch_olivetti_faces(return_X_y=True)

train = data[targets < 30]
test = data[targets >= 30]  ## 在独立的人上进行测试

## 在人的一个子集上进行测试
n_faces = 5
rng = check_random_state(4)
face_ids = rng.randint(test.shape[0], size=(n_faces,))
test = test[face_ids, :]

n_pixels = data.shape[1]
## 人脸的上半部分
X_train = train[:, : (n_pixels + 1) // 2]
## 人脸的下半部分
y_train = train[:, n_pixels // 2 :]
X_test = test[:, : (n_pixels + 1) // 2]
y_test = test[:, n_pixels // 2 :]

拟合估计器

第二步是将多输出估计器拟合到训练数据上。我们将使用四种不同的算法:极端随机树、k 近邻、线性回归和岭回归。这些估计器将根据人脸的上半部分预测其下半部分。

## 拟合估计器
ESTIMATORS = {
    "Extra trees": ExtraTreesRegressor(
        n_estimators=10, max_features=32, random_state=0
    ),
    "K-nn": KNeighborsRegressor(),
    "Linear regression": LinearRegression(),
    "Ridge": RidgeCV(),
}

y_test_predict = dict()
for name, estimator in ESTIMATORS.items():
    estimator.fit(X_train, y_train)
    y_test_predict[name] = estimator.predict(X_test)

绘制完成后的人脸

最后一步是为每种算法绘制完成后的人脸,并将它们与原始人脸进行比较。原始人脸显示在第一列,每种算法完成后的人脸显示在后续列中。通过将完成后的人脸与原始人脸进行比较,可以评估算法的性能。

## 绘制完成后的人脸
image_shape = (64, 64)

n_cols = 1 + len(ESTIMATORS)
plt.figure(figsize=(2.0 * n_cols, 2.26 * n_faces))
plt.suptitle("Face completion with multi-output estimators", size=16)

for i in range(n_faces):
    true_face = np.hstack((X_test[i], y_test[i]))

    if i:
        sub = plt.subplot(n_faces, n_cols, i * n_cols + 1)
    else:
        sub = plt.subplot(n_faces, n_cols, i * n_cols + 1, title="true faces")

    sub.axis("off")
    sub.imshow(
        true_face.reshape(image_shape), cmap=plt.cm.gray, interpolation="nearest"
    )

    for j, est in enumerate(sorted(ESTIMATORS)):
        completed_face = np.hstack((X_test[i], y_test_predict[est][i]))

        if i:
            sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j)

        else:
            sub = plt.subplot(n_faces, n_cols, i * n_cols + 2 + j, title=est)

        sub.axis("off")
        sub.imshow(
            completed_face.reshape(image_shape),
            cmap=plt.cm.gray,
            interpolation="nearest",
        )

plt.show()

总结

本实验展示了如何使用多输出估计器来完成图像。我们使用了四种不同的算法,根据人脸的上半部分预测其下半部分。通过将完成后的人脸与原始人脸进行比较,评估了这些算法的性能。