个人学习日志——树莓派实时人脸识别项目

这篇具有很好参考价值的文章主要介绍了个人学习日志——树莓派实时人脸识别项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是我运行的第一个项目,源代码来自于GitHub。第一次接触树莓派,python编程

学习目标:

1、了解树莓派的python基础知识   

2、了解程序如何运行

3、了解程序的框架 

4、如何调用接口

硬件:树莓派4B csi500W摄像头 

个人学习日志——树莓派实时人脸识别项目

环境:树莓派官方系统 python3 opencv

个人学习日志——树莓派实时人脸识别项目

参考链接:

1、【创客实战训练营】树莓派使用OpenCV实现简单人脸识别_哔哩哔哩_bilibili​​​​​​

2、实时人脸识别:一个端到端项目 - Hackster.io(主要参考)

3、【opencv】树莓派上OpenCV-Face-Recognition人脸识别配置_BHY_的博客-CSDN博客 

4、GitHub - Mjrovai/OpenCV-Face-Recognition:使用OpenCV和Python的实时人脸识别项目

5、用树莓派实现实时的人脸检测 | 树莓派实验室 (nxez.com)

环境已按照哔哩哔哩中教程配置完毕

捕获将由PiCam生成的视频流,并以BGR颜色和灰色模式显示两者

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,640) #设置宽
cap.set(4,480) #设置高
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, 1) #反转摄像头
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    cv2.imshow('frame', frame)#BGR模式
    cv2.imshow('gray', gray)#灰色窗口
    
    k = cv2.waitKey(30) & 0xff
    if k == 27: # 摁下ESC关闭窗口(ESC的ascll码为27)
        break
cap.release()
cv2.destroyAllWindows()

原作者摄像头是反的,将frame=cv2.flip(frame,-1)中的-1改为1

我尝试将灰色窗口改为其他颜色,都报错

这个段代码运行很顺利,没有报错

个人学习日志——树莓派实时人脸识别项目

人脸检测

import numpy as np
import cv2
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#加载分类器路径和文件
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while True:
    ret, img = cap.read()
    img = cv2.flip(img, 1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,     
        scaleFactor=1.2,#表示每次图像尺寸减小的比例
        minNeighbors=5,   #表示一个目标至少要被检测5次才会被认定为人脸  
        minSize=(20, 20), #目标最小尺寸
    )
    for (x,y,w,h) in faces:#如果检测到人脸返回方框
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#更改此函数数据可改变方框的大小其实位置颜色
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]  
    cv2.imshow('video',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
cap.release()
cv2.destroyAllWindows()

此处要注意调用了 Cascades/haarcascade_frontalface_default.xml文件,需要把该文件与源程序放在一个文件夹中(指定路径也可以)。该文件得到作者的GitHub中下载。

opencv的分类器GitHub地址:

opencv/data/haarcascades at master · opencv/opencv · GitHubhttps://github.com/opencv/opencv/tree/master/data/haarcascades

个人学习日志——树莓派实时人脸识别项目

cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)更改此函数数据可改变方框的大小其实位置颜色

可以顺利运行,但我发现个有意思的事情--------------------------这个识别会将我的耳朵也识别成人脸

个人学习日志——树莓派实时人脸识别项目哈哈哈啊哈 

 发现运行人脸眼睛和嘴巴时,特别的慢,第一次得加载个两分钟的样子。

人脸识别

1、人脸采集

将GitHub中的haarcascade_frontalface_default.xml放在程序所在的文件夹

在本程序文件夹创建一个dataset文件夹,如果要创建其他名的文件夹,则需将文件中相应的文件名做出更改

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('haarcascade_frontalface_default.xml')
# 对于每个人,输入一个数字人脸 ID
face_id = input('\n enter user id end press <return> ==>  ')
print("\n [INFO] Initializing face capture. Look the camera and wait ...")
# 初始化单个采样面计数
count = 0
while(True):
    ret, img = cam.read()
    img = cv2.flip(img, 1) # flip video image vertically
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)     
        count += 1
        # 将捕获的图像保存到数据集文件夹中
        cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])#文件夹名在此处
        cv2.imshow('image', img)
    k = cv2.waitKey(100) & 0xff # 摁esc退出
    if k == 27:
        break
    elif count >= 30: # 取30张人脸样本并停止视频
         break
# 做一些清理
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

输入只能为0,1,2,3,4,5分别对应5个人脸

