树莓派 --- 基于OpenCV实现人脸识别

Posted 劳埃德·福杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派 --- 基于OpenCV实现人脸识别相关的知识,希望对你有一定的参考价值。

目录

参考博客

调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别

OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉库,支持与计算机视觉和机器学习相关的众多算法,用C++编写

1.安装OpenCV

安装慢就去换源树莓派系统的安装和远程访问_YINZHE__的博客-CSDN博客

看了网上很多教程,都太麻烦,还老是报各种错误,其实用下面一条指令就ok了 

sudo apt-get install python3-opencv

测试是否安装成功(我用的是python3 )

2.安装一些第三方库

apt-get 主要是自动从互联网软件仓库中搜索、安装、升级卸载软件或操作系统 
pip 用来安装来自PyPI(https://www.python.org/)的python所有的依赖包 

pip3 install numpy==1.21.4          # NumPy是一个开源的Python科学计算基础库
sudo pip3 install dlib              # dlib是一个包含机器学习算法的C++开源工具包
sudo pip3 install face_recognition  # face_recognition是一个基于python的人脸识别库

3.介绍face_recognition库中的几个函数

face-recognition库的API文档

# 加载当前目录下的名为“test.jpg”的图片,得到ndarray类型的数据image
image = face_recognition.load_image_file("my_picture.jpg")
# 对image进行分析,得到照片中脸的位置信息,因为能获取多张脸的位置,所以返回一个list
face_locations = face_recognition.face_locations(image)
# 输入image,face_locations,得到脸的特征值face_encodings,能同时获取多张脸的特征值,所以返回类型为list
face_encodings = face_recognition.face_encodings(image, face_locations)
# 比较encoding1与encoding2两个特征值,匹配返回True,否则返回False
# tolerance越低,顾名思义,容错率越低
matches = face_recognition.compare_faces(encoding1, encoding2, tolerance=0.38)

4.打开摄像头

我用的是官方的CSI摄像头,确保你的摄像头是开启的

sudo raspi-config

依次选择 "Interfacing Options" -> " Camera",确定后重启树莓派。

vcgencmd get_camera  # 检查摄像头运行情况

5.人脸识别测试

首先用摄像头抓拍一张你的帅照,命名为test.jpg,放在当前目录下

raspistill -v -o test.jpg  # 不同摄像头用的指令不同,默认等待5秒再拍摄

faceRecognition.py 

# coding = utf-8
import face_recognition as fr
import cv2

# 创建视频对象,参数为0就打开索引号为0的摄像头,参数为视频路径就打开视频
video_capture = cv2.VideoCapture(0)
# 加载当前路径下面的test.jpg
print('loading...')
image = fr.load_image_file('test.jpg')
# test.jpg只有一张人脸,拿到该人脸的特征值
myFace_encoding = fr.face_encodings(image)[0]

while True:
    print('Capturing image...')
    # 摄像头抓取一帧照片
    # ret是布尔值,读取帧成功返回True,文件读到结尾,返回False(如果你读取的是视频,而不是在线拍摄)
    # frame就是每一帧的图像,一个三维矩阵
    ret, frame = video_capture.read()
    # 缩小图片,加快处理速度,fx,fy表示x,y轴方向的缩小系数
    frame = cv2.resize(frame, (0,0), fx=0.25, fy=0.25)
    # 将cv2用的BGR颜色转换为face_recognition用的RGB颜色
    rgb_frame = frame[:, :, ::-1]
    # 获取这一帧里所有人脸的位置和特征值
    face_locations = fr.face_locations(rgb_frame)
    # 计算这一帧中出现的人脸数量
    print('Found  faces in image.'.format(len(face_locations)))
    face_encodings = fr.face_encodings(rgb_frame, face_locations)
    # 对获取的每张脸进行循环,判断是否和test.jpg中的人脸匹配
    for face_encoding in face_encodings:
        match = fr.compare_faces([myFace_encoding], face_encoding)
        name = '<Unknown Person>'
        # 检测到test.jpg中的人脸就打印信息
        if match:
            name = '张三'
        print('I see someone named !'.format(name))

在当前目录下运行该脚本,脸对准摄像头

6.加快人脸识别

(1)一种思路:增加虚拟内存,在linux中就是增加swap空间 

swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用
它包括换出和换入两个过程
换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存
换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来

① 起初我的实际内存 和虚拟内存如下:

② 修改/etc/dphys-swapfile文件中的CONF_SWAPSIZE

sudo vim /etc/dphys-swapfile

③ 重启树莓派

(2) 另一种思路:我的树莓派是3B+,CPU有四个核,多核并行运算

(3) 适当降低图片分辨率

抓拍test.jpg的时候,可以指定图片分辨率,我这里指定为 640 x 480(默认拍的图片分辨率太高了)

raspistill -v -w 640 -h 480 -o test.jpg

(4) 释放内存

sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"

以上是关于树莓派 --- 基于OpenCV实现人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

基于树莓派的人脸识别门禁系统

从3D打印到python编程 从opencv到人脸识别 从win10到树莓派ubuntu (全教程附代码)

树莓派 opencv Python 人脸识别

使用树莓派、pi 相机、python 和 Open Cv 进行人脸识别

(树莓派/OpenCV)端到端实时人脸识别实战

opencv树莓派上OpenCV-Face-Recognition人脸识别配置