[树莓派]人脸识别+活体检测 加载2800+人脸数据还能达到20FPS!

本项目采用ncnn推理框架,实现在树莓派上进行实时的人脸检测、识别及活体检测,处理速度可达20FPS,适用于中小型人脸数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

最近一直在学习人脸识别,想做一个能够落地的项目,但是网上的教程要么就只是opencv人脸检测,要么就是帧数太低,用起来很不方便。因此我开源了一个树莓派人脸识别+活体检测的库,在2800+人脸数据的情况下能达到20FPS左右的人脸检测,人脸识别,以及活体检测。

二、介绍

本项目用的是ncnn来作为推理框架部署模型,主要用到的模型有
人脸检测:
mtcnn
人脸识别:
MobileFaceNet
活体检测
Silent-Face-Anti-Spoofing

本项目使用的所有模型和一部分代码均来自GitHub开源项目,非常感谢前人铺好的路,让我成功在树莓派上复现insightfaceFace-Anti-Spoofing

三、表现

活体检测

戴口罩下的识别(库中我的图片没戴口罩)
戴眼罩?

  1. 青色数据是指人脸识别分数(默认阈值0.40)黄色数据是活体检测置信度(默认阈值0.89)

  2. 程序可以从2859张不同人脸的图片中准确找到属于我的那一张,并且戴上口罩还可以识别(鲁棒性一般,后续更新使用retinaface会更加稳定)

  3. 对于一个中小型的人脸数据库,处理速度达到20FPS是完全够的。(调参之后还可以提升)

四、运行

1.首先准备一块树莓派,这里我用的是Raspberry 4B 4G版
2.安装依赖 opencv(读取图片,显示视频,以及显示文字)
我安装的是4.2.0,对于其他版本是否支持不清楚,但是建议使用opencv4
这是一个很好的教程,大家可以参考->opencv安装教程
3.下载项目

git clone https://github.com/XinghaoChen9/LiveFaceReco_RaspberryPi.git
  1. 进入src文件夹,修改livefacereco.hpp中的project_path为你自己的路径

  2. 修改face_thre为true来记录自己的人脸(可选)

  3. 开始编译,在文件夹根目录输入

mkdir build
cd build
cmake ..
make -j4
./LiveFaceReco

运行效果截图

五、可调参数

  1. largest_face_only: 是否只检测最大人脸
  2. record_face: 在下次运行中会每隔两秒检测人脸并且写入img文件夹作为数据库
  3. distance_threshold: 防止过远人脸误检测
  4. face_thre: 人脸识别阈值
  5. true_thre: 活体检测阈值
  6. jump: 跳帧,跳过某几帧的人脸识别和活体检测来加速
  7. input_width: 输入宽度
  8. input_height: 输入高度
  9. output_width: 输出宽度
  10. output_height: 输出高度(注意:输出太大会降低速度)
  11. project_path: 一定设为自己的目录

六、引用及致谢

十分感谢以下列出的项目为我提供模型和代码支持,正是站在巨人的肩上,才能让我们走得更远。

@inproceedings{deng2018arcface, title={ArcFace: Additive Angular
Margin Loss for Deep Face Recognition}, author={Deng, Jiankang and
Guo, Jia and Niannan, Xue and Zafeiriou, Stefanos}, booktitle={CVPR},
year={2019} }

@inproceedings{deng2019retinaface, title={RetinaFace: Single-stage
Dense Face Localisation in the Wild}, author={Deng, Jiankang and Guo,
Jia and Yuxiang, Zhou and Jinke Yu and Irene Kotsia and Zafeiriou,
Stefanos}, booktitle={arxiv}, year={2019} }

