raspberrypi三天玩能人脸识别

raspberrypi 三天能玩人脸识别

1. 硬件正常安装

参考子豪兄教你在树莓派上安装OpenCV

启动后,打开桌面 配置一下用户和密码,首选项-> Configration,配置自动登录。
raspberrypi三天玩能人脸识别_第1张图片

2. 一劳永逸配置树莓派

参考 配置好pi

  • 给Raspbian的包管理器apt-get换源 几个常用的源

参考sources.list 详解

清华: http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/
浙大:http://mirrors.zju.edu.cn/raspbian/raspbian/
科大:http://mirrors.ustc.edu.cn/raspbian/raspbian/

在树莓派的命令行界面输入

sudo nano /etc/apt/sources.list

使用键盘方向键控制,在第一行开头加一个#,把下面的内容拷贝到最后一行之后,如图中的效果:

deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

先按键盘上的ctrl+o,再按回车保存,再按ctrl+x退出nano编辑器回到命令行界面。再输入以下命令更新到清华大学镜像源最新的软件列表。

sudo apt-get update

这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在树莓派本地。

  • 给Python的第三方模块安装工具pip换源

  • 方法一:输入命令

清华大学开源软件镜像站官方推荐方法,但该方法在树莓派上可能会失效。
只需树莓派命令行中输入下面这一行命令,即可永久设置pip下载源为国内源

    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

注意:是 https 而不是 http,simple 不能少

  • 方法二:配置换源脚本
    该方法在树莓派上亲测有效

在树莓派的命令行中依次输入运行以下三个命令

sudo mkdir ~/.pip
cd .pip
sudo nano pip.conf

在打开的文件中输入以下内容:

[global]
timeout = 10
index-url =  http://mirrors.aliyun.com/pypi/simple/
extra-index-url= http://pypi.douban.com/simple/
[install]
trusted-host=
    mirrors.aliyun.com
    pypi.douban.com

还可以参考:Python开发快速安装第三方包(pip换源)

  • 升级所有安装的软件
    运行下面这行命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。执行这行命令可能需要很长时间。

    sudo apt-get upgrade

  • 运行了sudo apt-get update命令,现在运行sudo apt-get upgrade命令,有什么不同呢?
    答:update仅仅是从下载源获取并更新可下载软件列表,相当于更新索引地图。而upgrade是更新软件本身。后者要花费多得多的时间。

  • 更新完成后,有几个包无法更新,用命令补充

apt-get update --fix-missing 

source.list 文件版本说明 
wheezy(更老的稳定版)
jessiels(老的稳定版)
stretch(稳定版)
buster(测试版)
  • 下载安装常用软件

1)安装中文字体

sudo apt-get install fonts-wqy-zenhei

2)安装中文输入法fcitx及Google拼音输入法

sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin

安装成功之后,会在下一次重启时生效。可以使用ctrl+空格切换为中文输入法。

3) 安装远程桌面登陆软件teamviewer (没有安装成功)

依次执行下列五条命令。在运行第二条命令的时候会显示很多依赖包没有安装,第三条命令就是用来安装这些依赖包。

wget http://download.teamviewer.com/download/linux/version_11x/teamviewer-host_armhf.deb
sudo dpkg -i teamviewer-host_armhf.deb
sudo apt-get -f install
sudo apt-get install gdebi
sudo gdebi teamviewer-host_armhf.deb

teamviewer info可以查看teamviewer当前版本

在跳出的对话框选择Accept License Agreement 在树莓派桌面,右上角可以看到teamviewer的图标了,点击进入。再点击Grant easy access,登录你的teamviewer账户,设置连接密码。通过那一串数字(如图中的1112747434),就可以让全世界任意一台上网的电脑或手机远程桌面操控你的树莓派了。

3. 树莓派配置摄像头并实现实时人脸检测

参考树莓派4B配置摄像头并实现实时人脸检测

3.1 打开配置

打开树莓派命令行界面输入命令,进入树莓派配置界面。打开camera。

sudo raspi-config

将摄像头的USB口连接到树莓派的任意一个USB口后再开机。一定要先接摄像头再开机,不然树莓派可能无法识别。

3.2 USB测试

输入输入lsusb或者ls /dev/video*命令。

raspberrypi三天玩能人脸识别_第2张图片

