如何处理人脸识别(通过 api 调用处理)而不会在网络摄像头流中出现延迟



我正在使用flask-python框架,opencv和face_recognition库来做人脸识别。我正在尝试使用 python -opencv 运行网络摄像头,如果在帧中检测到人脸,它将被发送到处理帧并执行该人的识别的后端,但这个带有响应的 api 调用大约需要 0.3 秒,这种延迟导致网络摄像头流畅流动的滞后。

我想要的是网络摄像头连续运行,当在帧中检测到人脸时,它不应该阻止网络摄像头流的自由流动,而是在主线程运行时在后台单独处理此帧的处理网络摄像头。

非常感谢这方面的任何帮助

您可以采取许多措施来解决此问题,

  1. 不要将每一帧都传递到检测中,很可能您使用的是良好的网络摄像头,它可以为您提供 30FPS 或更高,您不需要如此高的 FPS 进行实时检测,您可以做的是,仅发送每 3 或第 4 帧进行检测,而对于其他帧,只需将旧框绘制到流中, 这将为您提供足够准确的预测

  2. 将您的模型转移到 GPU,face_recognition让您在使用 CPU 和 GPU(仅限 CNN(之间进行选择,将其转移到任何可用的 GPU 上将加快该过程

  3. 调整输入帧的大小,您真的不需要 1080p 高清帧来检测帧,像 480p 这样更小的东西也可以(尽管这完全取决于您的问题(,调整帧大小并使其变小,输入矩阵越小越快

  4. 矢量化你的操作,而不是使用默认的face_recognition API进行身份比较,我建议你在numpy中编写一个矢量化版本的比较,计算大矩阵中的L2距离,而不必循环进行,这将节省大量的计算成本。

  5. 限制每个人的比较次数。你可以有 10 个人 A 的嵌入和 10 个人 B 的嵌入,找到这 20 个嵌入中的每一个的未知嵌入的距离,计算成本可能很高,比如通过聚类来获取平均嵌入或这些嵌入的质心

最新更新