@inproceedings{ncnn, title={ncnn https://github.com/ElegantGod/ncnn},
author={ElegantGod}, }

@inproceedings{Face-Recognition-Cpp, title={Face-Recognition-Cpp
https://github.com/markson14/Face-Recognition-Cpp},
author={markson14}, }

@inproceedings{insightface_ncnn, title={insightface_ncnn
https://github.com/KangKangLoveCat/insightface_ncnn},
author={KangKangLoveCat}, }

@inproceedings{Silent-Face-Anti-Spoofing,
title={Silent-Face-Anti-Spoofing
https://github.com/minivision-ai/Silent-Face-Anti-Spoofing},
author={minivision-ai}, }

七、最后

Github开源地址

Bilibili视频检测

欢迎大家在issue区与我讨论,要是觉得帮到你的话,请给我的项目点一个star吧!非常感谢!
要是大家感兴趣的话后面会再继续讲解,以及更新retinaface作为人脸检测器(更加稳定),star超过50会持续更新以及进一步提高FPS!

<think>嗯,用户想要从零开始使用树莓派和dlib进行人脸识别的详细步骤。首先,我需要确定用户的基础水平,可能是一个刚接触树莓派和编程的新手,所以步骤需要详细且易于理解。 首先,树莓派的系统安装和配置是基础。用户可能需要知道如何安装Raspberry Pi OS,并通过SSH或者VNC连接,特别是如果他们没有外接显示器的话。这部分可能需要指导他们使用Raspberry Pi Imager工具,以及如何设置无线网络和启用SSH。 接下来是安装dlib库,这在树莓派上可能会遇到性能问题,因为dlib需要编译,而树莓派的处理器相对较慢。可能需要建议用户使用预编译的版本或者进行一些优化,比如增加交换空间,使用pip安装时的编译选项,或者直接安装dlib的Python wheel,这样可以避免长时间编译。此外,安装依赖库如CMake、OpenCV等也是必须的步骤。 然后,收集人脸数据。这里需要说明如何用摄像头模块或者USB摄像头,使用dlib的人脸检测功能来捕获图像,并保存为数据集。可能需要代码示例,比如使用dlib.get_frontal_face_detector()和cv2.VideoCapture来捕获视频流,并保存检测到的人脸区域。 训练模型部分,用户可能需要了解face_recognition库,它基于dlib,简化了训练过程。需要指导他们如何组织数据集,每个子文件夹代表一个人,然后使用face_recognition库中的train函数来生成编码。这里要注意数据集的大小和多样性,以提高模型准确性。 部署和实时识别则需要结合摄像头实时捕获,加载训练好的模型,进行人脸检测和编码比对。可能需要代码示例,展示如何读取实时视频流,检测人脸,计算编码,并与已知编码比较,计算欧氏距离来判断身份。同时,要提到性能优化,比如降分辨率或帧率,以提高树莓派的处理速度。 常见问题部分,用户可能会遇到安装失败、编译时间长、性能卡顿等问题,需要给出解决方案,比如使用交换文件、预编译库,或者优化代码。此外,参考资源如官方文档和GitHub示例也很重要,特别是用户提到的引用[^1]中的face_recognition库示例,可能需要链接到相关资源。 最后,生成的相关问题需要覆盖硬件选型、性能优化、多脸识别、模型集成和实际应用挑战,帮助用户进一步探索。整个过程中需要确保所有步骤清晰,代码示例正确,并且考虑到树莓派的硬件限制,提供实用的建议。</think>### 从零开始使用树莓派和dlib实现人脸识别的步骤 #### 一、环境准备 1. **树莓派系统安装** - 使用Raspberry Pi Imager工具烧录Raspberry Pi OS(推荐64位Lite版) - 通过SSH或VNC连接树莓派(建议启用无线网络配置) - 更新系统: ```bash sudo apt update && sudo apt upgrade -y ``` 2. **安装依赖库** - 编译工具链: ```bash sudo apt install build-essential cmake -y ``` - Python开发环境: ```bash sudo apt install python3-dev python3-pip -y ``` 3. **安装dlib优化方案** - 通过预编译wheel安装(推荐): ```bash pip3 install dlib --no-cache-dir --verbose ``` - 或手动编译安装(需30分钟以上): ```bash git clone https://github.com/davisking/dlib.git cd dlib mkdir build && cd build cmake .. cmake --build . --config Release sudo make install ``` #### 二、人脸识别开发流程 1. **基础人脸检测** ```python import cv2 import dlib detector = dlib.get_frontal_face_detector() cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = detector(gray, 1) for face in faces: l, t, r, b = face.left(), face.top(), face.right(), face.bottom() cv2.rectangle(frame, (l, t), (r, b), (0,255,0), 2) cv2.imshow('Face Detection', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 2. **特征编码训练(需准备数据集)** - 数据集目录结构: ``` dataset/ ├── person1/ │ ├── img1.jpg │ └── img2.jpg └── person2/ ├── photo1.png └── photo2.png ``` - 训练代码: ```python from face_recognition import train train.train("dataset", "model.clf", verbose=True) ``` 3. **实时人脸识别系统** ```python import face_recognition import cv2 import pickle with open("model.clf", "rb") as f: model = pickle.load(f) video_capture = cv2.VideoCapture(0) while True: ret, frame = video_capture.read() rgb_frame = frame[:, :, ::-1] face_locations = face_recognition.face_locations(rgb_frame) face_encodings = face_recognition.face_encodings(rgb_frame, face_locations) for (top, right, bottom, left), encoding in zip(face_locations, face_encodings): matches = face_recognition.compare_faces(model["encodings"], encoding) name = "Unknown" if True in matches: name = model["labels"][matches.index(True)] cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) cv2.putText(frame, name, (left+6, bottom-6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1) cv2.imshow('Face Recognition', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows() ``` #### 三、性能优化技巧 1. **硬件加速方案** - 超频设置:在`/boot/config.txt`中添加: ```bash over_voltage=2 arm_freq=2000 gpu_freq=700 ``` - 启用GPU加速:安装OpenCV with NEON/VFPv3优化 2. **代码级优化** - 降分辨率至640x480 - 设置帧率限制为10fps - 使用多线程处理: ```python from threading import Thread class VideoStream: def __init__(self, src=0): self.stream = cv2.VideoCapture(src) self.grabbed, self.frame = self.stream.read() self.stopped = False def start(self): Thread(target=self.update, args=()).start() return self def update(self): while not self.stopped: self.grabbed, self.frame = self.stream.read() def read(self): return self.frame def stop(self): self.stopped = True ``` #### 四、常见问题解决 1. **dlib编译失败** - 增加交换空间: ```bash sudo dphys-swapfile swapoff sudo nano /etc/dphys-swapfile # 修改CONF_SWAPSIZE=2048 sudo dphys-swapfile setup sudo dphys-swapfile swapon ``` 2. **实时识别延迟高** - 使用HOG特征代替CNN: ```python face_locations = face_recognition.face_locations(rgb_frame, model="hog") ``` 3. **准确率提升方案** - 数据增强:镜像翻转、随机旋转(±10°)、亮度调整 - 集成多帧检测结果 - 添加活体检测模块 #### 扩展阅读 - 人脸识别在嵌入式设备的部署优化[^1] - 疲劳检测系统集成方法[^2]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值