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

Python 如何在OpenCV中检测这是谁的脸?,python,c++,opencv,detection,Python,C++,Opencv,Detection,我有一套有名字的人像照片(2k)。我有一个高清视频流,在上面我检测到人脸并跟踪它们。对于每个相框上的每个人,我说有5-10个类似但不同的相框块,尺寸为20x20到100x100。我想知道在Python或C++中,我的检测到的人脸与OpenCV中的给定图片的关联方式是什么? 当我在下面写这些的时候,我记得,这是谷歌第一个“人脸识别”的结果,但我从未真正尝试过,所以不能发表评论 使用您描述的设置,特征面将在一定程度上起作用。这将是理想的,如果舞台是提高了一些和摄像机安装在领奖台上,使大多数时间大家都

我有一套有名字的人像照片(2k)。我有一个高清视频流,在上面我检测到人脸并跟踪它们。对于每个相框上的每个人,我说有5-10个类似但不同的相框块,尺寸为20x20到100x100。我想知道在Python或C++中,我的检测到的人脸与OpenCV中的给定图片的关联方式是什么? 当我在下面写这些的时候,我记得,这是谷歌第一个“人脸识别”的结果,但我从未真正尝试过,所以不能发表评论

使用您描述的设置,特征面将在一定程度上起作用。这将是理想的,如果舞台是提高了一些和摄像机安装在领奖台上,使大多数时间大家都直视它,但唉

我将试着列出你可以做的事情/尝试改进结果,没有特别的顺序

  • 我个人主要处理神经网络,所以我的第一个猜测是尝试OpenFace,但这是一种训练和运行都相当昂贵的方法(需要一个更大的数据库,每个人有多张图片等;每个人脸的识别时间高达一秒钟),而且这可能是一种过度的任务。也许你会发现一些有趣的东西

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

  • 一种方法是提取不同的特征(眼睛+鼻尖)和仿射变换,直到它们与标准匹配(这很简单),但会丢失一些信息,如鼻子长度等。在训练之前,您必须对数据库图片执行相同的操作
  • 另一种方法是自己使用图片中的人脸ROI坐标,并在此基础上进行变换。这更容易,现在我想它可能更可靠。然而,这并不能纠正面部倾斜和其他一些问题
如果角度太大,一切都可能崩溃,但idk

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

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

  • 如果一个人戴着太阳镜/棒球帽,还可以增加一小步改变,并进行相应调整。(我会说干扰太大,你应该放弃,但你可以在训练中加入相应的案例,或者以其他方式处理)这不应该增加太多的处理时间,因为有足够信心检测太阳镜应该不会太难。在处理号码牌时,我们有一系列的小NN在大NN开始行动之前检查各种各样的东西

  • 我注意到大多数人脸检测器返回的ROI太小(如剪掉头发等),可能需要将其扩大一点,但可能没有必要


人脸识别并不容易。绝对不是那么简单的答案。使用20x20时,误差将非常大,如果头部角度与数据库照片有任何不同,则完全无用。在我知道我是否能提供帮助之前,请提供更多的细节。数据库中每个人只有一张照片吗?同时与几个人进行实时识别也不太可能。你能制作一个人工识别的人脸矩形数据库吗?@IcedLance:每人一张照片,比如市政厅会议的高清视频——舞台上方的摄像头是静态的。离线识别。到目前为止,我只想到了特征脸,但我想知道,拥有相同人脸图像序列(具有如此低的分辨率)会有什么帮助\改变。。