当前位置:   article > 正文

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

树莓派实现人脸识别难不难

前言

这篇文章属于此系列:

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

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,在命令行输入:

  1. pip install dlib
  2. pip install face_recognition
  3. 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实现:

  1. # coding = utf-8
  2. import face_recognition
  3. import cv2
  4. # 创建视频对象
  5. video_capture = cv2.VideoCapture(0)
  6. # 加载当前目录下名为'test.jpg'的照片,照片里需要有且仅有一张脸,这张脸将作为认识的脸
  7. print('loading...')
  8. image = face_recognition.load_image_file('test.jpg')
  9. face_encoding = face_recognition.face_encodings(image)[0]
  10. while True:
  11. print('Capturing image.')
  12. # 读取一帧照片
  13. ret, frame = video_capture.read()
  14. # 把照片缩小一点,能加快处理速度
  15. frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
  16. # 将cv2用的BGR颜色转换为face_recognition用的RBG颜色
  17. rgb_frame = frame[:, :, ::-1]
  18. # 获取这一帧图片里所有人脸的位置和特征值
  19. face_locations = face_recognition.face_locations(rgb_frame)
  20. print('Found {} faces in image.'.format(len(face_locations)))
  21. face_encodings = face_recognition.face_encodings(output, face_locations)
  22. # 对获取的每张脸进行循环,判断是否是认识的脸
  23. for face_encoding in face_encodings:
  24. # 判断当前的脸是否与认识的脸匹配
  25. match = face_recognition.compare_faces([face_encoding], face_encoding)
  26. name = '<Unknown Person>'
  27. if match[0]:
  28. name = 'test' # test为'test.jpg'里面人脸的名字
  29. 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库,在命令行输入:

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install python3-picamera

用picamera库实现的实例:

  1. # coding = utf-8
  2. import face_recognition
  3. import picamera
  4. import numpy as np
  5. # 创建视频对象
  6. camera = picamera.PiCamera()
  7. # 设置分辨率
  8. camera.resolution = (320, 240)
  9. # 初始化一个空的ndarray类型的数据
  10. rgb_frame = np.empty((240, 320, 3), dtype=np.uint8)
  11. # 加载当前目录下名为'test.jpg'的照片,照片里需要有且仅有一张脸,这张脸将作为认识的脸
  12. print('loading...')
  13. image = face_recognition.load_image_file('test.jpg')
  14. face_encoding = face_recognition.face_encodings(image)[0]
  15. while True:
  16. print('Capturing image.')
  17. # 用Picamera读取一帧照片
  18. camera.capture(rgb_frame, format='rgb')
  19. # 获取这一帧图片里所有人脸的位置和特征值
  20. face_locations = face_recognition.face_locations(rgb_frame)
  21. print('Found {} faces in image.'.format(len(face_locations)))
  22. face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
  23. # 对获取的每张脸进行循环,判断是否是认识的脸
  24. for face_encoding in face_encodings:
  25. # 判断当前的脸是否与认识的脸匹配
  26. match = face_recognition.compare_faces([face_encoding], face_encoding)
  27. name = '<Unknown Person>'
  28. if match[0]:
  29. name = 'test' # test为'test.jpg'里面人脸的名字
  30. 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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/495011
推荐阅读
相关标签
  

闽ICP备14008679号