使用Python从图像创建人脸识别数据集

4 投票
4 回答
2634 浏览
提问于 2025-04-16 07:01

我正在用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 个回答

1

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

你可能还需要一种更高级的图像表示方法。比如,使用梯度方向和自我商图像,这些都是不错的起点。

1

如果你想让它运行得好,那就需要进行特征转换。

PCA(主成分分析)或LDA(线性判别分析)都很有效。PCA会收集一堆输入向量(在这里指的是你处理过的图像),然后找到可以代表这些输入的特征脸。接下来,在测试时,你会把你的输入向量(也就是图像)投影到这些特征脸上,得到的坐标向量就可以作为你的特征向量。想了解更多,可以查看[Turk和Pentland, 1991]。

我个人在使用这个基本的PCA方法进行实验时,得到了不错的结果,特别是在PIE数据库上。

2

通常,一个人脸识别的流程需要几个步骤才能有效。首先,进行一些几何标准化是非常重要的,这样才能提高准确性。你可以选择手动标记一些关键点,然后为每张图片获取一个变换,或者使用自动检测关键点的工具,市面上有一些开源的关键点检测器可以用。比如可以试试opencv里的getAffineTransform函数。此外,光照不均也会造成很大的问题。你可以尝试一些光照标准化的方法(例如,自我商图像),这些方法在处理漫反射和阴影时效果不错,但对镜面反射的效果就不太好了。至于降维,可以从主成分分析(PCA)或线性判别分析(LDA)入手。不过,除了直接使用像素特征外,你还可以考虑一些更有意义的特征,比如LBP、HOG或SIFT。此外,使用更复杂的分类器(虽然它们更复杂)比如支持向量机(SVM),你能获得比KNN更高的准确率。

撰写回答