如何在不延迟网络摄像头流的情况下处理人脸识别(通过api调用处理)

时间:2018-10-15 10:14:02

标签: python multithreading opencv flask face-recognition

我正在使用flask-python框架,opencv和face_recognition库进行人脸识别。我正在尝试使用python -opencv运行网络摄像头,如果在框架中检测到人脸,则会将其发送到后端,在该处处理框架并进行人的识别,但是此带响应的api调用大约需要0.3秒,这种延迟导致网络摄像头的顺畅滞后。

我想要的是网络摄像头连续运行,并且当在框架中检测到人脸时,它不应阻止网络摄像头流的自由流动,而是应在后台分别处理该框架,而主要线程正在运行网络摄像头。

在这方面的任何帮助都将受到赞赏

1 个答案:

答案 0 :(得分:0)

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

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

  2. 将模型转移到GPU,face_recognition使您可以选择使用CPU和GPU(仅限cnn),将其转移到任何可用的GPU上均可加快处理过程

  3. 调整输入帧的大小,您实际上不需要1080p HD帧来检测帧,像480p这样的较小帧也可以(尽管这完全取决于您的问题),调整帧的大小并使其更小,输入矩阵越小

  4. 对您的操作进行矢量化处理,而不是使用默认的face_recognition API进行身份比较,我建议您以numpy编写矢量化版本的比较代码,该代码可在大型矩阵中计算L2距离,而不必循环执行,这将节省大量的计算成本。

  5. 限制每人的比较次数。您可能有一个人A的10个嵌入和人B的10个嵌入,用这20个嵌入中的每一个找到未知嵌入的距离,可能在计算上昂贵,诉诸于做类似的事情,取平均嵌入,或这些嵌入的质心,通过将它们聚类