ZH ·
🌏 English

如何为 face_recognition 开启 CUDA GPU 加速支持

face_recognition 是一个功能强大且易于使用的 Python 人脸识别库,支持人脸检测、特征编码和比对等核心功能。然而,该库默认通过 pipconda 安装时并不开启 GPU 加速,仅依赖 CPU 进行计算。

由于 face_recognition 的核心计算依赖于 dlib,若要实现 GPU 加速,必须手动编译支持 CUDA 和 cuDNN 的 dlib 版本。以下是具体的实现步骤。

核心步骤:编译支持 CUDA 的 dlib

按照官方建议,开启 CUDA 支持的安装流程如下:

1. 准备环境

首先,创建一个新的 Conda 环境:

$ conda create -n dlib python=3.8 cmake ipython
$ conda activate dlib

2. 安装 CUDA 和 cuDNN

使用 NVIDIA 的频道安装必要的 CUDA 工具包:

$ conda install cuda cudnn -c nvidia

记录下当前环境下 nvcc 的路径,后续编译时需要用到:

$ which nvcc
/path/to/your/miniconda3/envs/dlib/bin/

3. 从源码编译安装 dlib

克隆并编译支持 CUDA 的 dlib

$ git clone https://github.com/davisking/dlib.git
$ cd dlib
$ mkdir build
$ cd build
$ cmake .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1 -DCUDAToolkit_ROOT=/path/to/your/miniconda3/envs/dlib/bin/
$ cmake --build .
$ cd ..
$ python setup.py install --set DLIB_USE_CUDA=1

4. 验证安装

进入 Python 环境检查 CUDA 支持情况:

(dlib) $ ipython
In [1]: import dlib
In [2]: dlib.DLIB_USE_CUDA
Out[2]: True
In [3]: print(dlib.cuda.get_num_devices())
1

如果输出如上,则说明 dlib 已成功开启 CUDA 支持,face_recognition 也将自动获得 GPU 加速能力。我在 Docker 环境(Ubuntu 20.04, CUDA 11.3, cuDNN 8.2.1, Python 3.8)中验证了该流程。


讨论

简洁性

face_recognition 的优势在于其极简的 API 设计。例如,人脸检测仅需几行代码:

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)

通过获取人脸编码(Encoding),可以轻松实现人脸比对功能:

import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0]:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

准确性

虽然 face_recognition 号称“世界上最简单的人脸识别库”,但其基于 dlib 的模型在 LFW 数据集上的准确率为 99.38%,在当前标准下只能算中规中矩。如果您的项目对识别精度要求极高,建议考虑使用 insightface,其模型在 LFW 上的准确率通常能达到 99.7% 以上。


总结

face_recognition 非常适合快速原型开发,但其默认的 CPU 模式在处理多张人脸或实时视频流时,会产生严重的计算负载,导致系统卡顿。通过重新编译 dlib 开启 CUDA 支持,可以将计算压力转移到 GPU,显著提升处理性能。

建议在 Linux 环境下进行开发,若担心环境配置冲突,Docker 是一个极佳的隔离方案。Docker 不仅支持 GPU 直通,还能方便地挂载网络或 USB 摄像头进行实时测试。

参考资料: