这篇文章属于此系列:
一个用树莓派做的会聊天,能人脸识别(支持云台追踪)和发送邮件的小玩具
https://blog.csdn.net/yonglisikao/article/details/82804318
树莓派及基本配件,树莓派摄像头模块(Picamera)或USB摄像头(Webcam)。
Raspbian系统(其他Linux系统应该也可以,没试过)
Python及一些库——opencv,dlib, face_recognition,numpy
(安装opencv一般需要至少一个小时,如果使用Picamera,可以用更简单的picamera库代替,这些将在后文中继续讨论。)
系统安装可以参考之前的文章。
摄像头与树莓派在物理上连接完成后,如果是首次使用需要进行一些配置,在命令行输入:
sudo raspi-config
在 Interfacing Options 里启用 Camera,在命令行输入:
sudo reboot
配置完毕,接下进行检查,在命令行输入:
ls /dev/video*
如果有显示:/dev/video0,则检查完毕。
安装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
至此环境搭建完毕。
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 = ''
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库,有了基本的认识,项目原址有更多的例子等待着你去探索。
以上的实例是通过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 = ''
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的方案。
https://github.com/LoveThinkinghard/Raspibot