运行后输入数字就可以看到dataset中有30张黑白人脸照片

2、训练opencv识别器

得安装确认 Rpi 上是否安装了 PIL 库。如果没有,请在终端中运行以下命令

pip install pillow

建立名为 trainer文件夹用来存放训练结果

import cv2
import numpy as np
from PIL import Image
import os
# 人脸图像数据库的路径
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
# 用于获取图像和标签数据的函数
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]     
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L') # 将其转换为灰度
        img_numpy = np.array(PIL_img,'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        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))
# 将模型保存到 trainer/trainer.yml 中
recognizer.write('trainer/trainer.yml') # recognizer.save函数在 Mac 上工作,但在 Pi 上不起作用
# 打印经过训练的面孔数量并结束程序
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

执行完人脸采样必须执行训练opencv识别器。

3、识别器

import cv2
import numpy as np
import os 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#启动式 ID 计数器
id = 0
# id名称
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] 
# 初始化并开始实时视频捕获
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
# 定义要识别为人脸的最小窗口大小
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:
    ret, img =cam.read()
    img = cv2.flip(img, 1) 
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    faces = faceCascade.detectMultiScale(    #faces的值为人脸的坐标
        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])#捕获人脸返回所在位置
        # 检查匹配度是否小于它们 ,100 ==>“0”的匹配度 
        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)#显示id名
        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
# 做一些清理
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

id0对应的是None,id1对应的是marcelo以此内推,可以改变。

个人学习日志——树莓派实时人脸识别项目

个人学习日志——树莓派实时人脸识别项目

 识别度小于百分之0则会输出unknown。

修改为程序添加功能

将陌生人框为红色

程序稍微修改下,将不认识的人用红色方框框出。

 for(x,y,w,h) in faces:
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
        # 检查匹配度是否小于它们 ,100 ==>“0”的匹配度 
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))#显示百分比匹配度
            cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)#显示绿色方框
        else:
            id = "unknown"#否则输出不认识
            confidence = "  {0}%".format(round(100 - confidence))#显示百分比匹配度
            cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)#显示红色方框

个人学习日志——树莓派实时人脸识别项目

实现终端输出人脸数量

思路:在循环开始时定义一个整型变量dex初值为0,只要检测到人dex就加1,一次循环一次就输出一次。

import cv2
import numpy as np
import os

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
# 启动式 ID 计数器
id = 0
# id名称
names = ['None', 'LFM', 'LJ', 'Ilza', 'Z', 'W']
# 初始化并开始实时视频捕获
cam = cv2.VideoCapture(0)
cam.set(3, 640)  # set video widht
cam.set(4, 480)  # set video height
# 定义要识别为人脸的最小窗口大小
minW = 0.1 * cam.get(3)
minH = 0.1 * cam.get(4)
while True:
    dex1 = 0#定义熟人计数变量
    dex2 = 0#定义陌生人计数变量
    ret, img = cam.read()
    img = cv2.flip(img, 1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(  # faces的值为人脸的坐标
        gray,
        scaleFactor=1.2,
        minNeighbors=5,
        minSize=(int(minW), int(minH)),
    )
    for (x, y, w, h) in faces:

        id, confidence = recognizer.predict(gray[y:y + h, x:x + w])  # 捕获人脸返回所在位置
        # 检查匹配度是否小于它们 ,100 ==>“0”的匹配度
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))  # 显示百分比匹配度
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 显示方框
            dex1 += 1#熟人加一
        else:
            dex2 += 1#陌生人加一
            id = "unknown"  # 否则输出不认识
            confidence = "  {0}%".format(round(100 - confidence))  # 显示百分比匹配度
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 显示方框

        cv2.putText(img, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)  # 显示id名
        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (255, 255, 0), 1)  # 显示匹配度

    cv2.imshow('camera', img)
    print("'熟人'{}个,'陌生人'{}个",format(dex1), format(dex2))#输出检测检测到的人脸个数
    k = cv2.waitKey(10) & 0xff  # Press 'ESC' for exiting video
    if k == 27:
        break
# 做一些清理
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

运行了一下都正常,就是树莓派的那个软件里显示不了中文

个人学习日志——树莓派实时人脸识别项目

 没毛病,也可以吧输出换成别的

将我的两个室友都会识别成我,不会显示unknown,准确度太低了,采集照片的多少也与人脸识别没啥太多关系,但可以通过调匹配度来控制人物的识别,但也没有太大的提升。

