树莓派实现简单的人脸识别

前言

这篇文章属于此系列:

一个用树莓派做的会聊天,能人脸识别(支持云台追踪)和发送邮件的小玩具

https://blog.csdn.net/yonglisikao/article/details/82804318

前提

一.硬件要求

树莓派及基本配件,树莓派摄像头模块(Picamera)或USB摄像头(Webcam)。

二.系统要求

Raspbian系统(其他Linux系统应该也可以,没试过)

三.软件要求

Python及一些库——opencv,dlib, face_recognition,numpy

(安装opencv一般需要至少一个小时,如果使用Picamera,可以用更简单的picamera库代替,这些将在后文中继续讨论。)

环境搭建

1.系统安装

系统安装可以参考之前的文章。

2.摄像头配置

摄像头与树莓派在物理上连接完成后,如果是首次使用需要进行一些配置,在命令行输入:

sudo raspi-config

在 Interfacing Options 里启用 Camera,在命令行输入:

sudo reboot

配置完毕,接下进行检查,在命令行输入:

ls /dev/video*

如果有显示:/dev/video0,则检查完毕。

3.库的安装

安装opencv,参考下面这篇Adrian Rosebrock的文章:

https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/

走完这篇文章的所有流程后,你应该安装了numpy,并建立了自己的虚拟环境(virtualenv),无论它叫 cv 或者其他什么名字的,以下的操作请都在虚拟环境下完成。另外,我使用的是python3。

安装dlib,face_recognition,在命令行输入:

pip install dlib
pip install face_recognition
pip install numpy

至此环境搭建完毕

代码实现

1.face_recognition库的简单使用

face_recognition的github项目地址为:https://github.com/ageitgey/face_recognition

在此仅简单介绍几个函数,更详细的内容请参考原项目地址。


加载当前目录下的名为“test.jpg”的图片,得到ndarray类型的数据image

image = face_recognition.load_image_file('test.jpg')

对image进行分析,得到照片中脸的位置信息face_locations,能同时获取多张脸的位置,所以返回类型为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)

接下来运行一个实例,以下实例改编自项目原址一个用picamera库实现的demo,这里使用opencv实现:

# coding = utf-8
import face_recognition
import cv2

# 创建视频对象
video_capture = cv2.VideoCapture(0)

# 加载当前目录下名为'test.jpg'的照片,照片里需要有且仅有一张脸,这张脸将作为认识的脸
print('loading...')
image = face_recognition.load_image_file('test.jpg')
face_encoding = face_recognition.face_encodings(image)[0]

while True:

    print('Capturing image.')
    # 读取一帧照片
    ret, frame = video_capture.read()
    # 把照片缩小一点,能加快处理速度
    frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    # 将cv2用的BGR颜色转换为face_recognition用的RBG颜色
    rgb_frame = frame[:, :, ::-1]

    # 获取这一帧图片里所有人脸的位置和特征值
    face_locations = face_recognition.face_locations(rgb_frame)
    print('Found {} faces in image.'.format(len(face_locations)))
    face_encodings = face_recognition.face_encodings(output, face_locations)

    # 对获取的每张脸进行循环,判断是否是认识的脸
    for face_encoding in face_encodings:
        # 判断当前的脸是否与认识的脸匹配
        match = face_recognition.compare_faces([face_encoding], face_encoding)
        name = '<Unknown Person>'

        if match[0]:
            name = 'test'  # test为'test.jpg'里面人脸的名字
        print('I see someone named {}!'.format(name))

运行实例时,你需要在运行的当前目录下放置名为“test.jpg”的包含一张人脸的图片,可以使用你的摄像头临时拍一张,但对不同类型的设备而言,指令不同。

Picamera,直接在命令行输入:

raspistill -o test.jpg

Webcam,需要先安装fswebcam,在命令行输入:

sudo apt-get install fswebcam

安装完成后,使用下面命令拍照:

fswebcam test.jpg

运行完实例后,结合前面几个函数的介绍,以及实例里的注释分析,相信你对如何使用face_recognition库,有了基本的认识,项目原址有更多的例子等待着你去探索。

2.安装并使用picamera库

以上的实例是通过opencv实现的,如果你因为时间原因不想安装opencv,依然建议你看一下这篇Adrian Rosebrock文章:

https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/

至少要从里面挑出安装pip,virtualenv,搭建虚拟环境以及在虚拟环境里安装numpy的部分,因为使用picamera库也需要这些东西。

安装picamera库,在命令行输入:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-picamera

用picamera库实现的实例:

# coding = utf-8
import face_recognition
import picamera
import numpy as np

# 创建视频对象
camera = picamera.PiCamera()
# 设置分辨率
camera.resolution = (320, 240)
# 初始化一个空的ndarray类型的数据
rgb_frame = np.empty((240, 320, 3), dtype=np.uint8)

# 加载当前目录下名为'test.jpg'的照片,照片里需要有且仅有一张脸,这张脸将作为认识的脸
print('loading...')
image = face_recognition.load_image_file('test.jpg')
face_encoding = face_recognition.face_encodings(image)[0]

while True:

    print('Capturing image.')
    # 用Picamera读取一帧照片
    camera.capture(rgb_frame, format='rgb')

    # 获取这一帧图片里所有人脸的位置和特征值
    face_locations = face_recognition.face_locations(rgb_frame)
    print('Found {} faces in image.'.format(len(face_locations)))
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # 对获取的每张脸进行循环,判断是否是认识的脸
    for face_encoding in face_encodings:
        # 判断当前的脸是否与认识的脸匹配
        match = face_recognition.compare_faces([face_encoding], face_encoding)
        name = '<Unknown Person>'

        if match[0]:
            name = 'test'  # test为'test.jpg'里面人脸的名字
        print('I see someone named {}!'.format(name))

总结

以上内容教给你如何搭建环境,并帮你的简单分析了face_recognition库的使用方法,具体如何使用还需要靠你自己去创造。

不过,需要注意:

1.如果你使用树莓派摄像头模块(Picamera),那么picamera库的方案最适合你,如果想使用opencv的方案,需要做一些配置。方法如下,首先在命令行输入下面的命令,新建或编辑这个文件:

sudo nano /etc/modules

在里面写入以下内容:

bcm2835-v4l2

2.如果你使用USB摄像头,那么你只能使用opencv的方案。

猜你喜欢

转载自blog.csdn.net/yonglisikao/article/details/82288757
今日推荐