使用Python从图像创建数据集以进行面部识别

时间:2010-11-13 09:34:36

标签: python opencv computer-vision image-recognition knn

我正在尝试用Python编写面部识别程序(我将应用k-nn算法进行分类)。

首先,我将图像转换为灰度,然后我创建了一个长列矢量(通过使用Opencv的imagedata函数)和图像的像素(总共128x128 = 16384个特征)

所以我得到了一个像下面这样的数据集(最后一列是类标签,我只展示了数据集的前7个特征而不是16384)。

176, 176, 175, 175, 177, 173, 178, 1 
162, 161, 167, 162, 167, 166, 166, 2

但是当我将k-nn应用于此数据集时,我得到了尴尬的结果。我是否需要对此数据集应用其他流程,而不是仅将图像转换为像素表示?

感谢。

4 个答案:

答案 0 :(得分:1)

如果您希望它运作良好,是的,您需要进行功能转换。

PCA或LDA运作良好。 PCA将采集输入向量(在本例中为矢量化图像)并找到跨越输入集的特征脸。然后,在测试期间,将输入矢量(即图像)投影到这组特征脸上,并使用生成的坐标矢量作为特征向量。有关详细信息,请参阅[Turk and Pentland, 1991]。

我在PIE database上使用这种基本PCA方法的个人实验是成功的。

答案 1 :(得分:1)

你可能需要眼睛,鼻尖和嘴巴对齐。

您可能还需要更复杂的图像表示方法。例如,梯度方向和自商图像将是良好的起点。

答案 2 :(得分:1)

通常,面部识别管道需要几个阶段才能有效。某种程度的几何归一化对准确性至关重要。您需要手动标记基准点并获取每个图像的变换,或自动检测基准点,其中有开源基准点检测器。试试opencv的getAffineTransform函数。此外,照明差异可能会导致巨大的问题。您可以尝试点亮归一化技术(例如,自商图像),因为它们对于漫反射和阴影(而不是镜面反射)非常有效。对于降维,主成分分析(PCA)或线性判别分析(LDA)是很好的起点。但是,您可能会考虑更有意义的功能,如LBP,HOG或SIFT,而不是原始像素功能。此外,通过更复杂(尽管更复杂)的分类器(如SVM),您将能够获得比KNN更高的精度。

答案 3 :(得分:0)

你怎么打印这个?你尝试过使用重塑功能吗?它将2D图像转换为具有/不具有多个通道的1D图像。

此外,图像的像素不是features。你可以在脸后面放置很多不同的物品 - 窗帘,书籍,其他脸等。像脸的边界,眼睛之间的距离等等,对这些东西更加不变。