我想开发一个用户输入图像(一个人)的应用程序,系统应该能够从一个人的图像中识别出面部.如果图像中有多个人,系统也可以工作.
我需要一个逻辑,我不知道如何以图像像素数据识别人脸的方式工作.
如果您希望构建一个用于教育目的的系统,Eigenface可能是一个很好的算法,因为它相对简单并且是该领域许多其他算法的起点.基本上你所做的就是拍摄一堆人脸图像(训练数据),如果它们是RGB,则将它们切换为灰度,调整它们以使每个图像具有相同的尺寸,通过堆叠图像的列使图像成为矢量(它们现在是2D矩阵),计算所有图像中每个像素值的平均值,并从矩阵中的每个条目中减去该值,使得分量矢量不会是仿射的.完成后,计算结果的协方差矩阵,求解其特征值和特征向量,找到主成分.
完成后,您可以通过将新面部图像转换为面部矢量,投影到新的矢量空间,并计算它与其他投影面部矢量之间的线性距离来计算新面部图像的相似性得分.
如果您决定走这条路线,请小心选择在适当的光照条件和姿势角度下拍摄的脸部图像.这两个因素对于系统在呈现新面孔时的表现有很大的作用.如果培训库没有考虑探测图像的属性,那么您将获得无意义的结果.(我曾经在从互联网上下载的随机图片上训练了一个特征脸系统,它给了我比尔克林顿作为伊丽莎白二世画面的最强匹配,尽管画廊中还有另一张女王的照片.他们都有白色头发朝向同一个方向,并在类似的照明条件下拍摄,这对计算机来说已经足够了.)
如果要在同一图像中从多个人中拉出面部,则需要一个完整的系统来检测面部,将它们拉入单独的文件中,并对它们进行预处理,以使它们与从其他图像中绘制的其他面部相媲美.这些都是他们自己的巨大主题.我已经看到人们使用肤色和基于纹理的方法来完成一些很好的工作来剪切不是面部的图像组件,但是这些也很容易受到训练数据的变化的影响.颜色铸造特别难以控制,这就是为什么图像的灰度转换和/或小波表示很受欢迎的原因.
机器学习是FR系统中许多重要过程的基石,因此我无法强调良好的训练数据的重要性.那里有很多学习算法,但在我看来最重要的是朴素的贝叶斯分类器; 随着训练数据集的大小增加,其他方法会聚合贝叶斯,因此如果您计划使用较小的数据集,则只需要花哨.请记住,训练数据的质量将决定整个系统的成败,只要它是可靠的,您就可以从为支持企业而编写的算法森林中挑选您喜欢的任何树.
编辑:对您的训练数据进行良好的健全性检查是计算探头和图库图像的平均面数.(这正是它听起来的样子;在控制图像大小之后,取每个图像的RGB通道的总和,并将每个像素除以图像的数量.)预处理越好,平均面部看起来就越多.如果两个平均面孔看起来像不同的人 - 不同的性别,种族,头发颜色,等等 - 这是一个警告信号,表明您的训练数据可能不适合您的想法.