是否可以即时检测使用面部识别的人?

数据挖掘 Python 优化 opencv
2022-02-27 21:56:48

我正在开发一个使用face_recognitionopencv库在 Python 中进行人脸检测的小型应用程序。

我已经对一些人的数据进行了训练,并使用人脸识别登录到应用程序。

如果它从图片中检测到此人,则允许他登录,否则将它们发送到该人必须上传他的照片和其他信息的注册屏幕。

因此,如果有新的注册,我必须使用附加数据再次运行模型。

随着条目数量的增加,模型将花费更多时间,从而影响识别新注册人的时间。

我该如何为这种减速做好准备?

我可以减少再次训练模型或使用增量数据训练模型所需的时间吗?

3个回答

如果您需要重新训练模型以对新面孔进行分类,这将无法很好地扩展到常规注册新人。除非仔细监控训练程序,否则您在新注册期间也可能会出现准确性故障。

相反,需要注册新项目的识别系统通常不会重新训练。他们接受了分离物体的一般任务的训练——识别它们是否不同或它们有什么不同。

实现这种分离的一种常见方法是使用 NN 将人脸图像映射到描述性向量,并根据距离将每个新图像与存储的个人资料图片向量进行匹配。距离,即使到最近的存储向量,也应该很小,以便将其视为成功匹配。然后,注册新用户只需保存从神经网络计算的新向量嵌入。匹配可以通过数据库查找来完成——它们仍然受限于你可以多快地进行距离计算来寻找匹配,但你只需要向前运行一次 NN。距离计算可以是快速和批量的——它应该很容易使用,例如 tensorflow 或 torch 在几分之一秒内计算 1000 个潜在匹配。

为了确保根据人脸的差异对人脸进行很好的分类,忽略光照、姿势、发型等,需要在训练网络时牢记这一目标。一种方法是使用两对图像进行三元组损失训练,一个应该匹配,另一个不应该匹配。

Andrew Ng 的 CNN 课程很好地涵盖了这种方法,从这个讲座开始

我遇到了类似的问题。我所做的如下。

  1. 将每个人脸提取的特征保存在文件中。

  2. 再次运行模型时加载这些特征。

尽管完成成功的工作项目需要一些时间,但结果令人满意。

我面临着完全相同的挑战,这是我的解决方案,它对我有用。

登记:

  1. 提取编码并将其保存在PostgreSQL数据库中

确认

  1. 提取未知人脸的编码
  2. 使用存储在PostgreSQL数据库中的现有编码计算距离
  3. 根据您的阈值,您可以采取行动 - 允许或拒绝

你可以在任何数据库中实现它,我选择的原因PostgreSQL是它内置的CUBE datatype支持。使用这种方法,您不必重新训练整个图像集以添加新的配准,也可以实现 1-N 比较并获得良好的性能。

在此处查看实施细节,并在此处查看有关改进整体系统结果的更多细节。