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

时间:2018-10-17 08:38:56

标签: python c++ opencv detection

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

1 个答案:

答案 0 :(得分:2)

  

在下面写下的所有内容我都记得this thing,这是google首次针对“面部识别”的结果,但我从未真正尝试过,因此无法发表评论。

使用您描述的设置,Eigenfaces将在一定程度上起作用。理想的情况是,将舞台抬高一点,并在讲台上安装摄像头,这样大多数时候所有人都可以直视它,但是a。

我将尝试列出您可以做/可以尝试以无特定顺序改善结果的事情。

  • 我个人主要是与神经网络打交道,所以我的第一个猜测是尝试使用OpenFace,但这是一种既昂贵又训练和运行的方法(需要一个更大的数据库,每人需要多张图片,等等;识别时间最多每张面孔一秒钟),可能对这项任务来说是一个过大的杀伤力。仍然可能会here为您找到一些有趣的东西。

  • 您遇到的第一个问题是数据库中的图片可能是人像照片,但是相机会将它们朝下相对地拾取。您需要进行一些预处理,然后才能根据角度进行调整以进行识别。好消息是,即使质量较差,人们坐得越少,脸部变形就越小。有两种方法可以做到。

    1. 一种方法是拾取独特的特征(眼睛+鼻尖)并进行仿射变换,直到它们符合相当简单的标准,但是您会丢失一些信息(例如鼻子长短等)。对于训练之前数据库图片。
    2. 另一种方法是自己使用图片中的人脸ROI坐标并基于此进行变换。现在,它变得更容易,而且我认为它可能甚至更可靠。但是,它不能纠正面部倾斜和其他一些问题。

如果角度太大(但idk),一切可能会崩溃。

  • 第二件事是基于事实的启发式方法,它是视频而不是静止镜头。我们将其用于车牌识别,但是非常简单。这个想法是您有一个被识别为面孔的对象数组。您检查是否检测到的脸部的每一帧都对应于一个预先存在的对象。这些因素是与过去分类器响应的距离和相似性。您可以基于对特定猜测的置信度来记录分类器的响应及其做出的猜测(此处有很多启发式方法,例如在没有紧密替代猜测的情况下进行更多累积,将检测器的响应考虑在内等)。一旦在某个帧中没有检测到该面部,您就可以在任意时间使对象保持活动状态,甚至可以使用放松的参数再次在特定区域上运行检测器。你希望我能想到。那只是试探法的一大堆。

  • 然后在对某些视频进行识别后,您可以拍摄出具有高置信度的面部识别帧(或手动过滤),并对它们进行更多的训练以增强模型。

  • 如果人戴上墨镜/棒球帽,可能还会增加一小步的更改,并相应地进行调整。 (我会说太多的干扰,您应该放弃,但是您可以在培训中添加相应的案例,或者以其他方式进行处理)它不应增加处理时间,因为检测具有足够自信的太阳镜不应该不会太难。在处理车牌时,我们有一系列小型NN来检查各种事情,甚至在大型程序开始行动之前。

  • 我注意到大多数人脸检测器返回的ROI太小(例如剪掉头发等),可能想稍微扩大一下,但可能没有必要。