尝试使用scikit-learn对面部图像进行分类

时间:2014-06-17 16:12:22

标签: scikit-learn

我正在尝试使用scikit-learn来研究面部图像的无监督学习。 但我需要一些帮助从图像中提取特征。 首先,我如何为scikit-learn制作特征向量?我可以使用dictVectorizer,还是功能哈希?为了制作一些模式识别系统,如果我理解正确,必须从数据中提取特征。那么如何在scikit-learn中使用内置函数提取特征?我一直在网站上阅读教程,但他们所做的只是展示我想的例子。

我要做的是使用在opencv python中实现的SURF从图像中提取特征并对其进行矢量化,以便我可以使用scikit-learn中实现的功能。 但是,由于opencv函数返回每个图像的关键点,我不知道如何组织这些关键点并在scikit-learn中创建特征向量。 或者,如果有一个很好的方法从图像中提取特征并在scikit-learn中使用它们,那就太好了。 谁能帮我这个? 感谢

1 个答案:

答案 0 :(得分:3)

通常,您希望创建一个尺寸为扁平的2D矩阵X(n_samples,height * width)。对于图像,最简单的方法之一是使用特征分解来执行shown here之类的操作。

# (Assume faces is (100, 32, 32) and represents 100 images which are 32 by 32 each)
X = faces.reshape(faces.shape[0], faces.shape[1] * faces.shape[2])

如果您生成SURF或SIFT或(另一个特征提取算法)功能,您可以创建一个新的二维矩阵,即所有零的(n_samples,height * width),然后通过取平面中的关键点将其编码为1关键点坐标并乘以X和Y值。您可以为 n_samples 图像中的 i 每个 coord 执行此操作。

SIFT_X = np.zeros(faces.shape[0], faces.shape[1] * faces.shape[2])

# Assume coord is 1 keypoint from SIFT, represented as a tuple of (X, Y)
flat_coord = coord[0] * coord[1]
SIFT_X[i, flat_coord] = 1. 

您可以直接使用上述关键点,也可以在原始图像的顶部使用关键点作为遮罩(带有一些接受区域)。检查键点工作是否正常以及坐标系匹配的简单方法是使用plt.scatter()

import matplotlib.pyplot as plt
im = X[0, :].reshape(32, 32)
sift_feat = SIFT_X[0, :].reshape(32, 32)
sift_coord = np.where(sift_feat == 1)
plt.imshow(im)
plt.scatter(sift_coord[0], sift_coord[1])
plt.show() 

就个人而言,我会从PCA / SVD方法开始,然后从那里开始使用SIFT / SURF等。