树莓派实现人脸检测

准备工作

先在树莓派上下载好OpenCV3版本
可参考我的上一篇文章。
安装openCV

实现阶段

1.人脸检测和数据收集
2.训练识别器
3.人脸识别

一、人脸检测

1.下载分类器

直接下载xml文件
OpenCV 也包含很多预训练分类器,可用于人脸、眼睛、笑容等的检测。相关的 XML 文件可从该目录下载:
https://github.com/opencv/opencv/tree/master/data/haarcascades
安装openCV自带
安装OpenCV成功后,在opencv-3.4.0/data中会有好几个文件,其中以下文件存放了OpenCV自带的级联分类器文件,都是已经训练好的文件,可以检测人脸、眼睛、嘴等部位,但效果也并非就是完美的,会存在一些准确率问题,毕竟是开源的嘛,想要准确率很高的还是得自己训练。
在这里插入图片描述

2.代码

我的级联分类器放在/home/pi/haarcascade/目录下,请根据实际情况修改。

import cv2

# 导入人脸级联分类器,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier('/home/pi/haarcascade/haarcascade_frontalface_default.xml')

# 导入人眼级联分类器,'.xml'文件里包含训练出来的人眼特征
eye_cascade = cv2.CascadeClassifier('/home/pi/haarcascade/haarcascade_eye.xml')

# 调用摄像头摄像头
cap = cv2.VideoCapture(0)  

while(True):
    # 获取摄像头拍摄到的画面
    # 会得到两个参数,一个是否捕捉到图像(True/False),另一个为存放每帧的图像
    ret, frame = cap.read()  # 读取一帧图像
    # 每帧图像放大1.1倍,重复检测10次
    faces = face_engine.detectMultiScale(frame,1.1, 10)  # 得到人脸,可能不止一个
    img = frame  # 复制
    for (x,y,w,h) in faces:
        # 画出人脸框,蓝色,画笔宽度为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,1.1,5)
        # 用人眼级联分类器在人脸区域进行人眼识别,返回的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'):  #当按下“q”键时退出人脸检测
        break

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

其中一些重要的参数
我们必须调用分类器函数,向其输入一些非常重要的参数,如比例因子、邻近数和人脸检测的最小尺寸。
例如:

faces = faceCascade.detectMultiScale(
        gray,     
        scaleFactor=1.2,
        minNeighbors=5,     
        minSize=(20, 20)
    )

其中:
gray 表示输入 grayscale 图像。
scaleFactor 表示每个图像缩减的比例大小。
minNeighbors 表示每个备选矩形框具备的邻近数量。数字越大,假正类越少。
minSize 表示人脸识别的最小矩形大小。

3.检测结果

在这里插入图片描述
可见框起来的部分就是检测的人脸

二、数据收集

1.新建一个文件夹

先新建一个文件夹用来存储用图像获取的照片
在这里插入图片描述

2.编写代码

获取摄像头的图像

import cv2
import os

cam = cv2.VideoCapture(0)  # 获取摄像头
cam.set(3, 640) # set video width  # 设置视频的高度和宽度
cam.set(4, 480) # set video height

# 检测人脸
face_detector = cv2.CascadeClassifier('/home/pi/haarcascade/haarcascade_frontalface_default.xml')

# For each person, enter one numeric face id
face_id = input('\n enter user id end press <return> ==>  ')

#print("\n [INFO] Initializing face capture. Look the camera and wait ...")
# Initialize individual sampling face count
count = 0

while(True):
    ret, img = cam.read() # 从摄像头读取图像
    # img = cv2.imread("/home/pi/Desktop/陈卓璇/" + str(count) + '.jpg')
    #print("/home/pi/Desktop/兔子牙/" + str(count) + '.jpg')
    # 翻转图像 1  水平翻转  0 垂直翻转   -1 水平垂直翻转
    #img = cv2.flip(img, -1) # flip video image vertically
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
    faces = face_detector.detectMultiScale(gray, 1.3, 5) # 识别人脸
    
    count += 1
# 在人脸上画矩形
    for (x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
        

        # Save the captured image into the datasets folder
        cv2.imwrite("/home/pi/Desktop/dataset/user." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
        cv2.imshow('image', img) # 显示
        
    #cv2.imshow('image', img) # 显示
    k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
    elif count >= 10: # Take 10 face sample and stop video
        break

# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

获取文件夹的图片
先准备一个文件夹。里面放上图片
在这里插入图片描述
只需要按下面修改
在这里插入图片描述
注释掉第一句,释放第二句和第三句。

3.运行效果

在桌面dataset文件夹里有10张图片
在这里插入图片描述

三、训练识别器

我们需要从数据集中抽取所有的用户数据,并训练 OpenCV 识别器,这一过程可由特定的 OpenCV 函数直接完成。这一步将在「trainer/」目录中保存为.yml 文件。

1.新建一个文件夹

在这里插入图片描述

2.编写代码

import numpy as np
from PIL import Image # python里面的图像库
import os
import cv2

# Path for face image database
path = '/home/pi/Desktop/dataset' # 数据集的路径

recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("/home/pi/haarcascade/haarcascade_frontalface_default.xml");

# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
    # print(imagePaths) # 输出文件夹所有的文件路径
    faceSamples=[]  # 存放人脸
    ids = []       # 存放人脸的ID
    for imagePath in imagePaths:  # 遍历路径
        PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
        img_numpy = np.array(PIL_img,'uint8')
        #print(os.path.split(imagePath)[-1])
        id = int(os.path.split(imagePath)[-1].split(".")[1]) # 获取ID
        #print(" " + str(id)) # 输入ID
        faces = detector.detectMultiScale(img_numpy)
        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return faceSamples,ids

print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))