学习总结

树莓派的基本配置,了解了python程序的内部结构,函数库的安装,函数库的使用。在此次项目中遇到了各种大大小小的问题,还好网上都能找到解决方案。文章来源地址https://www.toymoban.com/news/detail-442840.html

到了这里,关于个人学习日志——树莓派实时人脸识别项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于树莓派的人脸识别门禁系统

    1、概述:本次在树莓派上安装Opencv及其扩展模块,考虑到树莓派的SD卡容量和内存的限制,不采用直接pip安装方法,而采用编译Opencv源码的方式进行安装。 2、遇到的问题及解决方法 遇到的问题 解决方法 缺少”cuda.hpp” 将/home/pi/opencv_contrib3.4.1/modules/xfeatures2d/include/opencv2下的

    2023年04月19日
    浏览(45)
  • 树莓派之人脸识别与智能家居

    访问【WRITE-BUG数字空间】_[内附完整源码和文档] 树莓派加上摄像头之后就可以拍照、录视频等各种功能了,这样做一个树莓派相机已经是非常简单的事情了。我们在这里做一个简单的人脸区域检测的功能实验,然后我们在下一个实验让树莓派来控制风扇转动。发现有人脸了,

    2024年02月11日
    浏览(45)
  • Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

    ​ 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理 :首先,对输入图像进行预处理,包括读取图片、将图片灰度转换、修改图片的尺寸、绘制矩形

    2024年04月13日
    浏览(64)
  • 【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(一)

    ​ 活动地址:CSDN21天学习挑战赛 经过前段时间研究,从LeNet-5手写数字入门到最近研究的一篇天气识别。我想干一票大的,因为我本身从事的就是C++/Qt开发,对Qt还是比较熟悉,所以我想实现一个基于Qt的界面化的一个人脸识别。 对卷积神经网络的概念比较陌生的可以看一看

    2024年02月04日
    浏览(55)
  • 【深度学习】基于卷积神经网络(tensorflow)的人脸识别项目(四)

    经过前段时间研究,从LeNet-5手写数字入门到最近研究的一篇天气识别。我想干一票大的,因为我本身从事的就是C++/Qt开发,对Qt还是比较熟悉,所以我想实现一个界面化的一个人脸识别。 对卷积神经网络的概念比较陌生的可以看一看这篇文章:卷积实际上是干了什么 想了解

    2024年01月17日
    浏览(150)
  • 深度学习毕设项目 深度学习 python opencv 实现人脸年龄性别识别

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月03日
    浏览(56)
  • 人脸识别实战之基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型

    进行人脸识别首要的任务就是要定位出画面中的人脸,这个任务就是人脸检测。人脸检测总体上算是目标检测的一个特殊情况,但也有自身的特点,比如角度多变,表情多变,可能存在各类遮挡。早期传统的方法有Haar Cascade、HOG等,基本做法就是特征描述子+滑窗+分类器,随

    2024年02月04日
    浏览(43)
  • 基于开源模型搭建实时人脸识别系统(四):人脸质量

    续人脸识别实战之基于开源模型搭建实时人脸识别系统(三):人脸关键点、对齐模型概览与模型选型_CodingInCV的博客-CSDN博客 不论对于静态的人脸识别还是动态的人脸识别,我们都会面临一个问题,就是输入的人脸图像的质量可能会很差,比如人脸角度很大,人脸很模糊,

    2024年02月11日
    浏览(42)
  • 基于开源模型的实时人脸识别系统

    目录 背景 效果 实现功能 系列预计写得一些内容 整体框架 代码结构 软件使用说明 注册人员 打开输入源 打开视频文件 打开USB摄像头 打开IP摄像头(rtsp) 输出说明 数据说明 人脸识别已经发展了很多年,随着深度学习发展,开源的模型也有很不错的效果了。我们可以在不需

    2024年02月12日
    浏览(52)
  • 【K210开发板】人脸识别+ SD卡断电存储 --实时按键录取人脸信息并识别

    人脸识别就是在人脸检测的基础上,除了检测人脸的位置外,还可以检测出这个人是谁(需要先对准人按按钮学习)。 先到 maixhub 按照说明下载模型, 获得模型smodel, 就是 加密版本的kmodel。下载后缀为.smodel模型需要用到机器码。机器码是 一机一码 的一种加密方式,用于模型

    2024年02月02日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包