3.3 操作摄像头

安装mplayer播放器

sudo apt-get install mplayer -y

raspberrypi三天玩能人脸识别_第3张图片

3.4安装fswebcam视频软件

sudo apt-get install fswebcam -y

raspberrypi三天玩能人脸识别_第4张图片

3.5查看USB摄像头画面

sudo mplayer tv://

确认画面之后需要通过ctrl+c退出,才能进行下一步调用摄像头操作.否则会报如摄像头忙碌的错误。

raspberrypi三天玩能人脸识别_第5张图片

3.6 在/home/pi目录下调用fswebcam生成一张当前摄像头拍摄到的实时照片

fswebcam -d /dev/video0 --no-banner -r 320x240 -S 10 /home/pi/image.jpg

其中:

  • -d 是配置使用哪个摄像设备
  • –no-banner 拍出来照片没水印,不加的话,可能会报字体问题
  • -r 后的是图片的宽与高
  • -S 跟曝光度设置差不多。从1到10,越来越不刺眼的感觉,如果不设置这个参数或者设置为0的话可能拍出黑照片。
  • 最后的是待保存的图片路径(如果不加路径/home/pi/的话默认保存在当前目录)。

raspberrypi三天玩能人脸识别_第6张图片

3.7 调用摄像头实现实时人脸检测 未成功

  • 配置展示窗口
export DISPLAY=:0.0
  • 安装python-opencv
sudo apt-get install python-opencv
  • 树莓派摄像头实时人脸检测

下载网络和权重文件 没有用

wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.bin
wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.xml

新建face-detection-camera.py文件,并写入以下内容:

# coding=utf-8
# face-detection-camera.py
import cv2 as cv
import numpy as np

print('开始人脸摄像头实时检测')
# 载入模型文件和权重文件
net = cv.dnn.readNet('face-detection-adas-0001.xml','face-detection-adas-0001.bin')
# Specify target device
net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

# 从摄像头中读取图像帧
cap=cv.VideoCapture(0)
while(1):
    # 获取一帧图像
    ret,frame=cap.read()
    # Prepare input blob and perform an inference
    frame=cv.resize(frame,(480,320),interpolation=cv.INTER_CUBIC)
    blob=cv.dnn.blobFromImage(frame,size=(672,384),ddepth=cv.CV_8U)
    net.setInput(blob)
    out=net.forward()
    
    # 绘制人脸框
    for detection in out.reshape(-1,7):
        confidence=float(detection[2])
        # 获取左上角图片坐标
        xmin=int(detection[3]*frame.shape[1])
        ymin=int(detection[4]*frame.shape[0])
        # 获取右下角图片坐标
        xmax=int(detection[5]*frame.shape[1])
        ymax=int(detection[6]*frame.shape[0])
        if confidence > 0.5:
            cv.rectangle(frame,(xmin,ymin),(xmax,ymax),color=(0,255,0))
    # 展示图像
    cv.imshow('capture',frame)
    if cv.waitKey(1)&0xFF==ord('q'):
        # 每1秒监听一次键盘的动作,按q键结束,并保存图片
        cv.imwrite('out.png',frame)
        print('save one image done!')
        break
# 关闭摄像头及显示窗口
cap.release()
cv.destroyAllWindows()
print('人脸摄像头实时检测完成')
  • 将face-detection-camera.py放入face-detection-adas-0001.xml,face-detection-adas-0001.bin同级目录,并执行:
python3 face-detection-camera.py

可以左右移动人脸查看识别情况,界面上会在检测到的人脸画一个绿色的框
按键盘Q键可退出检测,并保存最后一帧图像.

这部分未成功

4. 树莓派安装opencv不成功时补充方法 已成功

4.1 手动安装opencv

树莓派安装opencv调用cv2时提示 ModuleNotFoundError: NO module named 'cv2’的解决方法

sudo pip3 install opencv-python

sudo apt-get install libjpeg-dev libatlas-base-dev libjpeg-dev libtiff5-dev libpng12-dev libqtgui4 libqt4-test libjasper-dev 
-

sudo pip3 install numpy

sudo pip3 install opencv-python

不成功, 要单独下载 , opencv下载地址

然后上传到树莓派,使用以下命令安装:

sudo pip3 install opencv_python-4.4.0.46-cp37-cp37m-linux_armv7l.whl
  • pip换源
pip install pip -U
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 测试opencv是否安装成功
python3

import cv2

cv2.__version__

raspberrypi三天玩能人脸识别_第7张图片

4.2 测试opencv

用树莓派自带的IDE运行下列代码。

打开一个图片(将图片yangmi.jpg放到 py 程序同级目录下)并显示 , 01tespopencv.py源码,:

import cv2

img = cv2.imread("yangmi.jpg") # load image
cv2.imshow("image", img)    # show image
cv2.waitKey(0)  # wait until key pressed

运行结果
raspberrypi三天玩能人脸识别_第8张图片

5. 调用摄像头模组测试

5.1 捕捉PiCam生成的用RGB颜色和灰色模式展示的视频流

参考用树莓派3B+和Python+OpenCV实现实时的人脸检测

用树莓派自带的IDE运行下列代码,可捕捉PiCam生成的用RGB颜色和灰色模式展示的视频流。按ESC退出运行测试窗口。

02testcv2camera.py源码 :

import numpy as np
import cv2
 
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
  
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
     
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
 
cap.release()
cv2.destroyAllWindows()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DheTg7J-1605571109371)(figs/5.1摄像头模组opencv_test.png)]

  • OpenCV中的Haar-cascade检测 成功

如果通过特征的方式,那就绕不开Haar特征分类器。

Haar-like特征最早是由Papageorgiou等人用于物体检测的数字图像特征,而Viola和Jones在此基础上,使用3种类型4种形式的特征。

Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。
这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。

如果自己找人脸训练特征的话,需要花费时间和大量的素材,那今天就采用OpenCV官方给出的训练结果!

参考十行Python代码实现人脸识别

5.2十行代码完成人脸识别(附源代码)Haar-cascade检测分类器路径:

/usr/local/lib/python3.7/dist-packages/cv2/data
  • 人脸识别

人脸图片(将图片yangmi.jpg放到 py 程序同级目录下)识别 ,人脸识别 03face-detection-pic.py 源码:

# 十行代码完成人脸识别
# bilibili:同济子豪兄
# 20190516
import cv2

img = cv2.imread('yangmi.jpg',1)

face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)

for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

cv2.imshow('yangmi.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 十行代码完成人脸识别-注释版
# bilibili:同济子豪兄 
# 20190516

# 导入opencv-python
import cv2

# 读入一张图片,引号里为图片的路径,需要你自己手动设置
img = cv2.imread('yangmi.jpg',1)

# 导入人脸级联分类器引擎,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,5是重复识别次数
faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)

# 对每一张脸,进行如下操作
for (x,y,w,h) in faces:
    # 画出人脸框,蓝色(BGR色彩体系),画笔宽度为2
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

# 在"img2"窗口中展示效果图
cv2.imshow('img2',img)
# 监听键盘上任何按键,如有按键即退出并关闭窗口,并将图片保存为output.jpg
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.jpg',img)

raspberrypi三天玩能人脸识别_第9张图片

5.3人脸识别和人眼检测

人脸图片(将图片yangmi.jpg放到 py 程序同级目录下)识别 ,对单个图片进行人脸识别和人眼检测 04faceeye-detection-pic.py 源码:

# 单张图片人脸+眼睛识别
# bilibili视频教程:同济子豪兄
# 2019-5-16

#导入opencv
import cv2

# 导入人脸级联分类器引擎,'.xml'文件里包含训练出来的人脸特征,cv2.data.haarcascades即为存放所有级联分类器模型文件的目录
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 导入人眼级联分类器引擎吗,'.xml'文件里包含训练出来的人眼特征
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')

# 读入一张图片,引号里为图片的路径,需要你自己手动设置
img = cv2.imread('image3.png')

# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,5是重复识别次数
faces = face_cascade.detectMultiScale(img, 1.3, 5)

# 对每一张脸,进行如下操作
for (x,y,w,h) in faces:
    # 画出人脸框,蓝色(BGR色彩体系),画笔宽度为2
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
    face_area = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(face_area)
    # 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
    for (ex,ey,ew,eh) in eyes:
        #画出人眼框,绿色,画笔宽度为1
        cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
        