# Save the model into trainer/trainer.yml
recognizer.write('/home/pi/Desktop/trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi

# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

在训练过后,文件「trainer.yml」将保存在我们前面定义的 trainer 目录下。此外,我们还在最后使用了 print 函数以确认已经训练的用户面部数量。

3.运行效果

在这里插入图片描述

四、人脸识别

这里,我们将通过摄像头捕捉一个新人脸,如果这个人的面孔之前被捕捉和训练过,我们的识别器将会返回其预测的 id 和索引,并展示识别器对于该判断有多大的信心。

1.编写代码

import cv2
import numpy as np
import os 
 
recognizer = cv2.face.LBPHFaceRecognizer_create()  # 识别器
recognizer.read('/home/pi/Desktop/trainer/trainer.yml') # 加载训练集
cascadePath = "/home/pi/haarcascade/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
 
font = cv2.FONT_HERSHEY_SIMPLEX   # 字体
 
#iniciate id counter
id = 0
 
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'luatao','lihua'] 
 
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
 
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
 
while True:
    ret, img =cam.read()  # 读取一帧图像
    #img = cv2.flip(img, -1) # Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转化为灰度图
     
    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
 
    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
 
        # Check if confidence is less them 100 ==> "0" is perfect match 
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
         
        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)  
     
    cv2.imshow('camera',img) 
 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

recognizer.predict () 将把待分析人脸的已捕捉部分作为一个参数,并返回其可能的所有者,指示其 id 以及识别器与这一匹配相关的置信度。
注意,如果匹配是完美的,置信度指数将返回「零」。

2.运行结果

在这里插入图片描述

参考文档

https://shumeipai.nxez.com/2018/03/09/real-time-face-recognition-an-end-to-end-project-with-raspberry-pi.html

  • 5
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 要下载树莓派人脸识别SDK,首先需要在官方网站或其他可信的技术网站上搜索相关的SDK。可以使用搜索引擎,输入关键词“树莓派人脸识别SDK下载”来查找相关软件。挑选一个合适的SDK下载链接,确保其与树莓派设备兼容。 点击下载链接后,进入下载页面,选择适用于树莓派的版本,通常会有树莓派的图标或者在系统要求中提到树莓派。确认无误后,点击下载按钮。 下载完成后,将SDK文件保存到树莓派的合适位置,可以选择将其保存到SD卡或者任意目录。 根据SDK的具体要求和文档,进行安装和配置。这一步可以参考SDK提供的官方文档或者操作指南来进行。 安装和配置完成后,就可以开始使用树莓派人脸识别SDK了。根据SDK的使用方式,编写代码,实现人脸识别的功能。可以通过调用SDK的API来实现人脸检测、识别和比对等功能。 在使用SDK的过程中,可以根据需求进行自定义设置,如设置阈值、调整人脸识别的精度和速度,以及配置相机和摄像头等参数。 最后,根据自己的实际应用场景,将人脸识别功能好好利用起来,可以用于监控系统、门禁系统、智能家居等方面。 总之,要下载树莓派人脸识别SDK,先搜索并选择合适的SDK,下载并安装到树莓派上,然后根据具体文档进行配置和编程,最终实现人脸识别的功能。 ### 回答2: 要下载树莓派人脸识别SDK,首先需要确定你所需要的SDK具体是哪一家公司或开发者提供的。树莓派作为一款开源硬件,拥有广泛的支持和社区,因此有许多不同的人脸识别SDK可供选择。 一种下载的方式是通过访问官方网站下载。首先,你需要搜索相关的人脸识别SDK提供商的官方网站。在网站的下载页面,通常会提供对于树莓派的支持和下载链接。你可以浏览他们的网站,找到适用于树莓派的SDK版本并下载。在下载之前,确保你选择的版本和树莓派的硬件和操作系统相匹配。 另一种方式是通过基于树莓派的操作系统(如Raspbian)的软件库进行下载。树莓派的操作系统通常会提供一些常用的SDK,并且可以通过包管理器(如apt-get)来安装。你可以在命令行中运行适当的命令来搜索和安装树莓派人脸识别SDK。确保你的操作系统已经更新到最新版本,以保证软件库中有最新的SDK可供下载。 无论你选择哪种方式,下载时要确保选择信誉良好的提供商,以获得更好的技术支持和保障。在下载前,建议查看一些用户对该SDK的评价和反馈,了解其性能和可靠性。另外,阅读相关的文档和教程可以帮助你更好地了解和使用该SDK,以便你能够更好地将其整合到你的树莓派项目中。 ### 回答3: 要下载树莓派人脸识别SDK非常简单。首先,你需要打开树莓派的操作系统,确保你已经连接到互联网。然后,使用浏览器访问相关的网站或官方社区。在搜索框中输入“树莓派人脸识别SDK下载”,然后点击搜索按钮。 在搜索结果中,你会看到各种不同的下载选项。注意选择适合你需求的版本和文件类型。一般来说,官方社区或软件开发者网站是最安全和可靠的下载来源。 点击选定的下载链接后,等待文件下载完成。下载时间取决于你的互联网连接速度和文件大小。 一旦下载完成,你需要找到文件保存的位置并解压缩。这通常涉及到右键点击文件并选择“解压缩”选项。如果你不熟悉解压缩文件的操作,可以搜索相关的指导教程。 解压缩后,你会得到一个包含SDK的文件夹。你可以将该文件夹移动到你喜欢的位置,以便方便访问。 现在,你已经成功下载和准备好使用树莓派人脸识别SDK了。你可以从文件夹中找到示例代码和文档,以帮助你开始开发或使用该SDK。 希望这个简单的指南对你有所帮助!祝你下载并使用SDK时顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值