如何在 OpenCV 中检测这是谁的脸?

How to detect whose face this is in OpenCV?

我有一组带名字的人脸肖像图片(2k)。我有一个高清视频流,可以在其中检测到人脸并对其进行跟踪。对于每一帧的每个人,我说了 5-10 个相似但不同的相框块,尺寸为 20x20 到 100x100。我想知道在 Python 或 C++ 中将我检测到的面部与 OpenCV 中的给定肖像相关联的方法是什么?

While writing all that below I remembered this thing, that is the first google result for "face recognition", but I never really tried it, so can't comment.

根据您描述的设置,Eigenfaces 可以在一定程度上发挥作用。如果把舞台抬高一点,在讲台上装个摄像头,大家大部分时间都直视就好了,可惜

我将尝试列出您可以 do/try 改善结果的事项,排名不分先后。

  • 我个人主要处理神经网络,所以我的第一个猜测是尝试 OpenFace,但这是一种相当昂贵的训练方法和 运行(需要一个包含多张图片的更大数据库每人等;每张脸的识别时间最多一秒),这对于这项任务来说可能有点矫枉过正。也许你会发现一些有趣的东西 here.

  • 您遇到的第一个问题是数据库中的图片可能是人像照片,但相机会相对于 it.You 将它们面朝下拾取,在识别之前需要进行一些预处理以针对此进行调整取决于角度。好消息是人们坐得越远,面部扭曲越小,即使质量更差。有两种方法。

    1. 一种是提取不同的特征(眼睛+鼻尖)并进行仿射变换,直到它们符合相当简单的标准,但是你会丢失一些信息,比如鼻子长度等。你必须做训练前的数据库图片也是如此。
    2. 另一种是自己动手,利用图片中的人脸ROI坐标,并以此为基础进行变换。它更容易,现在我认为它甚至可能更可靠。然而,它不能纠正面部倾斜和其他一些问题。

如果角度太大,一切都可能会分崩离析,但我知道。

  • 第二件事是基于事实的启发式,它是视频而不是静态镜头。我们将其用于车牌识别,但它非常简单。这个想法是你有一个对象数组,这些对象是被识别的面孔。您检查检测到的人脸是否对应于预先存在的对象之一的每一帧。这些因素是与过去分类器响应的距离和相似性。您根据您对特定猜测的信心积累来记录分类器的响应及其做出的猜测(这里有很多启发式方法,例如如果没有接近的替代猜测则积累更多,考虑检测器响应等)。一旦你在某个帧中没有检测到那张脸,你就可以让对象在任意时间内保持活动状态,甚至可以在特定区域再次使用宽松的参数检测 运行 检测器。我希望你明白我的意思。这只是启发式的一大堆。

  • 然后在对某些视频进行 运行 识别后,您可以获取一些识别出高置信度的人脸帧(或手动过滤)并 运行 更多训练他们来强化模型。

  • 如果人有 sunglasses/baseball 上限并相应调整,可能还会增加一小步更改。 (我会说太多的干扰,你应该放弃,但你可以在训练中添加相应的案例或以其他方式处理它)它不应该增加太多的处理时间,因为检测太阳镜有足够的信心应该太难了。在处理车牌时,我们有一整个级联的微型神经网络在大神经网络开始行动之前检查各种事情。

  • 我注意到大多数人脸检测器return ROI 太小(比如剪头发等),可能想扩大一点,但可能没有必要。