# 在"img2"窗口中展示效果图
cv2.imshow('img2',img)
# 监听键盘上任何按键,如有案件即退出并关闭窗口,并将图片保存为output.jpg
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.jpg',img)

raspberrypi三天玩能人脸识别_第10张图片

5.4 调用电脑摄像头进行实时人脸识别和人眼识别

开启摄像头 进行人脸识别和人眼检测 05faceeye-detection-camera.py 源码:

# 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制粘贴运行
# bilibili视频教程:同济子豪兄
# 2019-5-16
import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')
# 调用摄像头摄像头
cap = cv2.VideoCapture(0)

while(True):
    # 获取摄像头拍摄到的画面
    ret, frame = cap.read()
    faces = face_cascade.detectMultiScale(frame, 1.3, 5)
    img = frame
    for (x,y,w,h) in faces:
    	# 画出人脸框,蓝色,画笔宽度微
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    	# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
        face_area = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(face_area)
    	# 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
        for (ex,ey,ew,eh) in eyes:
            #画出人眼框,绿色,画笔宽度为1
            cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
        
	# 实时展示效果画面
    cv2.imshow('frame2',img)
    # 每5毫秒监听一次键盘动作
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break

# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()

5.5 调用电脑摄像头进行实时人脸识别 人眼 笑脸识别

开启摄像头 进行人脸识别 人眼 笑脸 06faceeyesmele-detection-camera.py 源码:

# 调用电脑摄像头进行实时人脸+眼睛+微笑识别,可直接复制粘贴运行
# bilibili视频教程:同济子豪兄
# 2019-5-16
import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')

eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')

smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_smile.xml')
# 调用摄像头摄像头
cap = cv2.VideoCapture(0)

while(True):
    # 获取摄像头拍摄到的画面
    ret, frame = cap.read()
    faces = face_cascade.detectMultiScale(frame, 1.3, 2)
    img = frame
    for (x,y,w,h) in faces:
    	# 画出人脸框,蓝色,画笔宽度微
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    	# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
        face_area = img[y:y+h, x:x+w]
        
        ## 人眼检测
        # 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
        eyes = eye_cascade.detectMultiScale(face_area,1.3,10)
        for (ex,ey,ew,eh) in eyes:
            #画出人眼框,绿色,画笔宽度为1
            cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
        
        ## 微笑检测
        # 用微笑级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
        smiles = smile_cascade.detectMultiScale(face_area,scaleFactor= 1.16,minNeighbors=65,minSize=(25, 25),flags=cv2.CASCADE_SCALE_IMAGE)
        for (ex,ey,ew,eh) in smiles:
            #画出微笑框,红色(BGR色彩体系),画笔宽度为1
            cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,0,255),1)
            cv2.putText(img,'Smile',(x,y-7), 3, 1.2, (0, 0, 255), 2, cv2.LINE_AA)
        
	# 实时展示效果画面
    cv2.imshow('frame2',img)
    # 每5毫秒监听一次键盘动作
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break

# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()
  • 注意检测过程使用的重要函数

不管是检测人脸还是检测笑脸,都会用到 detectMultiScale() 函数进行标记

此函数的作用是,在输入图像中检测不同尺寸的对象,返回包含对象的矩形框。

image——输入图像
scaleFactor——表示每轮检测图像齿轮减少的比例
minNeighbors——指明对象要至少被检测到几次才能判定对象确实存在
minSize——检测对象的最小尺寸
maxSize——检测对象的最大尺寸
  • 局限性:

    • 仅为人脸检测,非人脸“辩识”,即只能框出人脸的位置,看不出人脸是谁。
    • 仅能标出静态图片和视频帧上的人脸、人眼和微笑,不能进行“活体识别”,即不能看出这张脸是真人还是手机上的照片,如果用于人脸打卡签到、人脸支付的话会带来潜在的安全风险。
    • 仅为普通的机器学习方法,没有用到深度学习和深层神经网络。

参考文献:

Face Detection using Haar Cascades

使用Haar Cascade 进行人脸识别

Github开源人脸识别项目face_recognition

树莓派4B开机配置指南_利用官方模型实现人脸识别

基于OpenCV的人脸及笑脸检测

Python实现人脸识别图片+视频

你可能感兴趣的:(raspberrypi,人脸识别,python,raspberry,pi,计算机视觉,opencv)