我尝试使用Python实现面部识别算法。我希望能够接收图像目录,并计算它们之间的成对距离,当短距离应该有希望对应于属于同一个人的图像。最终目标是聚类图像并执行一些基本的面部识别任务(无监督学习)。
由于无监督设置,我对此问题的处理方法是计算"人脸签名" (某些内容的R ^ d中的向量)然后弄清楚一个度量,其中属于同一个人的两个面孔之间的距离确实很短。
我有一个人脸检测算法,可以检测人脸,裁剪图像并执行一些基本的预处理,因此输入算法的图像是灰色的并且均衡(见下文)。
对于"面部签名"部分,我尝试过两种方法,我在几篇出版物中读过这些方法:
为了比较两个签名,我使用OpenCV的compareHist函数(参见here),尝试了几种不同的距离度量(Chi Square,Euclidean等)。
我知道面部识别是一项艰巨的任务,更不用说没有经过任何培训,所以我不期待很好的结果。但是到目前为止所有我看来完全随机。例如,当计算最右边的图像与图像其余部分的距离时,我得到的是她最多的类似于4 Bill Clintons(......!)。
我在this精彩的演示文稿中读到,在测试集上执行"度量学习" 程序很受欢迎改善结果。然而,它确实在演示文稿和其他地方说过"定期"距离测量也应该得到好的结果,所以在我尝试这个之前我想知道为什么我做的事情什么也没有给我带来任何好处。
总之,我的问题,我很乐意获得任何帮助:
我改进的一个改进是仅在实际面上执行LBP,而不是角落和可能在签名上插入噪声的所有内容。在计算LBP之前,如何屏蔽掉不是面部的部分?我也在这部分使用OpenCV。
我对计算机视觉还很陌生;我将如何进行"调试"我的算法弄清楚出了什么问题?这可能吗?
在无监督的设置中,是否有其他方法(不是局部描述符+计算距离)可以用于聚类面部的任务?
OpenCV模块中是否有其他内容可能我没有想过可能会有所帮助?似乎所有的算法都需要训练,在我的情况下没用 - 算法需要处理全新的图像。
提前致谢。
答案 0 :(得分:4)
您正在寻找的是无监督的特征提取 - 拍摄一堆未标记的图像并找到描述这些图像的最重要的特征。
用于无监督特征提取的最先进方法都基于(卷积)神经网络。查看自动编码器(http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity)或限制性玻尔兹曼机器(RBM)。
您还可以使用现有的面部检测器,例如DeepFace(https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf),仅采用要素图层并使用它们之间的距离将相似的面部组合在一起。
我担心OpenCV不适合这项任务,你可能想检查Caffe,Theano,TensorFlow或Keras。