本页介绍优化 face_recognition 库性能的技术和策略。该库提供了多种内置方法来提高处理速度和效率,这在处理实时视频流、大批量图像或资源受限环境时尤为重要。
有关实时人脸识别实现的信息,请参阅 实时识别。
人脸识别是计算密集型的,有几个步骤可能成为瓶颈
该库的基准测试结果表明,人脸检测在图像尺寸增大时会呈指数级变慢,而其他操作的缩放则更趋于线性。
该库支持多种优化方法,可以组合使用以获得最佳效果
处理更小的图像可以大大减少计算时间,尤其对于人脸检测。
实现
1. Resize input image to 1/4 size (both width and height)
2. Process the smaller image
3. Scale results (face locations) back to original dimensions
来源: examples/facerec_from_webcam_faster.py6-8 examples/facerec_from_webcam_faster.py47-48 examples/facerec_from_webcam_faster.py80-85
对于视频处理,分析每 N 帧可以减少 CPU 使用率,同时保持可接受的响应速度。
来源: examples/facerec_from_webcam_faster.py8-9 examples/facerec_from_webcam_faster.py39-46 examples/facerec_from_webcam_faster.py76
该库支持两种人脸检测模型
| 模型 | 速度 | 准确率 | 最佳使用场景 |
|---|---|---|---|
| HOG (默认) | 更快 | 良好 | 实时应用,移动设备 |
| CNN | 更慢 | 更好 | 批量处理,困难角度,小人脸 |
使用CNN模型
一次函数调用处理多个人脸比单独处理更有效率。
来源: examples/identify_and_draw_boxes_on_faces.py29-31
预先计算已知人脸的人脸编码,并将其存储起来,而不是在每次运行时重新编码。
来源: examples/facerec_from_webcam_faster.py17-23 examples/facerec_from_webcam_faster.py25-33
该库包含一个基准测试工具,可以测量不同分辨率下的性能。这对于建立基准和衡量优化效果很有用。
基准测试生成的关键指标
来源: examples/benchmark.py9-14 examples/benchmark.py17-21 examples/benchmark.py66-77
此图说明了在优化的网络摄像头示例中如何组合多种优化技术
来源: examples/facerec_from_webcam_faster.py41-104
根据您的用例,使用此决策树选择合适的优化技术
优化时,请考虑这些权衡
| 技术 | 性能增益 | 准确性影响 |
|---|---|---|
| 分辨率缩减 (1/2) | 约 3-4 倍速 | 轻微损失 |
| 分辨率缩减 (1/4) | 约 10-15 倍速 | 中度损失 |
| 帧跳过 (隔帧) | 2 倍速 | 时间延迟 |
| HOG 而非 CNN | 2-3 倍速 | 困难姿势的检测率较低 |
| 较小的批次大小 | 内存占用更少 | 整体速度较慢 |
来源: examples/benchmark.py9-77 examples/facerec_from_webcam_faster.py5-9
GPU 加速:如果您拥有兼容 CUDA 的 GPU 以及使用 CUDA 支持编译的适当 dlib 版本,CNN 人脸检测器可以使用 GPU 加速。
多进程:对于处理大量图像,请考虑使用 Python 的 multiprocessing 库来利用多个 CPU 核心。
管道设计:在视频处理应用中,请考虑实现管道模式,其中检测、编码和匹配在单独的线程或进程中运行。
输入格式优化:在某些情况下,可以通过修改图像捕获管道来优化 BGR 到 RGB 格式(处理必需)的转换。
来源: examples/facerec_from_webcam_faster.py50-51
本页提供了优化人脸识别性能的指南。最佳方法通常涉及结合多种技术并进行测试,以找到适合您特定用例的最佳配置。