我正在使用flask-python框架,opencv和face_recognition库进行人脸识别。我正在尝试使用python -opencv运行网络摄像头,如果在框架中检测到人脸,则会将其发送到后端,在该处处理框架并进行人的识别,但是此带响应的api调用大约需要0.3秒,这种延迟导致网络摄像头的顺畅滞后。
我想要的是网络摄像头连续运行,并且当在框架中检测到人脸时,它不应阻止网络摄像头流的自由流动,而是应在后台分别处理该框架,而主要线程正在运行网络摄像头。
在这方面的任何帮助都将受到赞赏
答案 0 :(得分:0)
您可以采取许多措施来解决此问题,
不要将每一帧都传递给检测,很可能是您使用的网络摄像头质量很好,可以提供30FPS或更高的帧率,您不需要如此高的FPS进行实时检测,您可以做的只是发送第3或第4帧进行检测,对于其他帧,只需在流中绘制旧框即可,这将为您提供足够准确的预测
将模型转移到GPU,face_recognition使您可以选择使用CPU和GPU(仅限cnn),将其转移到任何可用的GPU上均可加快处理过程
调整输入帧的大小,您实际上不需要1080p HD帧来检测帧,像480p这样的较小帧也可以(尽管这完全取决于您的问题),调整帧的大小并使其更小,输入矩阵越小
对您的操作进行矢量化处理,而不是使用默认的face_recognition API进行身份比较,我建议您以numpy编写矢量化版本的比较代码,该代码可在大型矩阵中计算L2距离,而不必循环执行,这将节省大量的计算成本。
限制每人的比较次数。您可能有一个人A的10个嵌入和人B的10个嵌入,用这20个嵌入中的每一个找到未知嵌入的距离,可能在计算上昂贵,诉诸于做类似的事情,取平均嵌入,或这些嵌入的质心,通过将它们聚类