为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

至尊宝的传说 2021-07-13 17:14:38
我有一组带有名字的人脸肖像图像(2k)。我有一个高清视频流,我在上面检测到人脸并跟踪它们。对于每一帧上的每个人,我已经说了 5-10 个相似但不同的相框块,大小为 20x20 到 100x100。我想知道用 Python 或 C++ 将我检测到的人脸与 OpenCV 中的给定 porttraint 相关联的方法是什么?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

在写下面的所有内容时,我想起了这件事,这是“面部识别”的第一个谷歌结果,但我从未真正尝试过,因此无法发表评论。

使用您描述的设置,特征脸将在一定程度上起作用。最好把舞台稍微抬高一点,在讲台上安装摄像头,这样大多数时候每个人都直视它,但可惜。

我只会尝试列出您可以做的事情/尝试不按特定顺序改进结果。

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

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

    1. 一种是选择不同的特征(眼睛+鼻尖)和仿射变换,直到它们符合相当简单的标准,但你会丢失一些信息,比如鼻子长度等。而且你必须在之前对数据库图片做同样的事情你训练。

    2. 另一种是通过使用图片中的人脸 ROI 坐标并在此基础上进行变换来自己完成。它更容易,现在我想它甚至可能更可靠。然而,它不能纠正面部倾斜和其他一些事情。

如果角度太大,这一切都可能会分崩离析,但是idk。

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

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

  • 如果有人戴太阳镜/棒球帽,也可能会增加一小步改变并相应地调整。(我会说干扰太多,你应该放弃,但你可以将相应的案例添加到训练中或以其他方式处理)它不应该增加太多处理时间,因为检测足够自信的太阳镜应该不要太难。在处理车牌时,我们有一连串的小神经网络在大神经网络开始行动之前检查各种事情。

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


查看完整回答
反对 回复 2021-07-21
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信