Python face_recognition 库实战:从环境搭建到人脸特征点检测
1. 环境准备搭建人脸识别的开发环境第一次接触人脸识别开发时最让人头疼的就是环境配置。记得我刚开始用face_recognition库时光是安装依赖就折腾了大半天。后来才发现其实只要掌握几个关键步骤整个过程可以非常顺畅。首先需要安装Python环境推荐使用Python 3.7及以上版本。我个人习惯用Anaconda来管理Python环境这样可以避免不同项目之间的依赖冲突。创建一个新的conda环境非常简单conda create -n face_recog python3.8 conda activate face_recog接下来就是安装face_recognition库的核心依赖。这个库底层使用了dlib的人脸识别算法而dlib又依赖CMake和C编译工具。在Windows系统上你需要先安装Visual Studio的C构建工具。这里有个小技巧不需要安装完整的Visual Studio只需要安装Build Tools for Visual Studio就足够了。安装完构建工具后建议按这个顺序安装Python包pip install cmake pip install dlib pip install face_recognition pip install opencv-python我实测过多次这个顺序能最大程度避免安装报错。特别是dlib的安装如果先装face_recognition再装dlib经常会遇到各种奇怪的错误。2. 基础使用检测图片中的人脸环境准备好后我们就可以开始实际的人脸检测了。face_recognition库最强大的地方在于它的API设计非常简洁几行代码就能实现强大的功能。先来看一个最简单的例子 - 检测单张图片中的人脸位置import face_recognition import cv2 # 加载图片 image face_recognition.load_image_file(test.jpg) # 查找所有人脸位置 face_locations face_recognition.face_locations(image) print(f找到 {len(face_locations)} 张人脸) # 用OpenCV绘制矩形框 image cv2.cvtColor(image, cv2.COLOR_RGB2BGR) for (top, right, bottom, left) in face_locations: cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2) cv2.imshow(Detected Faces, image) cv2.waitKey(0)这段代码做了几件事用face_recognition加载图片调用face_locations方法获取所有人脸的位置坐标使用OpenCV在检测到的人脸周围绘制绿色矩形框face_locations返回的是一个包含多个元组的列表每个元组代表一张人脸的位置(top, right, bottom, left)。这里有个实用技巧face_recognition默认使用HOG模型进行人脸检测速度较快但精度稍低。如果你需要更高精度的检测可以传入modelcnn参数face_locations face_recognition.face_locations(image, modelcnn)不过要注意CNN模型需要更多的计算资源在CPU上运行会比较慢。3. 进阶功能提取面部特征点人脸检测只是基础face_recognition库更强大的功能在于它能够精确定位面部的关键特征点。这些特征点包括眼睛、眉毛、鼻子、嘴唇等部位对于人脸分析、表情识别等应用非常有用。提取面部特征点的代码同样很简单face_landmarks face_recognition.face_landmarks(image) for landmarks in face_landmarks: # 绘制下巴轮廓 for point in landmarks[chin]: cv2.circle(image, point, 1, (0, 255, 0), -1) # 绘制左眉毛 for point in landmarks[left_eyebrow]: cv2.circle(image, point, 1, (255, 0, 0), -1) # 绘制右眉毛 for point in landmarks[right_eyebrow]: cv2.circle(image, point, 1, (255, 0, 0), -1) # 绘制鼻子轮廓 for point in landmarks[nose_bridge]: cv2.circle(image, point, 1, (0, 0, 255), -1) # 绘制嘴唇 for point in landmarks[top_lip]: cv2.circle(image, point, 1, (0, 0, 255), -1) for point in landmarks[bottom_lip]: cv2.circle(image, point, 1, (0, 0, 255), -1) # 绘制眼睛 for point in landmarks[left_eye]: cv2.circle(image, point, 1, (255, 255, 0), -1) for point in landmarks[right_eye]: cv2.circle(image, point, 1, (255, 255, 0), -1)face_landmarks方法返回一个字典列表每个字典对应一张人脸的特征点。字典的键是特征部位名称值是该部位各个点的坐标列表。比如chin键对应的是下巴轮廓的17个点nose_bridge对应的是鼻梁的4个点。在实际项目中我经常用这些特征点来计算一些有用的信息。比如通过眼睛特征点可以计算眼睛的睁开程度判断一个人是否疲劳通过嘴唇特征点可以分析是否在微笑等。4. 性能优化与实用技巧经过几个项目的实战我总结了一些face_recognition库的使用技巧能显著提升开发效率和运行性能。首先是处理速度的优化。默认情况下face_recognition会处理整张图片这在处理高分辨率图片时会很慢。一个实用的技巧是先对图片进行缩放def detect_faces_faster(image_path): image face_recognition.load_image_file(image_path) small_image cv2.resize(image, (0, 0), fx0.25, fy0.25) face_locations face_recognition.face_locations(small_image) # 将坐标转换回原图尺寸 face_locations [(top*4, right*4, bottom*4, left*4) for (top, right, bottom, left) in face_locations] return face_locations这个方法将图片缩小到原来的1/4处理完后再将坐标放大回去。在我的测试中这样处理速度能提升3-5倍而精度损失很小。另一个常见需求是处理视频流。结合OpenCV我们可以实现实时人脸检测video_capture cv2.VideoCapture(0) while True: ret, frame video_capture.read() rgb_frame frame[:, :, ::-1] # BGR转RGB face_locations face_recognition.face_locations(rgb_frame) for (top, right, bottom, left) in face_locations: cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) cv2.imshow(Video, frame) if cv2.waitKey(1) 0xFF ord(q): break video_capture.release() cv2.destroyAllWindows()这里需要注意颜色空间的转换。OpenCV默认使用BGR格式而face_recognition需要RGB格式所以需要进行转换。最后分享一个实际项目中遇到的坑在某些Linux系统上dlib可能会因为AVX指令集的问题导致导入失败。解决方法要么是重新编译dlib要么安装预编译的非AVX版本pip install dlib19.22.0 --no-binary :all: