4

这个有启发性的 kaggle 比赛的介绍的最后,他们指出“ Viola 和 Jones 的开创性论文中使用的方法非常有效”。然而,那篇论文描述了一个二元面部识别系统,解决的问题是关键点的分类,而不是整个图像。我很难弄清楚我将如何调整 Viola/Jones 系统以进行关键点识别。

我假设我应该为每个关键点训练一个单独的分类器,我的一些想法是:

  • 迭代固定大小的子图像并对每个子图像进行分类,其中以关键点为中心像素的图像是一个正例。在这种情况下,我不确定如何处理靠近图像边缘的像素。

  • 不是训练二元分类器,而是训练具有 l*w 个可能类的分类器(每个像素一个)。最大的问题是我怀疑它会非常慢,因为每个弱分类器突然必须做 l*w*original 操作

  • 我的第三个想法并没有完全在我的脑海中浮出水面,但是由于关键点是脸部大部分的每个部分(例如眼睛的左、右中心),也许我可以尝试对子进行分类图像只是一只眼睛,然后使用每个面部部分的最佳拟合子图像的左、右和中心像素(以 y 坐标为中心)

这些想法有什么优点吗,有没有我没有想到的方法?

4

2 回答 2

3

然而,该论文描述了一种用于二进制面部识别的系统

不,请仔细阅读论文。他们描述的不是特定的面部,面部检测是激励问题。Viola Jones 的论文介绍了一种新的二进制对象识别策略。

你可以训练一个 Viola Jones 风格的 Cascade 用于眼睛,另一个用于鼻子,一个用于你感兴趣的每个关键点。

然后,当您运行代码时 - 您应该(希望)为每张脸获得 2 只眼睛、1 个鼻子等。

如果你得到了你期望的项目数量,你就可以说“这里是关键点!” 需要更多的工作是获得足够的数据来为您想要检测的每件事构建一个好的检测器,并优雅地处理误报/误报。

于 2013-10-23T04:43:59.477 回答
0

我最终广泛地解决了这个问题。我使用了“深度学习”,也就是多层神经网络。我使用了卷积网络。您可以通过查看这些演示了解更多关于它们的信息:

http://cs.stanford.edu/people/karpathy/convnetjs/demo/mnist.html

http://deeplearning.net/tutorial/lenet.html#lenet

我对典型的卷积网络进行了以下更改:

  • 我没有进行任何下采样,因为任何精度损失都会直接转化为模型分数的下降

  • 我进行了 n 路二进制分类,每个像素都被分类为关键点或非关键点(我在原始帖子中列出的内容中的#2)。正如我所怀疑的,计算复杂性是这里的主要障碍。我尝试使用我的 GPU 来克服这些问题,但是神经网络中的参数数量太大而无法容纳在 GPU 内存中,因此我最终使用了一个 xl amazon 实例进行训练。

这是一个 github 存储库,其中包含我所做的一些工作: https ://github.com/cowpig/deep_keypoints

无论如何,鉴于深度学习已经大受欢迎,肯定有人在这方面做得比我好得多,并发表了有关它的论文。这是一篇看起来不错的文章:

http://danielnouri.org/notes/2014/12/17/using-convolutional-neural-nets-to-detect-facial-keypoints-tutorial/

于 2015-08-27T16:37:01.093 回答