Python使用OpenCV2多线程做人脸识别时CPU占用过高如何优化?
OpenCV+FaceNet RTSP人脸识别项目CPU占用过高优化方案
问题原因分析
你的代码初始CPU占用高的核心原因有两个:
- 两个子线程都是无阻塞死循环,只要CPU空闲就会全速执行,哪怕RTSP流帧率仅为20~30fps,线程每秒也会跑上百次无效循环,白白消耗CPU资源
- PyTorch默认会占用所有可用CPU核心跑推理,加载FaceNet模型后会进一步拉高CPU占用
已验证有效优化方案
你目前在非帧读取线程添加time.sleep(0.2)的方案已经可以解决大部分问题,符合考勤场景下渲染、识别不需要太高帧率的需求,可将CPU占用控制在合理范围。如果需要进一步优化,可参考以下方案:
- 限制PyTorch CPU推理核心数
不需要让PyTorch占用全部CPU核心跑人脸识别推理,在代码初始化阶段添加如下配置即可,2~4个核心完全足够支撑FaceNet的低频次推理:import torch torch.set_num_threads(2) - 优化帧读取线程逻辑
帧读取线程也可以添加短时长sleep,比如time.sleep(0.01),不会出现丢帧问题,同时还能进一步降低空转消耗;另外建议用队列代替全局变量传递帧,队列满时主动丢弃旧帧,避免多线程读写全局变量出现半帧、处理过期帧的问题。 - 增加人脸检测前置过滤
不要直接对整帧跑FaceNet推理,先用人脸检测算子(比如MTCNN、OpenCV自带的Haar级联人脸检测)筛选出有人脸的区域,没有人脸时直接跳过后续推理步骤,大幅减少不必要的计算开销。 - 启用硬件加速
如果部署设备有支持CUDA的N卡,可将模型迁移到GPU上推理,几乎不会占用CPU资源:
也可以编译带硬件解码支持的OpenCV版本,用GPU硬解RTSP流,降低CPU解码的资源占用。resnet = InceptionResnetV1(pretrained='vggface2').eval().to('cuda')
内容的提问来源于stack exchange,提问作者Dhiren Jaypal
相关产品推荐
相关产品推荐

